一、HttpRequest
传递方式
|
示例
|
后端获取方式
|
数据类型
|
url路径(path) |
/news/1/2 |
正则匹配 |
str |
查询字符串 |
/news2?category=1&page=2 |
request.GET |
QueryDict |
请求体:表单类型数据 |
category=1&page=2 |
request.POST |
QueryDict |
请求体:json等 |
{"category":1,"page":2} |
request.body |
bytes |
请求头 |
category=1 page=2 |
request.META |
字典 |
表格说明:
客户端通过五种方式向服务器传参,django 会自动把参数封装到 request 对象(HttpRequest类型的实例)中,我们获取这些参数需要通过 request 对象获取,而根据传参的方式的不同,获取调用的属性也会不同,获取到的数据类型也不一样。根据属性的数据类型需要调用其 get() 方法或 getlist() 方法获取值。
获取 request 请求的属性: .GET:获取查询字符串参数 (与请求方式无关)——QueryDict对象 .POST:获取请求体中的表单类型的数据(与请求方式有关,仅限post请求)——QueryDict对象 .body:获取请求体非表单类型的数据,比如:json .META:获取请求头中的数据(获取自定义属性时,需要加前缀“HTTP_”, 并转成大写)
.user:当前访问的登录用户对象
关于 request.user 属性:
request 里保存着 user 属性,如果用户已登陆,那么 user 是一个 AbstractUser 对象,如果用户未登录,那么 user 是一个 AnnoymousUser 对象。
user对象判断是否登陆:request.user.is_authenticated()返回true表示登陆。
CSRF 安全防护:
Django 对 POST、PUT、PATCH、DELETE 请求方式开启了 CSRF 安全防护,为方便测试,可以在 settings.py 文件中注释掉 CSRF 中间件,关闭CSRF防护。
获取QueryDict:
获取QueryDict的值时,可以在参数中设置默认值,在或取不到值时返回默认值
二、QueryDict对象
- QueryDict 对象的包位于 django.http.QueryDict
- 与字典类似,但一个键可以保存多个值
- HttpRequest对象的 GET 和 POST 属性都是 QueryDict 类型
获取值的方法:
.get()方法
根据键获取值 如果一个键同时拥有多个值,将获取最后一个值 如果键不存在则返回None值,可以设置返回自定义的默认值 dict.get('键',默认值)
.getlist()方法
根据键获取多个值,值以列表返回 如果键不存在则返回空列表[] dict.getlist('键',默认值)
三、HttpResponse
1、常用子类
HttpResponseRedirect 重定向
JsonResponse 返回json数据
Django提供了一系列HttpResponse的子类,可以快速设置状态码: HttpResponseRedirect 302 HttpResponseNotModified 304 HttpResponseBadRequest 400 HttpResponseNotFound 404 HttpResponseForbidden 403 HttpResponseNotAllowed 405 HttpResponseServerError 500
2、构造响应对象
-
使用 django.http.HttpResponse来构造响应对象:
response =HttpResponse(content=响应体, content_type=响应体数据MIME类型, status=状态码)
-
响应头设置:
可以直接将 HttpResponse 对象当做字典进行响应头键值对的设置:
respone['响应头key'] = 响应头值
3、JsonResponse 子类
# 传递字典类型的数据 content_type: application/json JsonResponse({"name":"张三"}) # 解决编码问题: {"name": "u5f20u4e09"} JsonResponse({"name":"张三"}, json_dumps_params={'ensure_ascii':False}) # 传递列表数据 JsonResponse([{"name":"张三"}], json_dumps_params={'ensure_ascii':False}, safe=False)
4、HttpResponseRedirect 子类
# 重定向到首页 状态码:302 return redirect('/index') # 项目的urls.py url(r'^', include('users.urls', namespace='users')), # 应用的urls.py url(r'^home$', views.index, name='index'), def my_redirect(request): # 生成的url的值为 /home url = reverse('users:index') return redirect(url) # 重定向