mixin+login_required实现django用户登录
2019-08-16 本文已影响0人
warmsirius
写在前面
项目中,在用户的个人中心的时候,需要用户登录才能进行其他操作,所以这里需要用到用户登录装饰器,下面提供了两种方法
- 直接使用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个问题:
- super(LoginRequiredMixin, cls).as_view(**initkwargs)中 LoginRequiredMixin 的父类是object,那么它父类哪里来的as_view方法呢?
- 解释文章:mixin类中super()到底继承谁的方法?
# 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模块提供的登录装饰器