Django 获取请求参数
引言
我们在使用python做接口测试的时候,通常使用的是requests库。而大家都知道还有一个request东西,很多人对requests与request两个东西傻傻分不清。下面我简单来介绍一下。
Requests与Request
本文所讲python3,因为python2于2020年已经停更。那requests和request有什么区别呢?
1.requests是python3的一个http请求库,request是urllib库的一个方法,所以一个是库,一个是方法。
urllib具体使用:
- urllib.request 用于打开和读取URL,
- urllib.error 用于处理前面request引起的异常,
- urllib.parse 用于解析URL,
- urllib.robotparser用于解析robots.txt文件
2.python3网络请求主要使用urllib,requests,urllib3,其实requests底层就是urllib3,所以urllib3没有单独使用,直接使用requests更加简洁,但功能没urllib强大。还有一点就是python3.3后urllib2已经不能再用,只能用urllib.request来代替。
所以python3主要使用urllib和requests去请求接口。
Django 获取请求参数原理
上面我简单介绍了requests库与request方法的区别,而在django中,是如何获取请求参数呢?
请记住一点:requests是用来发送请求的,在django中request是用来获取请求参数的。
使用形式:
发送请求: requests.post()
django获取请求参数:request.POST.get()
那么问题来了,django视图函数中的request到底哪里来的?
views每个方法的参数都是request,那么问题来了,request为何物?
HttpRequest对象
当请求一个页面时,Django 把请求的 metadata 数据包装成一个 HttpRequest 对象,然后 Django 加载合适的 view 方法,把这个 HttpRequest 对象作为第一个参数传给 view 方法。任何 view 方法都应该返回一个 HttpResponse 对象。
HttpRequest中方法使用
HttpRequest 对象表示来自某客户端的一个单独的 HTTP 请求。HttpRequest 对象是 Django 自动创建的。
它的属性有很多,可以参考 DjangoBook,比较常用的有以下几个:
1. method 请求方法,如:
这里不介绍了,具体可以参考官方文档:https://docs.djangoproject.com/zh-hans/2.2/ref/request-response/#django.http.HttpRequest
2.获取url中的请求参数
需求:假设用户访问127.0.0.1/user/1/2,你想获取1,2。应该怎么操作呢?
(1)未命名参数(位置参数)
# 在项目下的urls.py下增加设置: url(r'^user/(\d+)/(\d+)$',views.index) # 在user.views的index视图中: def index(request,a,b): # 接受的参数按顺序的 return HttpResponse("获得数据 %s %s"%(a,b))
(2)命名参数(关键字参数)
# 在项目下的urls.py下增加设置: url(r'^user/(?P<category>\d+)/(?P<id>\d+)$',views.index) # 在user.views的index视图中: def index(request,id,category): # 接受的参数可以不用按顺序的 return HttpResponse("获得数据 %s %s"%(category,id))
输出结果均是 获得数据 1 2
另一种形式:
结果:
3.获取查询字符串
需求:获取127.0.0.1:8000/user?id=1&pid=99的查询字符串的值
# 在项目下的urls.py下增加设置: url(r'^user/$',views.index) # 在user.views的index视图中: def index(request): id = request.GET.get("id") pid = request.GET.get("pid") return HttpResponse("获得数据 %s %s"%(id,pid))
注意:查询字符串的获取与请求方式无关:不管是 GET
还是 POST
请求,都可以通过request.GET
属性来获取!!!
4.获取表单数据
注意:request.POST
只能用来获取POST方式的请求体表单数据!
使用postman请求
控制台日志:
5.获取非表单类型
request.body
属性:获取非表单类型的请求体数据,如:JSON、XML等,获取到的数据类型为bytes
类型- 获取数据后,自己解析数据取出参数
def index(request): json_str = request.body json_str = json_str.decode() # python3.6及以上不用这一句代码 dict_data = json.loads(json_str) # loads把str转换为dict,dumps把dict转换为str id = dict_data.get("id") pid = dict_data.get("pid") return HttpResponse("获得数据 %s %s"%(id,pid))
再看一个接口:
接口路径:/v1/add_user,使用postman模拟一下
看看官方怎么说的:
截图中大致意思是如果请求数据是原始数据或非表单数据,可以使用httprequest.body来访问,也就是request.body方法。方法就介绍到这里,这些都是最常用的。
附录
获取请求头的内容:
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).
获取请求头内容的用META
示例:
def index(request): ip = request.META.get("REMOTE_ADDR") return HttpResponse("你的ip地址是%s"%ip)
获取自定义请求头的内容
用postman增加一个自定义的请求头,key=id,value=1。那么应该怎么取呢?
代码如下:
def index(request): id = request.META.get("HTTP_ID") return HttpResponse("你的id:%s"%id)
注意:获取自定义的请求头属性值时,需要添加前缀 HTTP_
并转成大写,作为键来获取值
欢迎加入测试开发QQ学习群:696400122,每天学一点,迈向成功路。
作者:全栈测试开发日记
出处:https://www.cnblogs.com/liudinglong/
csdn:https://blog.csdn.net/liudinglong1989/
微信公众号:全栈测试开发日记
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。