###Django核心知识点(类视图,中间件)
###1.类视图
####1.1类视图的好处:
1.代码可读性好
2.类视图相对于函数视图有更⾼的复⽤性,如果其他地⽅需要⽤到某个类视图的某个特定逻辑,直接继承该类视图即可
####定义路由部分
urlpatterns = [
# 注意:
# url(路径, 执⾏的函数)
# url的第⼆个参数需要是⼀个函数
# 我们这⾥如果传⼊: views.RegisterView 会发现这个是⼀个类, 不是⼀个函数,
# 所以我们需要调⽤系统给我们提供的 as_view()⽅法
url(r'^registerview/$',views.RegisterView.as_view())
]
####注意点:
1.如果我们在类视图函数中没有定义⽅法, 但是我们请求了. 会报405找不到请求⽅法的错误. 例如: 类视图中没有定义Get⽅法, 但是我们使⽤Get⽅法进⾏了请求, 那么会报405的错误: 找不到对应的请求⽅ 法.
2.在类视图中定义的 Get 或者是 POST 都是对象⽅法, 第⼀个参数都是self.
3.第⼆个参数⼀般情况下都是 request对象. 其他的参数依次往后⾯写就可以
4.我们在使⽤类视图的时候, 需要在路由位置进⾏设置, 设置的第⼆个参数需要是⼀个函数, 所以我们这⾥调⽤了类以 后, 后⾯需要调⽤ as_view()函数
####1.2类视图使用装饰器
#####1.2.1在URL配置中装饰
# 导⼊views.py视图⽂件 from .
import views
urlpatterns = [
#我们在路由部分,把定义好的装饰器添加到当前的函数上
#这⾥需要注意:as_view()会返回⼀个view()函数
#所以我们把装饰器添加到view()函数上.
url(r'^demo/$',views.my_decorate(views.DemoView.as_view()))
]
####弊端:
- 此种⽅式最简单,但因装饰⾏为被放置到了url配置中,单看视图的时候⽆法知道此视图还被添加了装饰器, 不利于代码的完整性,不建议使⽤。
- 此种⽅式会为类视图中的所有请求⽅法都加上装饰器⾏为(因为是在视图⼊⼝处,分发请求⽅式前)。
#####第一种解决方式:
from django.views.generic import View
# 导⼊转换的装饰器⽅法:
from django.utils.decorators import method_decorator
# 为特定请求⽅法添加装饰器
class DemoView(View):
# 使⽤转换的⽅法将装饰器转化:
@method_decorator(my_decorator)
def get(self,request):
print('get⽅法')
return HttpResponse('ok')
def post(self, request):
print('post⽅法')
return HttpResponse('ok')
#####第二种解决方式:
# 类视图
class DemoView(View):
# 重写⽗类的dispatch⽅法, 因为这个⽅法被as_view()中的view()调⽤
# 所以我们对这个⽅法添加装饰器,也就相当于对整个类视图的⽅法添加装饰器.
@method_decorator(my_decorator)
def dispatch(self,request,*args,**kwargs):
# 重写⽗类的这个⽅法我们不会修改它的任何参数,所以我们直接调⽤⽗类的这个⽅法即可
# 它⾥⾯的参数我们也不动它, 直接还传递过去.
return super().dispatch(request,*args,**kwargs)
def get(self,request):
print('get')
return HttpResponse('getfunc ok')
def post(self, request):
print('post')
return HttpResponse('postfunc ok')
#####第三种解决方式
# 类视图
# 给类视图增加上@method_decorator⽅法
# 增加上之后,并不能够给其中的某⼀个函数增加上装饰器
# 所以我们需要给method_decator配置第⼆个参数
# 第⼆个参数就是类中某⼀个函数的名称. 意味着给当前这个函数增加上装饰器.
@method_decorator(my_decorator, name='get')
class DemoView(View):
@method_decorator(my_decorator)
def dispatch(self, request, *args, **kwargs):
return super().dispatch(request, *args, **kwargs)
def get(self, request):
print('get')
return HttpResponse('getfunc ok')
def post(self, request):
print('post')
return HttpResponse('postfunc ok')
#####第四种解决方式
# 类视图
# 因为我们可以直接给dispatch⽅法添加装饰器,意味着,我们内部不⽤重写dispatch⽅法了.
@method_decorator(my_decorator, name='dispatch')
class DemoView(View):
def get(self,request):
print('get')
return HttpResponse('getfunc ok')
def post(self, request):
print('post')
return HttpResponse('postfunc ok')
method_decorator:method_decorator的作⽤是为函数视图装饰器补充第⼀个self参数,以适配类视图⽅,如果将装饰器本身改为可以适配类视图⽅法的,类似如下,则⽆需再使⽤method_decorator
def my_decorator(func):
def wrapper(self,request,*args,**kwargs):# 此处增加了self
print('⾃定义装饰器被调⽤了')
print('请求路径%s' % request.path)
return func(self,request,*args,**kwargs) # 此处增self
return wrapper
###2.中间件
####2.1中间件的定义⽅法
-
在⼀个⼦应⽤中创建⼀个中间件⽂件. 例如: middleware(别的名字也可以)
-
在setting.py⽂件的MIDDLEWARE部分注册添加.
-
在调⽤视图时,便会调⽤中间件了
定义⼀个中间件⼯⼚函数,然后返回⼀个可以调⽤的中间件。
中间件⼯⼚函数需要接收⼀个可以调⽤的get_response对象。
返回的中间件也是⼀个可以被调⽤的对象,并且像视图⼀样需要接收⼀个request对象参数,返回⼀个response对象
####2.2中间件模板def simple_middleware(get_response): # 此处编写的代码仅在Django第⼀次配置和初始化的时候执⾏⼀次。 def middleware(request): # 此处编写的代码会在每个请求处理视图前被调⽤。 response = get_response(request) # 此处编写的代码会在每个请求处理视图之后被调⽤。 return response return middleware
例如,在users应⽤中新建⼀个middleware.py⽂件
def my_middleware(get_response):
print('init 被调⽤')
def middleware(request):
print('before request 被调⽤')
response = get_response(request)
print('after response 被调⽤')
return response
return middleware
定义好中间件后,需要在settings.py ⽂件中添加注册中间件
MIDDLEWARE = [ 'django.middleware.security.SecurityMiddleware', 'django.contrib.sessions.middleware.SessionMiddleware', 'django.middleware.common.CommonMiddleware', # 'django.middleware.csrf.CsrfViewMiddleware', 'django.contrib.auth.middleware.AuthenticationMiddleware', 'django.contrib.messages.middleware.MessageMiddleware', 'django.middleware.clickjacking.XFrameOptionsMiddleware', 'users.middleware.my_middleware', # 添加中间件 ]
定义⼀个视图进⾏测试
def demo_view(request):
print('view 视图被调⽤')
return HttpResponse('OK')
注意:Django运⾏在调试模式下,中间件init部分有可能被调⽤两次
####2.3多个中间件的执行顺序
在请求视图被处理前,中间件由上⾄下依次执⾏
在请求视图被处理后,中间件由下⾄上依次执⾏
####2.4中间件的一些了解
Django中的中间件是⼀个轻量级、底层的插件系统,可以介⼊Django的请求和响应处理过程,修改Django的输⼊或输 出。中间件的设计为开发者提供了⼀种⽆侵⼊式的开发⽅式,增强了Django框架的健壮性。
我们可以使⽤中间件,在Django处理视图的不同阶段对输⼊或输出进⾏⼲预