文章目录
django中间件
1.基本中间件
在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',
]
2.自定义中间件
process_request(self,request) # 作用在请求被路由处理之前
process_view(self, request, view_func, view_args, view_kwargs) # 作用在视图渲染之前
process_exception(self, request, exception) # 作用在异常处理之前
process_response(self, request, response) # 作用在响应之前
(0)注册中间件
修改settings.py
MIDDLEWARE = [
······
'middlewaretest.middlewares.MyMiddleware',
]
(1)定义middlewares.py
class MyMiddleware(MiddlewareMixin):
def process_request(self, request):
print("MyMiddleware process_request 方法:", id(request)) #在视图之前执行
def process_response(self,request, response): #基于请求响应
print("MyMiddleware process_response 方法:", id(request)) #在视图之后
return response
# 在这里修改正则url传来的参数pk
def process_view(self,request, view_func, view_args, view_kwargs):
print("MyMiddleware process_view 方法:", id(request)) #在视图之前执行 顺序执行
print("view_func: ",view_func.__name__)
print("view_args: ",view_args)
print("view_kwargs: ", view_kwargs)
# 这里hook修改特定的视图函数
if view_func.__name__=='book_detail':
view_kwargs['pk']='1'
# return view_func(request) # 这里return的话,会替代掉原有的视图函数
def process_exception(self, request, exception):#引发错误 才会触发这个方法
print("MyMiddleware process_exception 方法:")
# return HttpResponse(exception) #返回错误信息
(2)重点看看process_view
结合后文中的正则url传参,链接: (django)10 django restful api
url(r'^api/book/(?P<pk>[0-9]+)$', book_detail),
这个路由调用视图函数时会有一个形参pk
@api_view(['GET', 'PUT', 'DELETE'])
def book_detail(request, pk):
print("pk: ",pk)
······
在这里,可以通过hook打印出pk,效果如图:
django 视图
1.基于函数的视图
from django.shortcuts import render,HttpResponse
def login(request):
# 如果是GET方式
if request.method=='GET':
return HttpResponse("GET请求的响应")
# 如果是POST方式
user = request.POST.get("user")
pwd = request.POST.get("pwd")
if user == "alexw" and pwd == "alexw123":
return HttpResponse("认证成功的POST!!!")
else:
return HttpResponse("认证失败的POST。。。")
效果
2.基于类的视图
from django.shortcuts import render,HttpResponse
from django.views import View
# Create your views here.
class Login(View):
def get(self,request):
return HttpResponse("GET请求的响应")
def post(self,request):
user = request.POST.get("user")
pwd = request.POST.get("pwd")
if user == "alexw" and pwd == "alexw123":
return HttpResponse("认证成功的POST!!!")
else:
return HttpResponse("认证失败的POST。。。")
- 需要继承View基类