#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):
...