请求和响应
web框架本质就是处理用户发起的请求,然后返回响应结果。请求,和响应就是框架中的数据流。
请求
当页面被请求时,django会创建一个HttpRequest
对象,该对象包含关于请求的元数据。然后django加载适当的视图,将HttpRequest
对象作为第一个参数传递给视图函数(这就是为什么所有的视图的第一个参数都命名为request
的原因)。每个视图负责返回一个HttpResponse
对象。
HttpRequest
对象
常用属性
.body
原始请求的body,类型是字节类型。
.method
代表请求中使用的http
方法的字符串,保证是大写字母。例如在函数视图中通过判断request.method
来处理不同的逻辑:
if request.method == 'GET':
do_something()
elif request.method == 'POST':
do_something_else()
.GET
一个类似字典的对象,包含所有给定的HTTP GET
参数(查询参数)。
.POST
一个类似字典的对象,包含所有给定的表单格式的HTTP POST
参数。
.FILES
一个类似字典额对象,包含所有上传的文件。
更多属性,请参考官方文档
请求参数类型
利用HTTP协议向服务器传参有几种途径?
- 查询字符串参数
- url中
?
后面的key=value形式
的参数 - 在django中通过
request.GET
属性获取 - 请求体参数
post
方法的form
表单- 在django中通过
request.POST
属性获取
- 在django中通过
json
格式和put
,patch
,delete
方法传递的form
表单- 在django中通过
request.body
属性获取
- 在django中通过
- 文件
- 上传的文件通过
request.FILES
属性获取
- 上传的文件通过
- 路径参数
- 在django中通过路由规则传递给视图
咱们直接举个get请求的栗子🌰~,其他请求方法同理。
urls先配个路径 :
视图views里面这么写:
浏览器访问:
打断点调试查看month和year:
响应
与django自动创建请求对象不同,创建响应对象是你的责任。你写的每个视图都要负责实例化,填充和返回一个响应对象。
HttpResponse
传入字符串
典型的用法是将页面的内容以字符串、或字节字符串的形式传递给 HttpResponse
构造函数:
>>> from django.http import HttpResponse
>>> response = HttpResponse("Here's the text of the Web page.")
>>> response = HttpResponse("Text only, please.", content_type="text/plain")
>>> response = HttpResponse(b'Bytestrings are also accepted.')
也可以增量的形式添加内容,你可以使用response
作为一个类似文件的对象:
>>> response = HttpResponse()
>>> response.write("<p>Here's the text of the Web page.</p>")
>>> response.write("<p>Here's another paragraph.</p>")
设置头字段
使用HttpResponse.headers
设置和删除一个字段。
>>> response = HttpResponse()
>>> response.headers['Age'] = 120
>>> del response.headers['Age']
设置状态码
直接传递参数status
给构造函数
>>> from django.http import HttpResponse
>>> response = HttpResponse("Here's the text of the Web page.", status=200)
JsonResponse
对象
class JsonResponse(data,encoder=DjangoJSONEncoder, safe=True, json_dumps_params=None, kwargs)
一个HttpResponse
的子类,用来创建json
编码的响应。默认的Content-Type
为application/json
。第一个参数data
应该是字典实例。如果safe
参数设置为False
,它可以是任何json
可序列化的对象。
典型的用法:
>>> from django.http import JsonResponse
>>> response = JsonResponse({'foo': 'bar'})
>>> response.content
b'{"foo": "bar"}'
序列化非字典对象:
为了对 dict
以外的对象进行序列化,你必须将 safe
参数设置为 False
:
>>> response = JsonResponse([1, 2, 3], safe=False)
如果没有传递 safe=False
,将引发一个 TypeError。