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