Django常见数据类型提交、解析与响应
Request请求
http协议向客户端传参四种形式
- URL地址拼接传参
- 传参示例:传递名字和年龄
http://127.0.0.1:8000/user/index/xiaowang/26
- 解析方式:
路由正则内增加匹配:url(r'users/index/(?P<name>[a-zA-Z]+)/(?P<age>\d+)', views.index)
对应视图函数写法:
- 传参示例:传递名字和年龄
def index(request,name,age):
print("name: %s, age: %s" % (name,age))
- URL查询字符串传参
写法:?key=value&...
- 传参示例:传递名字和年龄
http://127.0.0.1:8000/user/index/?name=xiaozhang&age=26
- 解析方式:
- 传参示例:传递名字和年龄
def index(request):
querydict = request.GET
name = querydict.get("name")
age = querydict.get("age")
- 请求体传参
- 可以发送请求体数据的请求方式有POST、PUT、PATCH、DELETE。
- Django默认开启了CSRF防护,会对上述请求方式进行CSRF防护验证,在测试时可以关闭CSRF防护机制,方法为在settings.py文件中注释掉CSRF中间件行:
django.middleware.csrf.CsrfViewMiddleware
-
POST表单请求
- 请求体传参不显示在url信息中
- 解析方式:
def get_postbody(request): name = request.POST.get("name") password = request.POST.get("password)
重要:request.POST
只能用来获取POST
方式的请求体表单数据,其余请求体获取数据均采用下述的request.body
-
非表单类型 Non-Form Data
- 非表单类型的请求体数据,Django无法自动解析,可以通过request.body属性获取最原始的请求体数据,自己按照请求体格式(JSON、XML等)进行解析。request.body返回
bytes
类型。 - 解析方式:例如获取json数据:
import json def get_body_json(request): json_str = request.body json_str = json_str.decode() # python3.6 无 需执行此步 req_data = json.loads(json_str) print(req_data['a']) print(req_data['b']) return HttpResponse('OK')
- 非表单类型的请求体数据,Django无法自动解析,可以通过request.body属性获取最原始的请求体数据,自己按照请求体格式(JSON、XML等)进行解析。request.body返回
请求头
可以通过request.META
属性获取请求头headers中的数据,request.META为字典类型。
其中包含HTTP_USER_AGENT
、SERVER_NAME
等许多信息。
- 获取示例:
def get_headers(request): print(request.META['CONTENT_TYPE']) return HttpResponse('OK')
其他HttpResponse对象属性
- method: 获取请求使用的HTTP方法,常用的包括"GET"、"POST"
- user: 请求的用户对象
- path: 请求页面的完整路径,不包含域名和参数部分
- encoding:一个字符串,表示提交的数据的编码方式
- 如果为None则表示使用浏览器的默认设置,一般为utf-8。
- 这个属性是可写的,可以通过修改它来修改访问表单数据使用的编码,接下来对属性的任何访问将使用新的encoding值。
- FILES:一个类似于字典的对象,包含所有的上传文件。
Response响应
HttpResponse
可以使用django.http.HttpResponse来构造响应对象。
-
设置方式:
- 传参方式:
HttpResponse(content=响应体, content_type=响应体数据类型, status=状态码)
- 属性设置方式:
response = HttpResponse() response.content = 响应体 response.status_code = 404
- 响应头设置:
# 可增加新的或修改已有请求头 response = HttpResponse() response['Itcast'] = 'Python' # 自定义响应头 Itcast, 值为Python
- 总示例:
from django.http import HttpResponse def demo_view(request): return HttpResponse('itcast python', status=400) 或者 response = HttpResponse('itcast python') response.status_code = 400 response['Itcast'] = 'Python' return response
HttpResponse子类
Django提供了一系列HttpResponse的子类,可以快速设置状态码
- HttpResponseRedirect 301
- HttpResponsePermanentRedirect 302
- HttpResponseNotModified 304
- HttpResponseBadRequest 400
- HttpResponseNotFound 404
- HttpResponseForbidden 403
- HttpResponseNotAllowed 405
- HttpResponseGone 410
- HttpResponseServerError 500
cookie设置和读取
- Cookie以键值对Key-Value形势进行信息的存储。
- Cookie基于域名安全,不同域名的Cookie是不能互相访问的
1. 设置cookie
可以通过HttpResponse对象中的set_cookie方法来设置cookie。
HttpResponse.set_cookie(cookie名, value=cookie值, max_age=cookie有效期)
- max_age 单位为秒,默认为None。如果是临时cookie,可将max_age设置为None。
2. 读取cookie
可以通过HttpRequest对象的COOKIES属性来读取本次请求携带的cookie值。request.COOKIES为字典类型。
cookies = request.COOKIES
session设置和储存
session可保存在数据库、本地缓存中。
-
为提高性能,常将session存在Redis中,此处以Redis为例
1) 安装扩展pip install django-redis
2)配置
settings.py文件中如下设置:CACHES = {
"default": {
"BACKEND": "django_redis.cache.RedisCache",
"LOCATION": "redis://127.0.0.1:6379/1",
"OPTIONS": {
"CLIENT_CLASS": "django_redis.client.DefaultClient",
}
}
}
SESSION_ENGINE = "django.contrib.sessions.backends.cache"
SESSION_CACHE_ALIAS = "default"
注意:
-
如果redis的ip地址不是本地回环127.0.0.1,而是其他地址,访问Django时,可能出现Redis连接错误,需要在redis配置文件中添加特定ip地址。
-
redis://127.0.0.1:6379/1确定使用的数据库为第二个,查看时在redis使用
select 1
选择。3)session操作
通过HttpRequest对象request的session属性进行会话的读写操作。- 以键值对格式写session:
request.session[key] = value
- 根据键读取值:
request.session.get(key,默认值)
- 设置session的有效期
request.session.set_expiry(value)
注:
-
如果value是一个整数,session将在value秒没有活动后过期。
-
如果value为0,那么用户session的Cookie将在用户的浏览器关闭时过期。
-
如果value为None,那么session有效期将采用系统默认值,默认为两周,可以通过在settings.py中设置SESSION_COOKIE_AGE来设置全局默认值。