Django的请求和响应
一、客户端向服务器的请求简介
1.c-->s的传参的4中途径
-
- 提取的URL的特定部分,如/天气/北京/ 2018,可以在服务器端的路由中用正则表达式截取;
- 查询字符串(查询字符串),形如key1 = value1&key2 = value2;
- 请求体(主体)中发送的数据,比如表单数据,JSON,XML;
- 在HTTP报文的头(报头)中。
2.传参途径的接受方式
1. 通过url地址传递参数
例如:在子路由request_rout中,urls中设置 url(r'^weather/(?P<city>[a-z]+)/(?P<year>d{4})/$', views.weather),
def weather(request, year, city): print('city=%s' % city) print('year=%s' % year) return HttpResponse('OK')
2. 通过查询字符串传递参数
# 演示从查询字符串中提取参数 # /query/?a=1&b=2&c=3 # flask: request.args # dhango: request.GET -> QueryDict类的对象,类似于字典 def query_data(request): a = request.GET.get('a') b = request.GET.get('b') c = request.GET.get('c') c_list = request.GET.getlist('c') # list print(c_list) return HttpResponse("OK")
3. 通过请求体传递数据
3.1post表单提交数据
# 演示获取post表单提交的数据 # /form/ # flask: request.form # dhango: request.POST -> QueryDict类的对象,类似于字典 def form_data(request): name = request.POST.get('name') age = request.POST.get('age') print(name) print(age) return HttpResponse('OK')
3.2json数据
# 演示获取json数据 # /json/ # flask: request.json # dhango: request.body -> QueryDict类的对象,类似于字典 def json_data(request): req_data = request.body # 获取请求体原始数据 bytes # 将bytes转换成str json_str = req_data.decode() # 将json字符转为字典 req_dict = json.loads(json_str) # 取出年龄和名字 name = req_dict.get('name') age = req_dict.get('age') print(name) print(age) return HttpResponse('OK')
4. 通过请求头传递数据(request.META)
def get_headers(request): print(request.META['CONTENT_TYPE']) return HttpResponse('OK')
CONTENT_LENGTH - 请求正文的长度(作为字符串)。 CONTENT_TYPE - 请求正文的MIME类型。 HTTP_ACCEPT - 响应的可接受内容类型。 HTTP_ACCEPT_ENCODING - 可接受的响应编码。 HTTP_ACCEPT_LANGUAGE - 响应的可接受语言。 HTTP_HOST - 客户端发送的HTTP主机头。 HTTP_REFERER - 引用页面,如果有的话。 HTTP_USER_AGENT - 客户端的用户代理字符串。 QUERY_STRING - 查询字符串,作为单个(未解析的)字符串。 REMOTE_ADDR - 客户端的IP地址。 REMOTE_HOST - 客户端的主机名。 REMOTE_USER - Web服务器验证的用户(如果有)。 REQUEST_METHOD- 一个字符串,如"GET"或"POST"。 SERVER_NAME - 服务器的主机名。 SERVER_PORT - 服务器的端口(作为字符串)。
3.Django中的QueryDict对象
1.HttpRequest对象的属性GET,POST都是的QueryDict类型的对象,QueryDict类型的对象用来处理同一个键带有多个值的情况
2.得到value值的方法
2.1方法得到():根据键获取值
如果一个键同时拥有多个值将获取最后一个值
如果键不存在则返回无值,可以设置默认值进行后续处理
dict.get('键',默认值) 可简写为 dict['键']
2.2方法的GetList():根据键获取值,值以列表返回,可以获取指定键的所有值
如果键不存在则返回空列表[],可以设置默认值进行后续处理
dict.getlist('键',默认值)
二、响应对象构造
1.返回HttpResponse类的对象或其子类的对象
1.1格式
response = HttpResponse('<响应体>', content_type='<响应数据类型>', status='<响应状态码>')
res_http['name'] = 'yang'
# 演示构造响应对象 # /get_response/ def get_response(request): res_http = HttpResponse("response_body", content_type='text/html',status=200) res_http['name'] = 'yang' return res_http
2.响应时返回json数据
# 演示响应时返回json数据 # /get_json/ # flask: jsonify # Dhango: JsonResponse(<dict>) def get_json(request): res_dict = { "name" : "yang", "age" : 12 } return JsonResponse(res_dict)
3.响应时进行页面重定向
# 演示响应时进行页面重定向 # /redirect_test # flask和django相同 # redirect('url地址') def redirect_test(request): # 重定向首页 req_url = reverse('users:index') print(req_url) return redirect(req_url)