zoukankan      html  css  js  c++  java
  • 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,每天学一点,迈向成功路。

  • 相关阅读:
    数据结构学习(一)、线性表
    内容太多用省略号代替、内容不换行,鼠标移上去显示详情
    时间格式化
    51Nod--1018排序
    51Nod--1085背包问题
    51Nod--1049最大子段和
    51Nod--1051最大子矩阵和(DP入门)
    POj1852--Ants
    c# static用法
    group by用法
  • 原文地址:https://www.cnblogs.com/liudinglong/p/12543733.html
Copyright © 2011-2022 走看看