在系统内部Django使用request和response对象来进行状态的传递。本篇介绍Django中的request对象与response对象
通过这篇文章,你能了解到:
- request是什么?
- HttpRequest的属性和方法有哪些?
- response是什么?
- HttpResponse的属性和方法有哪些?
Request对象
当浏览器发出一个请求时,Django创建一个包含request的元信息(metadata)的HttpRequest对象,他作为视图函数的第一个参数。
wsgi 给封装的对象
1 | <WSGIRequest: GET '/func/'> |
源码剖析
1 | class HttpRequest(object): |
属性
HttpRequest对象的属性 | 描述 |
---|---|
path | 表示提交请求页面完整地址的字符串,不包括域名和后面的参数。如 “/music/bands/the_beatles/“。 |
path_info | 表示提交请求页面完整地址的字符串,不包括域名和后面的参数。如 “/music/bands/the_beatles/“。 |
method | 表示提交请求使用的HTTP方法。如:GET、POST |
GET | 一个类字典对象,包含所有的HTTP的GET参数的信息。见 QueryDict 文档。 |
body | 请求体: bytes 类型, get没有请求体 |
POST | 一个类字典对象,包含所有的HTTP的POST参数的信息。见 QueryDict 文档。 通过POST提交的请求有可能包含一个空的 POST 字典,也就是说, 一个通过POST方法提交的表单可能不包含数据。因此,不应该使用 if request.POST 来判断POST方法的使用,而是使用 if request.method == “POST” 。提取数据可以使用get方法。 request.POST实际上是从request.body提取的,如果request.POST没有值,去request.body进行检查。 注意: POST 并 不 包含文件上传信息。见 FILES 。 |
COOKIES | 一个标准的Python字典,包含所有cookie。键和值都是字符串。 |
FILES | 一个类字典对象,包含所有上传的文件。 FILES 的键来自 <input type="file" name="" /> 中的 name 。 FILES 的值是一个标准的Python字典,包含以下三个键:filename :字符串,表示上传文件的文件名。 content-type :上传文件的内容类型。 content :上传文件的原始内容。 注意 FILES 只在请求的方法是 POST ,并且提交的 <form> 包含enctype=”multipart/form-data” 时才包含数据。否则, FILES 只是一个空的类字典对象。我们也可以使用ajax来上传文件。 |
META | 一个标准的Python字典,包含所有有效的HTTP头信息。有效的头信息与客户端和服务器有关。 CONTENT_LENGTH CONTENT_TYPE QUERY_STRING :未解析的原始请求字符串。 REMOTE_ADDR :客户端IP地址。 REMOTE_HOST :客户端主机名。 SERVER_NAME :服务器主机名。 SERVER_PORT :服务器端口号。 在 META 中有效的任一HTTP头信息都是带有 HTTP_ 前缀的键(把 - 变为 _ ),例如: HTTP_ACCEPT_ENCODINGHTTP_ACCEPT_LANGUAGE HTTP_HOST :客户端发送的 Host 头信息。 HTTP_REFERER :被指向的页面,如果存在的。 HTTP_USER_AGENT :客户端的user-agent字符串。 HTTP_X_BENDER : X-Bender 头信息的值,如果已设的话。 HTTP_X_CSRFTOKEN:X-CSRFToken csrf值,常在ajax中使用 |
user | 一个 django.contrib.auth.models.User 对象表示当前登录用户。 若当前用户尚未登录, user 会设为 django.contrib.auth.models.AnonymousUser 的一个实例。可以将它们与 is_authenticated() 区别开: if request.user.is_authenticated(): # Do something for logged-in users. else: # Do something for anonymous users. user 仅当Django激活 AuthenticationMiddleware 时有效。 |
session | 一个可读写的类字典对象,表示当前session。 |
raw_post_data | POST的原始数据。 用于对数据的复杂处理。 |
request.is_ajax | 判断是否是ajax |
QueryDict对象
我们平时用的 request.GET
和 request.POST
都是QueryDict对象,这个对象继承自dict,因此用法跟dict相差无几。其中用得比较多的是get方法和getlist方法。
- get方法:用来获取指定key的值,如果没有这个key,默认返回None。
- getlist方法:如果浏览器上传上来的key对应的值有多个,那么就需要通过这个方法获取。
对于QueryDict详见 [Django-QueryDict]
方法
HttpRequest 的方法 | 描述 |
---|---|
request.get_full_path() | 获取完整的路径信息,包含查询参数,不包含ip端口 |
request.is_secure() | HTTPS 返回 True |
request.is_ajax() | 判断是否是ajax请求 |
例子:文件上传
上传文件注意的事项:
- form表单的属性
enctype="multipart/form-data"
- input type= ‘file’
- request.FILES.get 类字典对象
1 | # 类字典对象 |
设置multiple可以上传多个文件
- python代码,从request.FILES这个字典中取出文件对象并写到文件。
1 | class FileUpload(View): |
chunks方法:
1 | # 源码剖析: |
response对象
HttpResponse
HttpResponse
类定义在django.http
模块中。HttpRequest
对象由Django自动创建,而HttpResponse
对象则由程序员手动创建.我们编写的每个视图都要实例化、填充和返回一个
HttpResponse
,后面提到的
render
,redirect
和JsonResponse
都将返回HttpResponse
。
属性
HttpResponse.content:响应内容,bytes类型。
HttpResponse.charset:响应内容的编码
HttpResponse.status_code:响应的状态码
render
render函数的功能:
- 字符串替换,渲染完成
- 还是以HttpResponse对象进行返回
1 | def render(request, template_name, context=None, content_type=None, status=None, using=None): |
redirect
参数可以是:
- 一个模型:将调用模型的
get_absolute_url()
函数 - 一个视图,可以带有参数:将使用
urlresolvers.reverse
来反向解析名称 - 一个绝对的或相对的URL,将原封不动的作为重定向的位置。
1 | def redirect(to, *args, **kwargs): |
1 | class HttpResponseRedirect(HttpResponseRedirectBase): |
self['Location'] = iri_to_uri(redirect_to)
- 如果没有redirect ,只需要在HttpResponse添加Location属性
1 | class HttpResponseRedirectBase(HttpResponse): |
301与302的区别
临时重定向(响应状态码:302)和永久重定向(响应状态码:301)对普通用户来说是没什么区别的,它主要面向的是搜索引擎的机器人。
- A页面临时重定向到B页面,那搜索引擎收录的就是A页面。
- A页面永久重定向到B页面,那搜索引擎收录的就是B页面。
JsonResponse
- 向前端传输数据
- 序列化 + content-type
对于前后端分离,传的是数据,不再是页面了,所以需要新的工具
1 | import json |
content-Type :普通文本,需要进行反序列化
方法一:
响应头加自动反序列化
1 | return HttpResponse(json.dumps(data), content_type='application/json') |
方法二:
1 |
1 | from django.http.response import JsonResponse |
对于非字典需要加safe参数
1 | from django.http.response import JsonResponse |