django---05---响应和中间件

£神魔★判官ぃ 2022-12-01 14:27 34阅读 0赞

一:响应:
1:常见的响应:
HttpResponse():响应多种数据类型
JsonResponse():响应JSON
redirect():重定向
render():渲染并响应HTML模板

2:HttpResponse():
格式:response = HttpResponse(content=响应体, content_type=响应体数据类型,默认为text/html, status=状态码,默认为200)
Django提供了一系列HttpResponse的子类,可以快速设置状态码

  1. HttpResponseRedirect 默认响应状态码为 301
  2. HttpResponsePermanentRedirect 默认响应状态码为 302
  3. HttpResponseNotModified 默认响应状态码为 304
  4. HttpResponseBadRequest 默认响应状态码为 400
  5. HttpResponseNotFound 默认响应状态码为 404
  6. HttpResponseForbidden 默认响应状态码为 403
  7. HttpResponseNotAllowed 默认响应状态码为 405
  8. HttpResponseGone 默认响应状态码为 410
  9. HttpResponseServerError 默认响应状态码为 500

3:JsonResponse():响应JSON:
函数的作用:

  1. 1:帮助我们将响应的数据转换为JSON字符串
  2. 2:设置响应头Content-Type application/json
  3. # 构造响应信息:
  4. class JSONResponseView(View):
  5. def get(self,request):
  6. dict_data = {
  7. 'username':"任善文",
  8. 'age':'23'
  9. }
  10. return http.JsonResponse(dict_data)
  11. path("response/",views.JSONResponseView.as_view()),

4:redirect():重定向
需求:
准备一个用于处理用户登录类视图LoginRedirectView。
访问LoginRedirectView时,如果其中的登录逻辑处理完成,我们将用户重定向到首页。

  1. class IndexView(View):
  2. def get(self,request):
  3. return http.HttpResponse("假定这是个首页")
  4. class LoginView(View):
  5. def post(self,request):
  6. return redirect('/index/')
  7. path("index/",views.IndexView.as_view()),
  8. path("login/",views.LoginView.as_view()),

5:反向解析:
我们定义的路由中的地址是否可能会做修改?
如果我们定义的路由中的地址在某次开发新版本时被修改了,那么重定向的地方是否也需要跟着改变?
如果该地址被很多地方都用到了,那么是否就意味着我们要修改代码的很多地方?

答案:路由反向解析
路由反向解析 是使用路由的别名,动态的解析出该路由中的真实地址

格式:
总路由起别名:
path(“ ‘’, include((‘子路由’, ‘子应用名字’), namespace=‘总路由别名,可以随便命名’)),
子路由起别名:
path(‘index/’, views.IndexView.as_view(), name=‘index’),

案例:
1:总路由起别名:path("",include(("request_response.urls","request_response"),namespace="request_response"))
2:子路由起别名:

  1. path("index/",views.IndexView.as_view(),name="index"),

3:视图中使用别名:

  1. lass LoginView(View):
  2. def post(self,request):
  3. ret_str = reverse("request_response:index")
  4. return redirect(ret_str)

二:中间件:
**Django中的中间件是一个轻量级、底层的插件系统,可以介入Django的请求和响应处理过程,修改Django的输入或输出。中间件的设计为开发者提供了一种无侵入式的开发方式,增强了Django框架的健壮性,其它的MVC框架也有这个功能。**当某些操作在每次请求或响应时都会执行时,可以写在中间件中。比如,每次发送post请求都要进行CSRF验证,就把CSRF验证的代码写在中间件中。

中间件的方法:
2.2 处理请求前的方法:(重要)
在处理每个请求前,自动调用,返回None或HttpResponse对象

  1. def process_request(self, request):

2.3 处理视图前的方法:(重要)
在处理每个视图前,自动调用,返回None或HttpResponse对象

  1. def process_view(self, request, view_func, view_args, view_kwargs):

2.4 处理模板响应前的方法:
在处理每个模板响应前,自动调用,返回实现了render方法的响应对象

  1. def process_template_response(self, request, response):

2.5 处理响应后的方法:(重要)
在每个响应返回给客户端之前,自动调用,返回HttpResponse对象

  1. def process_response(self, request, response):

2.6 异常处理:
当视图抛出异常时,自动调用,返回一个HttpResponse对象

  1. def process_exception(self, request,exception):

