1.HttpResponse
1)Django服务器接收到客户端发送过来的请求后,会将提交上来的数据封装成httpRequest对象传给视图函数。那么视图处理完相关逻辑后,也需要返回一个响应给浏览器。而这个响应必须返回HttpResponseBase或者他的子类的对象
2)可以使用django.http.HttpResponse来构造响应对象
3) HttpRequest对象由Django创建,HttpResponse对象或子对象由开发人员创建。
response = HttpResponse(content=响应体, content_type=响应体数据类型,默认为text/html, status=状态码,默认为200)
class TestQuery(View):
def get(self, request):
#HttpResponse默认返回的是html字符串类型的数据,
#如果我们要响应html字符串以外的数据该如何实现?
#比如要响应图片格式
#HttpResponse(content=图片的原始数据, content_type=响应体数据类型,默认为image/jpg, status=状态码,默认为200)
response = HttpResponse('test')
return response
2. JsonResponse:响应JSON
1)在开发功能时,如果前端需要JSON数据,那么后端就需要构造并响应JSON数据,这也是我们在开发中使用最多的。
2)而Django提供了JsonResponse来构造并响应JSON数据
3)JsonResponse作用:
帮助我们将响应的数据转换为JSON字符串
设置响应头Content-Type为 application/json
class TestQuery(View):
def get(self, request):
# 准备要响应的数据
dict_data = {
'name': 'lx',
'age': 100
}
# 使用JSONResponse构造并响应JSON数据
return JsonResponse(dict_data)
3. redirect():重定向
在开发中,我们经常会遇到一种需求,当某个逻辑操作完成后,将用户引导到另外一个逻辑、页面中
比如:用户注册、登录成功后,直接将用户引导到网站首页
解决办法:可以使用重定向
redirect():重定向
from django.shortcuts import render, redirect
class Index(View):
def get(self, request):
return HttpResponse('网站首页')
class LoginView(View):
def post(self, request):
return redirect('/index/') #别忘了 路径前面要加反斜线表示根路径
4. redirect()重定向 搭配 反向解析
1)首先要考虑的问题是,我们要重定向的地址会不会更改会不会在某次版本更新迭代的时候被修改,如果很多地方都用到了这个地址那么是不是这些地方都要做修改?
需求:
能否可以实现一种效果,可以保证即使在版本迭代时,使用了新设计的地址替换了路由中原有的地址,我们之前编写的使用该地址的代码不用去修改,达到动态获取的目的。.
解决方案:
路由反向解析
路由反向解析 是使用路由的别名,动态的解析出该路由中的真实地址
总路由
urlpatterns = [
path('admin/', admin.site.urls),
#这里的namespace是可以使用任意的名字,但是为了易于理解可以使用子应用的名字
# 如果定义了namespace,那么一定要定义app_name 不然会报错
path('', include(('pratice_1.urls',"pratice_1"),namespace="pratice_1"))
]
子路由
urlpatterns = [
# 测试重定向
path('login/', views.LoginView.as_view()),
# 给要跳转的目标地址起别名,这个名字也可以随便写,但是最好写一个见文知意的
path('index/', views.Index.as_view(),name='index'),
]
class Index(View):
def get(self, request):
return HttpResponse('网站首页')
class LoginView(View):
def post(self, request):
#总路由别名:子路由别名
redirect_url = reverse('pratice_1:index')
#要跳转的目标地址
return redirect(redirect_url)
include() 源码