1. 程式人生 > >devops——3、接收並處理請求引數與QueryDict物件

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