回想⼀下,利⽤HTTP协议向服务器传参有⼏种途径?
a、提取URL的特定部分,如/film/zhangsan/20/,可以在服务器端的路由中⽤正则表达式截取;
b、查询字符串(query string),形如key1=value1&key2=value2;
c、请求体(body)中发送的数据,⽐如表单数据、json、xml;
d、在http报⽂的头(header)中。
一. URL路径参数
1、如果想从URL中获取值,需要在正则表达式中使⽤分组,
2、获取值分为两种⽅式
2.1、位置参数
a、参数的位置不能错
2.2、关键字参数
a、参数的位置可以变,跟关键字保持⼀致即可
注意:两种参数的⽅式不要混合使⽤,在⼀个正则表达式中只能使⽤⼀种参数⽅式
1、位置参数
子路由:
from django.urls import re_path
from film import views
urlpatterns = [
re_path('^people/(\w+)/(\d+)/$',views.peopleView)
]
视图:
def peopleView(request,age,name):
print(name)
return HttpResponse('%s-%s'%(name,age))
2、关键字参数
子路由
re_path('^people/(?P<name>\w+)/(?P<age>\d+)/$',views.peopleView)
path('people/<str:name>/<int:age>/',views.peopleView),
视图
def peopleView(request,age,name):
print(name)
return HttpResponse('%s-%s'%(name,age))
二、django中的QueryDict对象
HttpRequest对象的属性GET、POST都是QueryDict类型的对象
与python字典不同,QueryDict类型的对象⽤来处理同⼀个键带有多个值的情况
1、request.GET:获取的是QueryDict对象
1、request.GET.get(‘键’):根据键获取值
- 如果⼀个键同时拥有多个值将获取最后⼀个值
- 如果键不存在则返回None值,可以设置默认值进⾏后续处理
- request.GET.get.get(‘键’,默认值)
2、request.GET.getlist(‘键’):根据键获取值,值以列表返回,可以获取指定键的所有值
- 如果键不存在则返回空列表[],可以设置默认值进⾏后续处理
- request.GET.getlist(‘键’,默认值)
def peopleView(request):
print(request.GET) <QueryDict: {'name': ['kb'], 'age': ['18']}>
print(request.GET.get('name1')) None
print(request.GET.get('name')) kb
print(request.GET.getlist('name')) ['kb']
print(request.GET.getlist('name1','wu')) wu
return HttpResponse('response')
三、查询字符串Query String
获取请求路径中的查询字符串参数(形如?k1=v1&k2=v2),可以通过request.GET属性获取,返回QueryDict对象。
def get(request):
a = request.GET.get('a')
b = request.GET.get('b')
alist = request.GET.getlist('a')
print(a) # 3
print(b) # 2
print(alist) # ['1', '3']
return HttpResponse('OK')
特别注意:查询字符串不区分请求⽅式,即假使客户端进⾏POST⽅式的请求,依然可以通过request.GET获取请求中的查询字符串数据。
四、请求体
请求体数据格式不固定,可以是表单类型字符串,可以是JSON字符串,可以是XML字符串,应区别对待。
可以发送请求体数据的请求⽅式有POST、PUT、PATCH、DELETE。
Django默认开启了CSRF防护,会对上述请求⽅式进⾏CSRF防护验证,在测试时可以关闭CSRF防护机制,⽅法为在settings.py⽂件中注释掉CSRF中间件,
4.1 表单类型 Form Data
前端发送的表单类型的请求体数据,可以通过request.POST属性获取,返回QueryDict对象。
def post(request):
print(request.POST) <QueryDict: {'a': ['666'], 'b': ['666']}>
a = request.POST.get('a') 666
b = request.POST.get('b') 888
print(request.POST.getlist('a')) ['666']
print(a)
print(b)
print(alist)
return HttpResponse('OK')
4.2 ⾮表单类型 Non-Form Data
⾮表单类型的请求体数据,Django⽆法⾃动解析,可以通过request.body属性获取最原始的请求体数据,⾃⼰按照请求体格式(JSON、XML等)进⾏解析。request.body返回bytes类型。
def peopleView(request):
#请求体
#将字节数据解码成json格式的字符串
data=request.body.decode() <class 'str'>
print(type(data))
#将json格式的字符串转换为字典格式的
data=json.loads(data)
print(type(data)) <class 'dict'>
print(data) {'uname': 'kb', 'age': 18}
print(data.get('uname')) kb
return HttpResponse('response')
五、请求头
可以通过request.META属性获取请求头headers中的数据,request.META为字典类型。
常见的请求头:
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).
def testview(request):
print(request.META)
print(request.META.get('HTTP_HOST'))
return HttpResponse('hello')
六、其他常⽤HttpRequest对象属性
1、method: ⼀个字符串,表示请求使⽤的HTTP⽅法,常⽤值包括:‘GET’、‘POST’。
2、user: 请求的⽤户对象。
3、path: ⼀个字符串,表示请求的⻚⾯的完整路径,不包含域名和参数部分。
4、encoding: ⼀个字符串,表示提交的数据的编码⽅式。如果为None则表示使⽤浏览器的默认设置,⼀般为utf-8。这个属性是可写的,可以通过修改它来修改访问表单数据使⽤的编码,接下来对属性的任何访问将使⽤新的encoding值。
5、FILES: ⼀个类似于字典的对象,包含所有的上传⽂件。
def testview(request):
print(request.FILES)
return HttpResponse('hello')
<MultiValueDict: {‘a’: [<InMemoryUploadedFile: 新建 XLS 工作表.xls (application/vnd.ms-excel)>]}>
[16/Dec/2021 23:08:58] “POST /film/test/ HTTP/1.1” 200 5