美文网首页
mixin+login_required实现django用户登录

mixin+login_required实现django用户登录

作者: warmsirius | 来源:发表于2019-08-16 19:00 被阅读0次

    写在前面

    项目中,在用户的个人中心的时候,需要用户登录才能进行其他操作,所以这里需要用到用户登录装饰器,下面提供了两种方法

    • 直接使用auth模块的login_required
    • 使用mixin继承类

    auth模块的 login_required

    auth模块已经有用户装饰器了,方法名为login_required,使用方法如下:

    • 方法一:直接在urls.py中的CBV视图前面添加
    #  urls.py
    
    
    from django.contrib.auth.decorators import login_required
    
    re_path('order', login_required(UserOrderView.as_view()), name='order'),  # 用户中心-订单页
    re_path('address', login_required(UserAddressView.as_view()), name='address'),  # 用户中心-地址页
    re_path('$', login_required(UserInfoView.as_view()), name='info'),  # 用户中心-信息页
    
    • 方法二:在views.py中CBV添加login_required
    from django.contrib.auth.decorators import login_required
    
    # 方法1:加在类上面,将装饰器当参数传给method_decorator,然后指定要装饰的方法名
    @method_decorator(login_required, name='get')
    @method_decorator(login_required, name='post')
    class Order(View):
        def get(self, request, *args, **kwargs):
            return HttpResponse('订单详情。。。')
    
        def post(self, request, *args, **kwargs):
            return HttpResponse('ok')
    
    # 方法二,直接在方法上加装饰器,将装饰器当做参数传给method_decorator
    class Order(View):
        @method_decorator(login_required)
        def get(self, request, *args, **kwargs):
            return HttpResponse('订单详情。。。')
    
        @method_decorator(login_required)
        def post(self, request, *args, **kwargs):
            return HttpResponse('ok') 
    

    使用mixin多继承实现

    • 实现一个Mixin类,重写as_view方法,并定义为类方法(相当于重写View中的as_view),在as_view方法中调用父类的as_view方法,然后将该方法包上login_required函数。

    • 预留1个问题:

    # mixin.py
    
    
    from django.contrib.auth.decorators import login_required
    
    
    class LoginRequiredMixin(object):
        @classmethod
        def as_view(cls, **initkwargs):
            # 调用父类的as_view
            view = super(LoginRequiredMixin, cls).as_view(**initkwargs)
            return login_required(view)
    
    • 在视图函数中的CBV中首先继承 Mixin类,再继承View类
    # views.py
    
    
    # /user
    class UserInfoView(LoginRequiredMixin, View):
        '''用户中心-信息页'''
        def get(self, request):
            '''显示'''
            # page = 'user'
            return render(request, 'df_user/user_center_info.html', {'page': 'user'})
    

    总结

    • 第一次使用 mixin 继承类,对于CBV的视图很方便
    • login_required是django的auth模块提供的登录装饰器

    相关文章

      网友评论

          本文标题:mixin+login_required实现django用户登录

          本文链接:https://www.haomeiwen.com/subject/usaqsctx.html