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,每天学一点,迈向成功路。

 

posted @ 2020-03-22 01:02  全栈测试开发日记  阅读(14021)  评论(0编辑  收藏  举报