Python 如何使Django通用视图仅可供登录用户访问?
我已经为谷歌实现了社交认证,用户可以登录。我无法理解如何限制访问者访问UpdateView、ListView或CreateView等通用视图,如果他们没有使用social auth系统登录。这是代码 视图.py home.htmlPython 如何使Django通用视图仅可供登录用户访问?,python,django,django-socialauth,Python,Django,Django Socialauth,我已经为谷歌实现了社交认证,用户可以登录。我无法理解如何限制访问者访问UpdateView、ListView或CreateView等通用视图,如果他们没有使用social auth系统登录。这是代码 视图.py home.html 家 {%csrf_令牌%} {%if uname%} 你好,{{uname}} 用户已登录。他可能需要注销 {%else%} 请登录 {%endif%} url.py urlpatterns=[ url(r'^$',views.IndexView.as_view(
家
{%csrf_令牌%}
{%if uname%}
你好,{{uname}}
用户已登录。他可能需要注销
{%else%}
请登录
{%endif%}
url.py
urlpatterns=[
url(r'^$',views.IndexView.as_view(),name='index'),
url(r'^Achievents/(?P[0-9]+)/delete/$,views.AchievementDelete.as_view(),name='Achievent-delete'),
url(r“^Achievents/(?P[0-9]+)/$”,views.AchievementUpdate.as_view(),name='Achievent-update'),
url(r“^Achievents/add/$”,需要登录(views.AchievementCreate.as_view()),name='Achievent-add'),
url(r“^home/$”,views.home,name='home'),]
我希望“AchievementCreate”类仅在用户登录时才可访问。但我不明白怎么做。可以使用会话吗?在这种情况下如何导入?您需要导入login\u required装饰器,并将@login\u required放在视图前面。此视图将不仅仅在登录时可访问 例如:
from django.contrib.auth.decorators import login_required
@login_required
#put your view here
我们需要编写mixin来检查用户是否登录 Django 1.9引入了LoginRequiredMixin:
from django.contrib.auth.mixins import LoginRequiredMixin
class UserProfile(LoginRequiredMixin, View):
login_url = '/login/'
下面的代码是一个自定义mixin,它将检查用户是否处于活动状态。如果用户处于非活动状态,它将注销会话。我们需要在单独的文件(如mixins.py)中编写mixin,然后在视图中导入mixin
class UserMixin(object):
def dispatch(self, request, *args, **kwargs):
user = self.request.user
if user:
if user.is_active:
return super(UserMixin, self).dispatch(request, *args, **kwargs)
else:
logout(self.request)
return HttpResponseRedirect(reverse('cv:home'))
In Views.py
from mixins.py import UserMixin
class UserEdit(UserMixin, View):
model = UserProfile
template_name = "dashboard/edit_user.html"
因此,您的登录系统使用的是“social auth”。在您的情况下,必须使用自定义函数。我假设您可以通过以下方式访问登录用户:
request.SESSION
如果是,则可以覆盖CreateView的分派方法:
class AchievementCreate(CreateView):
.....
.....
def dispatch(self, request, *args, **kwargs):
user = request.session['_auth_user_id']
# handle authentication
所需的
登录\u
装饰程序不工作?不工作。它不是。你是在views.py中使用它,还是在url.py中的视图前面使用它?我使用了它,它工作了@方法decorator(需要登录)def dispatch(self,*args,**kwargs):返回super(AchievementCreate,self)。dispatch(*args,**kwargs)是否有任何方法可以访问泛型视图类中的“request.session['uname']”?我使用django中的auth_用户模型,只需调用request.user。
当我尝试这样做时,“未定义全局名称‘请求’”。
class UserMixin(object):
def dispatch(self, request, *args, **kwargs):
user = self.request.user
if user:
if user.is_active:
return super(UserMixin, self).dispatch(request, *args, **kwargs)
else:
logout(self.request)
return HttpResponseRedirect(reverse('cv:home'))
from mixins.py import UserMixin
class UserEdit(UserMixin, View):
model = UserProfile
template_name = "dashboard/edit_user.html"
class AchievementCreate(CreateView):
.....
.....
def dispatch(self, request, *args, **kwargs):
user = request.session['_auth_user_id']
# handle authentication
def home(request):
if request.user.is_authenticated:
# Do something for authenticated users
else:
# Do something for anonymous users