咱们在使用python作接口测试的时候,一般使用的是requests库。而你们都知道还有一个request东西,不少人对requests与request两个东西傻傻分不清。下面我简单来介绍一下。前端
本文所讲python3,由于python2于2020年已经停更。那requests和request有什么区别呢?python
1.requests是python3的一个http请求库,request是urllib库的一个方法,因此一个是库,一个是方法。
数据库
urllib具体使用:django
2.python3网络请求主要使用urllib,requests,urllib3,其实requests底层就是urllib3,因此urllib3没有单独使用,直接使用requests更加简洁,但功能没urllib强大。还有一点就是python3.3后urllib2已经不能再用,只能用urllib.request来代替。json
因此python3主要使用urllib和requests去请求接口。后端
上面我简单介绍了requests库与request方法的区别,而在django中,是如何获取请求参数呢?cookie
请记住一点:requests是用来发送请求的,在django中request是用来获取请求参数的。网络
使用形式:session
发送请求: requests.post()函数
django获取请求参数:request.POST.get()
那么问题来了,django视图函数中的request到底哪里来的?
views每一个方法的参数都是request,那么问题来了,request为什么物?
首先,几乎每一个方法都是取数据(不管是从数据库,仍是从第三方接口),而后进行必定的处理,以后传给前端。而前端请求数据,就会向后端发送一个http请求,这个请求的请求路径,通过urls,会调用url中指定的方法。此时django就会将HttpRequest对象做为第一个参数传入此方法。故,request即为一个httpRequest对象。
而后,出现了一个新问题,httpRequest是什么,又含有什么属性和方法?
httpRequest类定义在django.http中
httpRequest对象是由django自动建立的
常见属性:
HttpRequest.method 字符串类型,表示所用的http方法
HttpRequest.content_type 指content_type头解析的请求的MIME类型
HttpRequest.content_params 指content_type标题中的 k/v参数字典
HttpRequest.GET 此为一个字典同样的对象,里面有get请求中的全部参数
HttpRequest.POST 此亦为一个字典同样的对象,里面有post请求表单中数据
HttpRequest.COOKIES 此仍为一个字典同样的对象,包含全部的cookie数据
HttpRequest.session : SessionMiddleware中间件,可读写的,为一个字典同样的对象,表示当前会话。咱们要保存用户状态,回话过程等等,须要利用此中间件
HttpRequest.user : AuthenticationsMiddleware中间件:表示当前登陆用户的AUTH_USER_MODEL实例,若未登陆,贼user为AnonymousUser实例
QueryDict:
在HttpRequest 对象中,属性 GET 和 POST 获得的都是 django.http.QueryDict 所建立的实例,此亦为一个相似于字典同样的类。
常常用的方法为QueryDict.get(key,default) ,返回key对应的值,若对应多个值,则返回最后的值,若key不存在,则返回默认值。
当请求一个页面时,Django 把请求的 metadata 数据包装成一个 HttpRequest 对象,而后 Django 加载合适的 view 方法,把这个 HttpRequest 对象做为第一个参数传给 view 方法。任何 view 方法都应该返回一个 HttpResponse 对象。
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,天天学一点,迈向成功路。