Django(request和response)
原文链接: https://blog.csdn.net/weixin_31449201/article/details/81043326
Django中的请求与响应
一.请求request
django中的request用来获取前端传过来的数据,那么前端数据的发送方式有多种,每一种传输方式在后端对应的接收方式也不同,所以我们首先来看前端的几种数据发送方式:
1.url路径参数
对于这种数据,它在前端的url中,比如:www.baidu.com/id/
我们就可以获取这个url中的id
方法:
在定义好的视图函数或者视图类的函数中的参数加上这个id即可
比如:
def weather(request, id):
print('id=%s' % id)
return HttpResponse('OK')
2.查询字符串
什么是查询字符串?看下边的例子就好
www.baidu.com/data/?a=10&b=20&a=30 (这个路径中有两个a,因为前端有时会有一键多值的情况)
对于这种请求怎么获取a,b这两个数据呢
我们可以通过request.GET属性来获取(HttpRequest对象的属性GET、POST都是QueryDict类型的对象,通过QueryDict对象request.GET/request.POST来获取一键多值的数据)
重要:查询字符串不区分请求方式,即假使客户端进行POST方式的请求,依然可以通过request.GET获取请求中的查询字符串数据。
方法:
def qs(request):
a = request.GET.get('a')
b = request.GET.get('b')
alist = request.GET.getlist('a')
print(a) # 30
print(b) # 20
print(alist) # ['10', '30']
return HttpResponse('OK')
3.请求体里边的数据
请求体数据格式不固定,可以是表单类型字符串,可以是JSON字符串,可以是XML字符串,应区别对待。
可以发送请求体数据的请求方式有POST、PUT、PATCH、DELETE。
Django默认开启了CSRF防护,会对上述请求方式进行CSRF防护验证,在测试时可以关闭CSRF防护机制,方法为在settings.py文件中注释掉CSRF中间件
①表单数据
表单数据的获取通过request.POST返回的Query Dict对象来获取
注意:request.POST只能用来获取POST方式的请求体表单数据。
方法:request.POST.get()和request.POST.getlist()
如:
def get_body(request):
a = request.POST.get('a')
b = request.POST.get('b')
alist = request.POST.getlist('a')
print(a)
print(b)
print(alist)
return HttpResponse('OK')
②非表单数据
非表单类型的请求体数据,Django无法自动解析,可以通过request.body属性获取最原始的请求体数据,自己按照请求体格式(JSON、XML等)进行解析。
request.body返回bytes类型。
例如要获取请求体中的如下JSON数据
{"name": "fenghua", "age": 24}
方法:因为获取到的是原始二进制数据,要进行解码(字符串化,得到json数据),json_dict化(将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['name'])
print(req_data['age'])
return HttpResponse('OK')
4.请求头里边的数据
可以通过request.META属性获取请求头headers中的数据,request.META为字典类型。
常见的请求头如:
CONTENT_LENGTH – The length of the request body (as a string).
CONTENT_TYPE – The MIME type of the request body.
HTTP_ACCEPT – Acceptable content types for the response.
HTTP_ACCEPT_ENCODING – Acceptable encodings for the response.
HTTP_ACCEPT_LANGUAGE – Acceptable languages for the response.
HTTP_HOST – The HTTP Host header sent by the client.
HTTP_REFERER – The referring page, if any.
HTTP_USER_AGENT – The client’s user-agent string.
QUERY_STRING – The query string, as a single (unparsed) string.
REMOTE_ADDR – The IP address of the client.
REMOTE_HOST – The hostname of the client.
REMOTE_USER – The user authenticated by the Web server, if any.
REQUEST_METHOD – A string such as "GET" or "POST".
SERVER_NAME – The hostname of the server.
SERVER_PORT – The port of the server (as a string).
方法:
def get_headers(request):
print(request.META['REQUEST_METHOD'])
return HttpResponse('haha')
5.其他常用请求对象
method:一个字符串,表示请求使用的HTTP方法,常用值包括:'GET'、'POST'。
user:请求的用户对象。
path:一个字符串,表示请求的页面的完整路径,不包含域名和参数部分。
encoding:一个字符串,表示提交的数据的编码方式。
如果为None则表示使用浏览器的默认设置,一般为utf-8。
这个属性是可写的,可以通过修改它来修改访问表单数据使用的编码,接下来对属性的任何访问将使用新的encoding值。
FILES:一个类似于字典的对象,包含所有的上传文件。
二.响应response
响应的常见类型:
HttpResponse,
HttpResponse子类(如HttpResponseNotFound 404),
JsonResponse,
redirect重定向,
render
1.HttpResponse
响应头的添加:得使用响应对象
response = HttpResponse()
response['name'] = ‘fenghua'
响应体的添加:
方式1:直接返回
return HttpResponse(content=响应体, content_type=响应体数据类型, status=状态码)
方式2:构造响应对象
response = HttpResponse(响应体)
response.status_code = 状态码
return response
2.HttpResponse子类
# 直接返回404错误状态码
def http_response(request):
return HttpResponseNotFound(响应体内容) # 返回的状态码自动设置成404,并显示前端显示的数据
3.JsonResponse
返回json格式数据,并将响应头的Content-Type设置成application/json
# 响应json数据到前端
def response_json(request):
data_json = {"name": "fenghua", "age": 24}
# 默认把json_dict转成了json字符串
# 再默认把json字符串转成二进制的json字符串
# 默认将数据类型指定为 application/json
return JsonResponse(data_json)
4.redirect重定向
反向解析reverse:根据路由名称或者命名空间解析出url路径
反向解析:要是命名空间是以分离的方式:url(r'^users/', include('users.urls', namespace='users111'))
url(r'^index/$', views.index, name='index111')
则reverse方式为:reverse('users111:index111')
或者:reverse('users:index')
要是以一次性在主url写好的方式:url(r'^users/feng', views.feng, name='feng')
则reverse方式为:reverse('feng')
redirect:根据反向解析出来的路径进行重定向
具体使用如下:
# 需求:访问'response_redirect/'重定向到 'users.index'
def response_redirect(request):
# url(r'^users/', include('users.urls', namespace='users111'))
# url(r'^index/$', views.index, name='index111')
return redirect(reverse('users:index')) # redirect(reverse('users111:index111')) 也可以实现
5.render返回模板
用法:
render(request对象, 模板文件路径, 模板数据字典)
from django.shortcuts import render
def index(request):
context={'city': '北京'}
return render(request,'index.html',context)
Django(request和response)的更多相关文章
- Django Request 与Response对象
Django使用请求和响应对象在系统中传递状态.当请求页面时,Django创建一个HttpRequest对象,该对象包含关于请求的元数据. 然后Django加载适当的视图,将HttpRequest作为 ...
- 【转】Django中的request与response对象
关于request与response 前面几个 Sections 介绍了关于 Django 请求(Request)处理的流程分析,我们也了解到,Django 是围绕着 Request 与 Respon ...
- 【Django】django 的request和response(转)
当请求一个页面时,Django 把请求的 metadata 数据包装成一个 HttpRequest 对象,然后 Django 加载合适的 view 方法,把这个 HttpRequest 对象作为第一个 ...
- Django REST framework 第二章 Request and Response
此章节开始真正的撰写REST framework的核心代码,介绍一系列必要的建立设计 Request Objects REST framework介绍了一个Request对象用来扩展常规的HttpRe ...
- Django中的Request和Response
接触Django这么久了,从来没有好好学习关于Django中的Request和Response对象.借着文件上传下载的相关工作,现在总结一下也不错. 当一个页面请求过来,Django会自动创建一个Re ...
- DRF (Django REST framework) 中的Request 与 Response
DRF中的Request 与 Response 1. Request - REST framework 传入视图的request对象不再是Django默认的HttpRequest对象,而是REST f ...
- 二,Request和Response
概述 在DRF中,引入了一个Request和Response对象进行请求和响应,这两个对象分别继承于Djaong中常规的HttpRequest和SimpleTemplateResponse,相比其父类 ...
- DRF基类APIView提供的Request、Response和序列化器的综合使用
关于DRF基类APIView提供的Request和Response对象的作用,可以看我的另一篇博文:https://www.cnblogs.com/chichung/p/9939864.html 综合 ...
- DRF自带的Request和Response对象(DRF基类APIView)
# 转载请留言联系 1.Request对象 DRF传入视图的request对象,不再是Django默认的HttpRequest对象,而是扩展了HttpRequest类的Request类的对象. RES ...
- Falsk中的Request、Response
Flask 中的Response 1.HTTPResponse('helloword') "helloword" from flask import Flask # 实例化Flas ...
随机推荐
- Java基础-使用JAVA代码剖析MD5算法实现过程
Java基础-使用JAVA代码剖析MD5算法实现过程 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任.
- Hadoop生态圈-Kafka的完全分布式部署
Hadoop生态圈-Kafka的完全分布式部署 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 本篇博客主要内容就是搭建Kafka完全分布式,它是在kafka本地模式(https:/ ...
- artTemplate
1.http://www.cnblogs.com/jiqiyoudu/p/4588042.html
- HDU 1262 寻找素数对 模拟题
题目描述:输入一个偶数,判断这个偶数可以由哪两个差值最小的素数相加,输出这两个素数. 题目分析:模拟题,注意的是为了提高效率,在逐个进行判断时,只要从2判断到n/2就可以了,并且最好用打表法判断素数. ...
- Metasploit输出重定向到文件
Metasploit是我们经常会使用到的神器,但是运行exploit/run无法保存输出信息,查看不是很方便. 现在可以使用spool来保存输出信息: Metasploit Framework Con ...
- 服务器环境配置安装(mysql+redis+nodejs+nginx)
公司用来测试的服务器挂了,最后重装了系统,需要重新配置程序运行环境,linux上安装不是很熟悉,特此记录一下. 首先获取系统版本信息: 参考:获取Linux系统版本信息 一.mysql 1. 安装 安 ...
- centos7.2 安装 composer
安装Composer https://pkg.phpcomposer.com/#how-to-install-composer # 下载composer.phar curl -sS https:// ...
- Linux中Samba详细安装【转】
转自:http://www.cnblogs.com/whiteyun/archive/2011/05/27/2059670.html 为了实现Windows主机与Linux服务器之间的资源共享,Lin ...
- 八、mini2440裸机程序之UART(2)UART0与PC串口通信【转】
转自:http://blog.csdn.net/shengnan_wu/article/details/8309417 版权声明:本文为博主原创文章,未经博主允许不得转载. 1.相关原理图 2.相关寄 ...
- 高通Trustzone and QSEE介绍
http://blog.csdn.net/iamliuyanlei/article/details/52625968