1、类视图
类视图是采用面向对象的思路
- 定义类视图
① 继承自django.views的View。
② 不同的请求方式有不同的业务逻辑.类视图的方法就直接采用http请求名字作为函数名,如,get,post,put,patch,delete,head,options,trace等。
③ 类视图的第一个参数固定为self,第二个参数必须是请求实例对象request。类视图的方法,必须有返回值,返回值是HttpResponse及其子类。 - 类视图的url引导
① url第一个参数是正则,login/。
② 第二个参数是个视图函数名 LoginView.as_view()
定义类视图
from django.views import View
class LoginView(View):
def get(self, request):
return HttpResponse('get')
def post(self, request):
return HttpResponse('post')
def put(self, request):
return HttpResponse('put')
def OOOO(self, request): # 函数名不是http协议
return HttpResponse('OOOO')
类视图定义路由
from django.urls import re_path
from book.views import login, index, detail, set_cookie, get_cookie,set_session,get_session,LoginView,CenterView
app_name = 'book'
urlpatterns = [
re_path('^get_session/$', get_session, name='get_cookie'),
re_path('^login/$', LoginView.as_view()),
re_path('^center/$', CenterView.as_view()),
]
类视图的多继承
"""
业务需求:
个人中心页面 -- 必须登录才能显示
GET 展示个人中心
POST 实现个人中心信息的修改
"""
from django.contrib.auth.mixins import LoginRequiredMixin
class CenterView(LoginRequiredMixin, View):
"""
两个父类按MRO的顺序,也可以理解为业务流程
登录个人中心首先需要验证是否登录,django的LoginRequireMixin封装好了验证方法
如果检测到没有登录,会自动跳转到 http://127.0.0.1:8000/accounts/login/?next=/center/
"""
def get(self, request):
return HttpResponse('个人中心展示')
def post(self, request):
return HttpResponse('个人信息修改')
from django.urls import re_path
from book.views import login, index, detail, set_cookie, get_cookie,set_session,get_session,LoginView,CenterView
app_name = 'book'
urlpatterns = [
re_path('^get_session/$', get_session, name='get_cookie'),
re_path('^login/$', LoginView.as_view()),
re_path('^center/$', CenterView.as_view()),
]
2、中间件
Django中的中间件是一个轻量级底层的插件系统,可以介入 Django的请求和响应处理过程,修改Django的输入或输出。中间件的设计为开发者提供了一种无侵入式的开发方式,增强了 Django框架的健壮性。
我们可以使用中间件,在 Django处理视图的不同阶段对输入或输出进行干预
中间件文档:https://docs.djangoproject.com/en/3.2/topics/http/middleware/
中间件的定义方法:
- 定义一个中间件工厂函数,然后返回一个可以被调用的中间件。
- 中间件工厂函数需要接收一个可以调用的 get_response对象
- 返回的中间件也是一个可以被用的对象,并且像视图一样需要接收一个 request对象参数,返回一个 response对象。
定义
def simple_middleware(get_response):
def middleware(request):
print('before')
response = get_response(request)
print('after')
return response
return middleware
注册
执行结果:http://localhost:8000/set_session/?username=yuan&pass=123456
多个中间件的执行顺序:
请求前:按注册顺序执行
请求后/响应后:与注册顺序相反
def simple_middleware(get_response):
def middleware(request):
print('before1111')
response = get_response(request)
print('after1111')
return response
return middleware
def simple_middleware2(get_response):
def middleware(request):
print('before2222')
response = get_response(request)
print('after22222')
return response
return middleware
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',
'book.middleware.simple_middleware',
'book.middleware.simple_middleware2',
]
中间件初始化
def simple_middleware(get_response):
print('init_1111') # 从程序运行后只执行一次
def middleware(request):
print('before1111')
response = get_response(request)
print('after1111')
return response
return middleware
中间件实例说明
# -*- encoding: utf-8 -*-
"""
中间件的作用:每次请求和响应的时候都会调用
中间件的定义:嵌套视图函数
中间件的注册:在settings.py的MIDDLEWARE=[]列表中添加 'book.middleware.simple_middleware',
中间件的使用举例:可以判断每次请求中是否携带了cookie的某些信息
"""
from django.http import HttpResponse
def simple_middleware(get_response):
# 这里是中间件第一次调用执行的地方,程序启动,首次发送请求会执行一次,以后的请求不会执行
print('init___middleware')
def middleware(request):
# 这里是请求前
print('before request')
username = request.COOKIES.get('username')
if username is None:
print('usename is None!')
# return HttpResponse('亲,你没有登录啊!')
else:
print(username)
response = get_response(request)
# 这里是响应后/请求后
print('after response/request')
return response
return middleware
标签:get,request,middleware,中间件,视图,Django,response From: https://www.cnblogs.com/zhoubai/p/17156392.html