三:自定义中间件:
1:定义中间件类:
2:注册自定义的中间件:

  1. # 导入中间件的父类
  2. from django.utils.deprecation import MiddlewareMixin
  3. class TestMiddleware1(MiddlewareMixin):
  4. """自定义中间件"""
  5. def process_request(self, request):
  6. """处理请求前自动调用"""
  7. print('process_request1 被调用')
  8. def process_view(self, request, view_func, view_args, view_kwargs):
  9. # 处理视图前自动调用
  10. print('process_view1 被调用')
  11. def process_response(self, request, response):
  12. """在每个响应返回给客户端之前自动调用"""
  13. print('process_response1 被调用')
  14. return response
  15. MIDDLEWARE = [
  16. 'django.middleware.security.SecurityMiddleware',
  17. 'django.contrib.sessions.middleware.SessionMiddleware',
  18. 'django.middleware.common.CommonMiddleware',
  19. # 为保证非GET请求(POST, PUT, DELETE)可以正常接收,该中间件需要注释掉
  20. # 'django.middleware.csrf.CsrfViewMiddleware',
  21. 'django.contrib.auth.middleware.AuthenticationMiddleware',
  22. 'django.contrib.messages.middleware.MessageMiddleware',
  23. 'django.middleware.clickjacking.XFrameOptionsMiddleware',
  24. 'middlewares.TestMiddleware1', # 注册自定义的中间件1
  25. ]

四:多个中间件执行流程测试:
假如定义两个上面的中间件:

  1. from django.utils.deprecation import MiddlewareMixin
  2. class TestMiddleware1(MiddlewareMixin):
  3. def __init__(self, get_response=None):
  4. print("中间件1的初始化")
  5. super().__init__(get_response)
  6. """自定义中间件"""
  7. def process_request(self, request):
  8. """处理请求前自动调用"""
  9. print('process_request1 被调用')
  10. def process_view(self, request, view_func, view_args, view_kwargs):
  11. # 处理视图前自动调用
  12. print('process_view1 被调用')
  13. def process_response(self, request, response):
  14. """在每个响应返回给客户端之前自动调用"""
  15. print('process_response1 被调用')
  16. return response
  17. class TestMiddleware2(MiddlewareMixin):
  18. def __init__(self, get_response=None):
  19. print("中间件2的初始化")
  20. super().__init__(get_response)
  21. """自定义中间件"""
  22. def process_request(self, request):
  23. """处理请求前自动调用"""
  24. print('process_request2 被调用')
  25. def process_view(self, request, view_func, view_args, view_kwargs):
  26. # 处理视图前自动调用
  27. print('process_view2 被调用')
  28. def process_response(self, request, response):
  29. """在每个响应返回给客户端之前自动调用"""
  30. print('process_response2 被调用')
  31. return response
  32. 'middlewares.TestMiddleware1', # 注册自定义的中间件1
  33. 'middlewares.TestMiddleware2', # 注册自定义的中间件2

测试结果:

  1. 中间件2的初始化
  2. 中间件1的初始化
  3. process_request1 被调用
  4. process_request2 被调用
  5. process_view1 被调用
  6. process_view2 被调用
  7. process_response2 被调用
  8. process_response1 被调用

分析:
1:对于初始化来说,时间是整个django启动时就进行初始化,此时中间件逆序初始化。
2:对于请求调用来说,是顺序调用中间件。
3:对于响应调用来说,是逆序调用。
在这里插入图片描述
分析:中间件本质就是装饰器,装饰器装饰过程是先装饰距离自己近的,所以初始化顺序是逆序,距离近的是后写的。对于调用过程,先调用前面的中间件,再调用后面的中间件,最后执行视图。执行完后,再调用后面的中间件,最后调用前面的。这就类似装饰器先正向传值,然后再反向return。

发表评论

表情:
评论列表 (有 0 条评论,34人围观)

还没有评论,来说两句吧...

相关阅读

    相关 Django中间技术

    怎么理解中间件呢,其实如果你使用过java和数据库你就知道,中间件技术是两个模块中间的桥梁,就好比两块大陆之间的一座桥梁 > 如果需要详细了解中间件技术可以查看此文档

    相关 django中间

    中间件函数是django框架给我们预留的函数接口,让我们可以干预请求和应答的过程。 ![1682918-20190610110717958-1367766905.png][]