devops——3、接收並處理請求引數與QueryDict物件
阿新 • • 發佈:2019-01-14
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