利?
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
from django.urls import re_path
from film import views
urlpatterns = [
re_path('^httprequest/(\w+)/(\d+)/$', views.httpRequestView),
]
视图函数
from django.http import HttpRequest, HttpResponse
def httpRequestView(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
from 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
def peopleView(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() :根据键获取值
?法getlist() :根据键获取值,值以列表返回,可以获取指定键的所有值
- 如果键不存在则返回空列表
[] ,可以设置默认值进?后续处理 getlist('键',默认值)
3. 查询字符串Query String
获取请求路径中的查询字符串参数(形如?k1=v1&k2=v2 ),可以通过request.GET 属性获取,返回QueryDict 对象。
视图函数
from django.http import HttpResponse
def queryView(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 对象。
def postView(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 数据
{"uname": "awei", "age": 22+}
可以进?如下?法操作:
import json
def post_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, 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 get_headers(request):
print(request.META['CONTENT_TYPE'])
return HttpResponse('OK')
6. 其他常?HttpRequest对象属性
-
method :?个字符串,表示请求使?的HTTP ?法,常?值包括:'GET' 、'POST' 。 -
user :请求的?户对象。 -
path :?个字符串,表示请求的??的完整路径,不包含域名和参数部分。 -
encoding :?个字符串,表示提交的数据的编码?式。 -
- 如果为
None 则表示使?浏览器的默认设置,?般为utf-8 。 -
- 这个属性是可写的,可以通过修改它来修改访问表单数据使?的编码,接下来对属性的任何访问将使?新的
encoding 值。 -
FILES :?个类似于字典的对象,包含所有的上传?件。
|