欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

Django 获取请求参数

程序员文章站 2022-07-14 22:32:29
...

  引言

  我们在使用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为何物?

Django 获取请求参数

 

 

 

 

  HttpRequest对象

  当请求一个页面时,Django 把请求的 metadata 数据包装成一个 HttpRequest 对象,然后 Django 加载合适的 view 方法,把这个 HttpRequest 对象作为第一个参数传给 view 方法。任何 view 方法都应该返回一个 HttpResponse 对象。

 Django 获取请求参数

 

  HttpRequest中方法使用

  HttpRequest 对象表示来自某客户端的一个单独的 HTTP 请求。HttpRequest 对象是 Django 自动创建的。

它的属性有很多,可以参考 DjangoBook,比较常用的有以下几个:

 1. method 请求方法,如:

Django 获取请求参数

 

 这里不介绍了,具体可以参考官方文档:https://docs.djangoproject.com/zh-hans/2.2/ref/request-response/#django.http.HttpRequest

Django 获取请求参数

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

另一种形式:

Django 获取请求参数

 

结果:

Django 获取请求参数

 

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.获取表单数据

Django 获取请求参数

 

   注意:request.POST 只能用来获取POST方式的请求体表单数据!

使用postman请求

Django 获取请求参数

 

控制台日志:

Django 获取请求参数

 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))

再看一个接口:

Django 获取请求参数

接口路径:/v1/add_user,使用postman模拟一下

Django 获取请求参数

看看官方怎么说的:

 Django 获取请求参数

截图中大致意思是如果请求数据是原始数据或非表单数据,可以使用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_ 并转成大写,作为键来获取值

 Django 获取请求参数

 

 

  欢迎加入测试开发QQ学习群:696400122,每天学一点,迈向成功路。