目录
1. 使用 Django中的 HttpResponse 构造响应对象
关于响应HttpResponse知识小天窗:
- 学习响应Response的目的:视图请求处理后 -->> 必使用 HttpResponse对象或者子对象 返回数据
- 常见的响应 HttpResponse 四种方式:(接下来我们将从 4 个不同的方式进行分析)
1. HttpResponse(): 响应 多种数据类型
2. JsonResponse(): 响应 JSON数据
3. redirect(): 重定向
4. render(): 渲染响应HTML模板
- 提示一下:
在我们以上四中方法时,需要在视图中导入Django包中的 http 模块:from django import http
1. 使用 Django中的 HttpResponse 构造响应对象
- 关于HttpResponse()中的参数知识点:
return http.HttpResponse(content="响应体数据",content_type="响应体数据类型",status="状态码")
- 参数说明:
>> content="响应体数据" -->> 写入响应体数据
>> content_type="响应体数据类型,默认是text/html" -->> 响应体数据类型说明
>> status="状态码,默认为200" -->> 响应报文中的状态码
>> Django中提供的默认状态码(status)的分类: 我们可以快速设置状态码
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
案例:
1. 视图(Views.py)中的代码
from django.shortcuts import render from django.views import View from django import http import json # Create your views here. class Response1View(View): """测试HttpResponse() 响应多种数据 http://127.0.0.1:8000/response1/ """ def get(self,request): # print(request) # 使用HttpResponse构造响应数据 return http.HttpResponse(content="响应多种数据 -->> HttpResponse()")
2.注册子路由代码
from django.urls import path,re_path from . import views # 注册子路由 urlpatterns = [ # 测试HttpResponse() 响应多种数据 http://127.0.0.1:8000/response1/ path("response1/",views.Response1View.as_view()), ]
3. 运行结果
2. JsonResponse:响应JSON
- 目的:前端需要JSON数据,那后端需要构造 JSON数据 响应给 前端
- Django提供了 JsonResponse 构造并响应JOSN数据
- JsonResponse 作用:
1. 将响应数据转换为JSON字符串
2. 设置响应头Content-Type为 application/json
- 案例: 通过http://127.0.0.1:8000/json_resp/ 向后端要JSON类型数据,并响应给前端
1. 在views.py中编写以下代码
class Response2View(View): """测试JSONResponse http://127.0.0.1:8000/json_resp/ """ def get(self,request): # 响应数据 dict_data = { "name":"Mr.lin", "age":18 } # 使用JSONResponse构造并响应JSON数据 return http.JsonResponse(dict_data)
2. 注册子路由
from django.urls import path,re_path from . import views # 注册子路由 urlpatterns = [ # 测试JSONResponse http://127.0.0.1:8000/json_resp/ path("json_resp/",views.Response2View.as_view()), ]
3. 运行代码,返回结果
3. redirect():重定向
- 目的:跳转页面时候用。比如:用户注册,登录成功后,直接将用户引导至网站首页
- 采用 redirect()来实现 重定向
1. 在views.py中写入一下代码(需要导入redirect -->> from django.shortcuts import redirect)
"""-----------------------------redirect() 重定向---------------------------------""" from django.shortcuts import redirect class IndexView(View): """测试重定向 http://127.0.0.1:8000/index/ """ def get(self,request): return http.HttpResponse('假装是一个首页界面') class LoinRedirectView(View): """测试重定向 http://127.0.0.1:8000/login_redirect/ """ def post(self,request): # 假装正在处理登录逻辑 # 假装登录逻辑处理完成 # ...... # 将用户通过重定向引导到首页 return redirect("/index/")
2. 注册子路由
from django.urls import path,re_path from . import views # 注册子路由 urlpatterns = [ # 测试 redirect() 重定向 # 首页路由 http://127.0.0.1:8000/index/ path("index/",views.IndexView.as_view()), # 用户登录路由 http://127.0.0.1:8000/login_redirect/ path("login_redirect/",views.LoinRedirectView.as_view()) ]
3. 运行结果:
4. redirect()重定向 搭配 反向解析(难点)
- 能否可以实现一种效果,可以保证即使在版本迭代时,使用了新设计的地址替换了路由中原有的地址,我们之前编写的使用该地址的代码不用去修改,达到动态获取的目的。
- 解决方案:
路由反向解析:路由反向解析 是使用路由的别名,动态的解析出该路由中的真实地址
- 具体操作:
1. 在主路由中,给子应用的总路由起别名 -->> path('', include(('子路由', '子应用名字'), namespace='总路由别名,可以随便命名')),
例如:
urlpatterns = [ # 请求和响应 # path('', include(('子路由', '子应用名字'), namespace='总路由别名,可以随便命名')), path('', include(('Request_Response.urls', 'Request_Response'), namespace='Request_Response')), ]
2. 子路由中,给子应用的子路由起别名 -->> path("index/",views.IndexView.as_view(),name="别名")
例如:
from django.urls import path,re_path from . import views # 注册子路由 urlpatterns = [ # 测试 redirect() 重定向 和反向解析 # 首页路由 http://127.0.0.1:8000/index/ path("index/",views.IndexView.as_view(),name="index"), # 用户登录路由 http://127.0.0.1:8000/login_redirect/ path("login_redirect/",views.LoinRedirectView.as_view()) ]
3. 视图中,使用路由的别名,动态的解析出该路由中的真实地址 -->> return redirect("Request_Response:子路由别名")
"""------------------------redirect() 重定向 和 反向解析--------------------""" class IndexView(View): """测试重定向 http://127.0.0.1:8000/index/ """ def get(self,request): return http.HttpResponse('假装是一个首页界面') class LoinRedirectView(View): """测试重定向 http://127.0.0.1:8000/login_redirect/ """ def post(self,request): # 假装正在处理登录逻辑 # 假装登录逻辑处理完成 # ...... # 将用户通过重定向引导到首页 # ret_url = reverse('总路由别名:子路由别名') return redirect("Request_Response:index")
4. 运行的效果同 >> 3. redirect():重定向 ,效果一样,唯一解决了版本迭代时,不会那么麻烦的修改路由的问题
作为小白的我,希望大佬多多支持,谢谢!!!