devops——3、接收并处理请求参数与QueryDict对象

1、GET请求

dashboard/views.py
from django.http import HttpResponse

def index(request):
    print("request get =", request.GET)
    print("aa=", request.GET.get("aa"))
    print("cc=", request.GET.getlist("cc"))
    return HttpResponse("")

访问http://127.0.0.1:8000/dashboard/?aa=bb&cc=dd&cc=ee返回结果如下:

request get = <QueryDict: {'aa': ['bb'], 'cc': ['dd', 'ee']}>
aa= bb
cc= ['dd', 'ee']
[12/Dec/2018 02:41:55] "GET /dashboard/?aa=bb&cc=dd&cc=ee HTTP/1.1" 200 0

2、POST请求

dashboard/views.py
from django.http import HttpResponse

def index(request):
    if request.method == "GET":
        print("request get =", request.GET)
        print("aa=", request.GET.get("aa"))
        print("cc=", request.GET.getlist("cc"))
    elif request.method == "POST":
        print("request post =", request.POST)
    return HttpResponse("")

devops/settings.py注释掉MIDDLEWARE中的django.middleware.csrf.CsrfViewMiddleware
否则POST请求时会出现403报错
下面进行POST提交测试:

In [1]: import requests                                                                         
In [2]: url = "http://127.0.0.1:8000/dashboard/?aa=bb&cc=dd&cc=ee"                              
In [3]: requests.get(url)                                                                       
Out[3]: <Response [200]>
In [4]: data = {}                                                                               
In [5]: data["aa"] = "bb"                                                                       
In [6]: data["cc"] = ["dd", "ee"]                                                               

In [7]: data                                                                                    
Out[7]: {'aa': 'bb', 'cc': ['dd', 'ee']}

In [8]: requests.post(url, data)                                                               
Out[8]: <Response [403]>  #未修改settings.py出现403报错

In [9]: requests.post(url, data)                                                               
Out[9]: <Response [200]> #修改settings.py正常了

返回结果如下:

request post = <QueryDict: {'aa': ['bb'], 'cc': ['dd', 'ee']}>
[12/Dec/2018 02:56:38] "POST /dashboard/?aa=bb&cc=dd&cc=ee HTTP/1.1" 200 0

3、QueryDict对象

在HttpRequest对象中,GET和POST属性是django.http.QueryDict的实例,它是一个自定义的类似字典的类,用来处理同一个键带有多个值。这个类的需求来自某些HTML表单元素传递多个值给同一个键.
request.POST和request.GET的QueryDict在一个正常的请求/响应循环中是不可变的。若要获得可变的版本,需要使用.copy().
https://docs.djangoproject.com/en/1.11/ref/request-response/#querydict-objects

例如:如果给request.POST和request.GET的QueryDict直接赋值会出现报错:AttributeError: This QueryDict instance is immutable,需要使用request.GET.copy()

dashboard/views.py
from django.http import HttpResponse

def index(request):
    if request.method == "GET":
        print("request get =", request.GET)
        data = request.GET.copy()
        data["aa"] = "x"
        print("data=", data)
        print("aa=", request.GET.get("aa"))
        print("cc=", request.GET.getlist("cc"))
    elif request.method == "POST":
        print("request post =", request.POST)
    return HttpResponse("")

结果如下:

request get = <QueryDict: {'aa': ['bb'], 'cc': ['dd', 'ee']}>
data= <QueryDict: {'aa': ['x'], 'cc': ['dd', 'ee']}>
aa= bb
cc= ['dd', 'ee']
[12/Dec/2018 05:58:31] "GET /dashboard/?aa=bb&cc=dd&cc=ee HTTP/1.1" 200 0

实例化QueryDict

In [1]: from django.http import QueryDict                                                   
In [2]: QueryDict('a=1&a=2&c=3')                                                            
Out[2]: <QueryDict: {'a': ['1', '2'], 'c': ['3']}>
In [3]: q = QueryDict('a=1&a=2&c=3')                                                        
In [4]: QueryDict.fromkeys(['a', 'a', 'b'], value='val')                                    
Out[4]: <QueryDict: {'a': ['val', 'val'], 'b': ['val']}>
In [5]: q.dict()                                                                            
Out[5]: {'a': '2', 'c': '3'}
In [6]: q.urlencode()                                                                       
Out[6]: 'a=1&a=2&c=3'

QueryDict对象–方法

QueryDict.get(key, default=None)
QueryDict.setdefault(key, default=None)[source]
QueryDict.update(other_dict)
QueryDict.items()
QueryDict.values()
QueryDict.copy()
QueryDict.getlist(key, default=None)
QueryDict.setlist(key, list_)[source]
QueryDict.appendlist(key, item)
QueryDict.setlistdefault(key, default_list=None)
QueryDict.lists()
QueryDict.pop(key) 返回给定键的值列表,并将其从字典中删除
QueryDict.popitem() 删除字典的任意成员(因为没有排序的概念),并返回包含键的两个值元组和键的所有值的列表
QueryDict.dict()
QueryDict.urlencode(safe=None) 以查询字符串格式返回数据的字符串

4、DELETE请求

In [25]: requests.delete(url, data=data)                                                    
Out[25]: <Response [200]>

dashboard/views.py
from django.http import HttpResponse,QueryDict
def index(request):
    if request.method == "GET":
        print("request get =", request.GET)
        data = request.GET.copy()
        data["aa"] = "x"
        print("data=", data)
        print("aa=", request.GET.get("aa"))
        print("cc=", request.GET.getlist("cc"))
    elif request.method == "POST":
        print("request post =", request.POST)
    elif request.method == "DELETE":
        print("request delete =", QueryDict(request.body))
    return HttpResponse("")

返回结果:

request delete = <QueryDict: {'aa': ['bb'], 'cc': ['dd', 'ee']}>
[12/Dec/2018 07:19:16] "DELETE /dashboard/?aa=bb&cc=dd&cc=ee HTTP/1.1" 200 0

猜你喜欢

转载自blog.csdn.net/change_can/article/details/85059515