我正在尝试使用Django和allauth尝试创建登录页面。
我能够成功登录并将用户重定向到LOGIN_REDIRECT_URL(=“/ users / {id} / mypage”)页面。我有/ users / {id} / mypage的单独视图,名为views.py中定义的UserHomePageView:
from django.views.generic import TemplateView
class UserHomePageView(TemplateView):
template_name = "user_homepage.html"
我想要一种安全措施来阻止任何人(基本上是非登录用户)导航到“/ users / {id} / mypage”(例如/ users / 5 / mypage)。 e.i如果未经身份验证的用户尝试导航到/ users / 5 / mypage,他/她应该被重定向到登录页面/主页。
基本上,我如何呈现未经身份验证的用户来查看针对经过身份验证的用户的页面(我不想使用模板标签users.authenitcated,但希望覆盖TemplateView)
答案 0 :(得分:5)
通常使用的另一种解决方案是使用dispatch
装饰器修饰login_required
方法:
from django.utils.decorators import method_decorator
from django.contrib.auth.decorators import login_required
class UserHomePageView(TemplateView):
template_name = "user_homepage.html"
@method_decorator(login_required)
def dispatch(self, *args, **kwargs):
return super(UserHomePageView, self).dispatch(*args, **kwargs)
这样做的好处是它适用于所有方法(get,post,put等),并且使用login_required
装饰器比明确检查request.user.is_authenticated
和重定向更干。
答案 1 :(得分:0)
我找到了答案......
通过覆盖get()并使用self.request.user.is_authenticated()
class UserHomePageView(TemplateView):
template_name = "user_homepage.html"
redirect_field_name = "next"
def get(self, request, *args, **kwargs):
'''
Overriding TemplateView.get() in order to
prevent unauthorized user to view UserHomePageView
'''
# Redirect to Homepage if user is not signed in
if not self.request.user.is_authenticated():
return redirect(self.get_redirect_url())
# Process normally if User is signed in
context = self.get_context_data(**kwargs)
return self.render_to_response(context)