目录
利⽤
HTTP
协议向服务器传参有以下几种途径:
- 提取
URL
的特定部分,如/app/zhangsan/18/
,可以在服务器端的路由中⽤正则表达式截取; - 查询字符串(
query string
),形如key1=value1&key2=value2
; - 请求体(
body
)中发送的数据,⽐如表单数据、json、xml
; - 在
http
报⽂的头(header
)中。
1.URL路径参数
如果想从
URL
中获取值,需要在正则表达式中使⽤分组
获取值分为两种⽅式
- 位置参数 参数的位置不能错
- 关键字参数 参数的位置可以变,跟关键字保持⼀致即可
注意:两种参数的⽅式不要混合使⽤,在⼀个正则表达式中只能使⽤⼀种参数⽅式
分别使⽤以上两种获取
URL
值的⽅式提取出
20 60 http://127.0.0.1:8000/20/60/
位置参数
路由
url
# urls.pyfrom django.urls import re_path
from film import views
urlpatterns =[
re_path('^httprequest/(\w+)/(\d+)/$', views.httpRequestView),]
视图函数
# views.pyfrom django.http import HttpRequest, HttpResponse
# Create your views here.defhttpRequestView(request, uname, age):return HttpResponse(f'My name is {uname} and I am {age} years old!')
访问:
http://127.0.0.1:8000/httprequest/awei/22/
关键字参数
url
# /urls.pyfrom django.urls import path, re_path
from project01 import views
urlpatterns =[
re_path('^people/(?P<name>\w+)/(?P<age>\d+)/$', views.peopleView),
path('people/<str:name>/<int:age>/', views.peopleView),]
视图函数
from django.http import HttpResponse
defpeopleView(request, age, name):"""
:param request:
:param age:
:param name:
:return:
"""print(name)return HttpResponse('My name is %s and I am %s year old!'%(name, age))
访问:
2. Django中的QueryDict对象
HttpRequest
对象的属性
GET、POST
都
QueryDict
类型的对象。
访问
:http://127.0.0.1:8000/people/awei/22/
GET
请求
:<WSGIRequest: GET '/people/awei/22/'>
与
python
字典不同,
QueryDict
类型的对象⽤来处理同⼀个键带有多个值的情况。
⽅法
get()
:根据键获取值
- 如果⼀个键同时拥有多个值将获取最后⼀个值
- 如果键不存在则返回
None
值,可以设置默认值进⾏后续 处理 get('键',默认值)
⽅法
getlist()
:根据键获取值,值以列表返回,可以获取指定键的所有值
- 如果键不存在则返回空列表
[]
,可以设置默认值进⾏后续处理 getlist('键',默认值)
3. 查询字符串Query String
获取请求路径中的查询字符串参数(
形如?k1=v1&k2=v2
),可以通过
request.GET
属性获取,返回
QueryDict
对象。
视图函数
# /get/?uname=awei&age=22&age=18/from django.http import HttpResponse
defqueryView(request):
uname = request.GET.get('uname')
age = request.GET.get('age')
age_list = request.GET.getlist('age')print(f'uname={uname}')print(f'age={age}')print(f'age_list={age_list}')return HttpResponse('QueryDict')
路由
urlpatterns =[
path('query/', views.queryView)]
访问:
http://127.0.0.1:8000/query/?uname=awei&age=22&age=18/
重要:查询字符串不区分请求⽅式,即假使客户端进⾏
POST
⽅式的请求,依然可以通过
request.GET
获取请求中的查询字符串数据。
4. 请求体
请求体数据格式不固定,可以是表单类型字符串,可以是
JSON
字符串,可以是
XML
字符串,应区别对待。
可以发送请求体数据的请求⽅式有
POST、PUT、PATCH、DELETE
。
Django
默认开启了
CSRF
防护,会对上述请求⽅式进⾏
CSRF
防护验证,在测试时可以关闭
CSRF
防护机制,⽅法为在
settings.py
⽂件中注释掉
CSRF
中间件,如:
4.1 表单类型 Form Data
前端发送的表单类型的请求体数据,可以通过
request.POST
属性获取,返回
QueryDict
对象。
defpostView(request):
uname = request.POST.get('uname')
age = request.POST.get('age')
alist = request.POST.getlist('uname')print(f'uname={uname}')print(f'age={age}')print(f'age_list={alist}')return HttpResponse('Post 请求')
4.2 ⾮表单类型 Non-Form Data
⾮表单类型的请求体数据,
Django
⽆法⾃动解析,可以通过
request.body
属性获取最原始的请求体数据,⾃⼰按照请求体格式(
JSON、XML
等)进⾏解析。
request.body
返回
bytes
类型。
例如要获取请求体中的如下
JSON
数据
# 注意测试时,key value必须⽤双引号,value为数字时可以不加。{"uname":"awei","age":22+}
可以进⾏如下⽅法操作:
import json
defpost_json(request):
json_dict = json.loads(request.body.decode())print(req_data['uname'])print(req_data['age'])return HttpResponse('OK')
5. 请求头
可以通过
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,ifany.
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,ifany.
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).
具体使⽤如:
defget_headers(request):print(request.META['CONTENT_TYPE'])return HttpResponse('OK')
6. 其他常⽤HttpRequest对象属性
method
:⼀个字符串,表示请求使⽤的HTTP
⽅法,常⽤值包括:'GET'
、'POST'
。user
:请求的⽤户对象。path
:⼀个字符串,表示请求的⻚⾯的完整路径,不包含域名和参数部分。encoding
:⼀个字符串,表示提交的数据的编码⽅式。- 如果为
None
则表示使⽤浏览器的默认设置,⼀般为utf-8
。
- 如果为
- 这个属性是可写的,可以通过修改它来修改访问表单数据使⽤的编码,接下来对属性的任何访问将使⽤新的
encoding
值。
- 这个属性是可写的,可以通过修改它来修改访问表单数据使⽤的编码,接下来对属性的任何访问将使⽤新的
FILES
:⼀个类似于字典的对象,包含所有的上传⽂件。
版权归原作者 北极的三哈 所有, 如有侵权,请联系我们删除。