Группа URL Django только для аутентифицированных пользователей

#python #django

#python #django

Вопрос:

Я пытаюсь создать веб-проект Django, и есть несколько пользовательских серверных приложений, где каждый URL (просмотр) предназначен только для аутентифицированных пользователей. Я могу написать условие в каждом представлении, например:
User/urls.py

 urlpatterns = patterns('',
   url(r'^settings/', 'User.views.user_settings'),
   url(r'^profile/', 'User.views.profile'),
   #Other User Admin panel Urls
)
  

User/views.py

 def user_settings(request):
    if request.user is None:
       return redirect('/login')
    #Some other code

def profile(request):
    if request.user is None:
       return redirect('/login')
    #Some other code
  

Как вы можете видеть, это не очень хорошо закодировано, но работает нормально.
Единственное, что я хочу знать, возможно ли добавить какое-либо условие дляurls.py запишите все URL-адреса, чтобы не добавлять одинаковые строки кода в каждую функцию просмотра.

Например, в фреймворках Symfony, Laravel и Yii есть что-то подобное тому, что я хочу сделать. Возможно ли это в Django ? 🙂

Отредактировано здесь

С @login_required мне нужно добавить это для каждого представления, мне нужно что-то для всех URL-адресов, например:
В Symfony Framework я могу написать, { path: ^/myPage, roles: AUTHENTICATED } и каждый URL, подобный этому /myPage/someUrl , будет запрошен для аутентификации.
Я считаю, что у Django есть что-то подобное 🙂

Спасибо.

Ответ №1:

Ну, если вы используете представление на основе классов, вам будет проще добавить @login_required. Например, вы можете создать представление на основе класса здесь:

 class BaseView(TemplateView):
   @method_decorator(login_required)
   def dispatch(self, request, *args, **kwargs):
        return super(BaseView, self).dispatch(*args, **kwargs)
  

Теперь переопределяйте ее каждый раз, когда вы хотите создать новое представление. Например:

 class SettingsView(BaseView):
     def get(request):
        return (...)
  

Он будет проверять каждый раз при отправке URL-адреса, вошел ли пользователь в систему.

Кроме того, если вы используете представление на основе классов, вы можете переопределить get() , чтобы проверить, аутентифицирован ли пользователь.

 class BaseView(TemplateView):
   template_name= None
   role= None
   def get(self, request, *args, **kwargs):
        if request.user is not None and role is "AUTHENTICATE":    
            return super(BaseView, self).get(request, *args, **kwargs)
        else:
            raise Exception('user is not logged in')
  

urls.py:

    url(r'^settings/', BaseView.as_view(template_name='/sometemplate', role="AUTHENTICATE")
  

Комментарии:

1. Спасибо за ответ. Это действительно полезно 🙂

Ответ №2:

Вы можете использовать @login_required декоратор: https://docs.djangoproject.com/en/1.5/topics/auth/default/#the-login-required-decorator

Из документов:

login_required() выполняет следующее:

Если пользователь не вошел в систему, перенаправьте в настройки.LOGIN_URL, передающий текущий абсолютный путь в строке запроса. Пример: /accounts/login/?next=/polls/3/.

Если пользователь вошел в систему, выполните просмотр в обычном режиме. Код просмотра может свободно предполагать, что пользователь вошел в систему.

 from django.contrib.auth.decorators import login_required

@login_required
def my_view(request):
   ...
  

Ответ №3:

Вы могли бы использовать это:https://docs.djangoproject.com/en/1.6/topics/auth/default/#the-login-required-decorator

 from django.contrib.auth.decorators import login_required

@login_required
def my_view(request):
    ...