多继承和MRO的顺序
Python, C++ 都是多继承。
做一个下单页面,要在登录了以后才能看到。
以前学过,要验证用户登录状态,有一个装饰器,但是,那是在 def 函数 使用的。比如这样:
from django.contrib.auth.decorators import login_required
@login_required
def set_password(request):
if request.is_ajax():
back_dic = {'code': 1000, 'msg': ''}
return JsonResponse(back_dic)
现在,我们要在 类视图 使用。
from django.contrib.auth.mixins import LoginRequiredMixin
class OrderView(LoginRequiredMixin, View):
def get(self, request):
return HttpResponse('GET--订单页面,必须登录')
def post(self, request):
return HttpResponse('POST--订单页面,必须登录')
分析 源码:
class LoginRequiredMixin(AccessMixin):
"""Verify that the current user is authenticated."""
def dispatch(self, request, *args, **kwargs):
if not request.user.is_authenticated:
return self.handle_no_permission()
return super().dispatch(request, *args, **kwargs)
request.user --> 请求用户的信息
is_authenticated --> 判断用户是否登录
- 当我们在浏览器输入 http://127.0.0.1:8000/order/,
- 后台会对路由进行引导匹配 path(‘order/’, views.OrderView.as_view())
- 这时候会调用 as_view() 方法,as_view 会调用 view(源码)方法,view 又调用 dispatch,
dispatch会进行判断,再进行路由判断。 - 如果是 class OrderView(View, LoginRequiredMixin), View在前面的话,需要注意
继承父类的顺序 mro属性
在 PyCharm 的 Terminal 里写:
python manage.py shell
>>> from book.views import OrderView
>>> OrderView.__mro__
(<class 'book.views.OrderView'>, <class 'django.contrib.auth.mixins.LoginRequiredMix
in'>, <class 'django.contrib.auth.mixins.AccessMixin'>, <class 'django.views.generic
.base.View'>, <class 'object'>)
>>>
中间件
Django 中的中间件是一个轻量级、底层的插件系统,可以介入 Django 的请求和响应处理过程,
修改 Django 的输入或者输出,中间件是一种无侵入式的开发方式。(相当于一个大坝)
Django 在中间件中预置了六个方法:
1、初始化方法
def __init__(self, get_response=None):
pass
2、处理请求之前
def process_request(self, request):
pass
3、处理视图之前
def process_view(self, request, view_func, view_args, view_kwargs):
pass
4、处理模板响应之前
def process_template_response(self, request, response):
pass
5、处理响应之后
def process_response(self, request, response):
pass
6、(视图)异常处理
def process_exception(self, request, exception):
pass
我们要做一个自己的中间件,在哪里写代码都可以的,但是为了解耦合,新建mymiddleware.py
from django.utils.deprecation import MiddlewareMixin
class TestMiddleWare(MiddlewareMixin):
def process_request(self, request):
print('每次请求之前都调用执行')
def process_response(self, request, response):
print('每次响应前都调用执行')
return response
然后到 settings.py 里注册中间件
'book.mymiddleware.TestMiddleWare'
中间件能够做什么?
比如在中间件验证用户是否存在,返回注册页面或者登录页面:
class TestMiddleWare(MiddlewareMixin):
def process_request(self, request):
print('每次请求之前都调用执行')
username = request.COOKIE.get('name')
if username is None:
return redirect('/register/')
中间件执行顺序:
所有中间件里面的 process_request 从上到下执行后
然后 process_response 从下到上 执行