Python 如何使Django通用视图仅可供登录用户访问?

Python 如何使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(

我已经为谷歌实现了社交认证,用户可以登录。我无法理解如何限制访问者访问UpdateView、ListView或CreateView等通用视图,如果他们没有使用social auth系统登录。这是代码

视图.py

home.html


家
{%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