django 学习笔记-视图接收http请求
视图接收http请求
在http请求和响应过程中, 用户往往会在请求过程中发送请求信息给服务端.
# print(request.method) # 获取http请求动作 GET
# print(request.path) #获取路由地址 /student/index
# print(request.path_info) # /student/index
# print(request.get_port()) #获取端口 8000
# 补充说明: 只要引入queryDict模块,一般得到的都是一个querydict字典
from django.http.request import QueryDict
QueryDict 是一个经过封装的字典,提供了基本的字典操作,还提供额外的操作给开发者获取字典内部的数据.
因为python基本数据类型dict是无法让字典在一个key下指向多个值的,所以django封装了一个新的字典来实现.
# 获取querydict字典数据的方法
# 常用方法:
get() # 根据指定的键获取一个值
getlist() # 根据指定的键获取所有值,以列表格式返回
dict() # 把整个查询字符串对象转换成字典格式[此时参数会去重]
1. 查询字符串[Query String]
所谓的查询字符串就是url地址上面?号后面的数据,例如:
http://127.0.0.1:8000/index?name=xiaoming&pwd=123456
上面name=xiaoming&pwd=123456就是查询字符串
可以通过 request.GET 来获取,注意: GET不是http请求,也就是说,只要地址上有查询字符串,都可以通过 request.GET 来获取.
# 常用方法:
get() # 根据指定的键获取一个值
getlist() # 根据指定的键获取所有值,以列表格式返回
dict() # 把整个查询字符串对象转换成字典格式[此时参数会去重]
2. 请求体数据
#获取请求体数据(请求正文) request body
**注意:常用的http请求方法中,只有post,put和patch请求才会有请求体数据**
request.body # 获取原始的请求体 :在postman的body里面的raw下输入的内容,请求方式是post
request.POST # 只能获取表单数据:在postman的body里面的form-data下输入的内容
** request.body(raw内容) 和request.POST(表单内容)只能选一种获取,不能同时获取,否则会报错
3. 请求头报文信息
# 获取请求头信息 request.headers
# 获取在postman里面的Headers里面的内容
"""
{
'Content-Type': 'multipart/form-data;
'User-Agent': 'PostmanRuntime/7.26.10',
'Host': '127.0.0.1:8000',
}
"""
# request.META
"""
{
'SERVER_NAME': 'ubuntu', # 当前项目运行的服务器名称
'SERVER_PORT': '8000', # 当前服务端对外提供服务的端口
'REMOTE_ADDR': '127.0.0.1', # 客户端的IP地址[代理IP]
}
"""
# 因为QueryDict是一个伪字典对象,所以可以通过get或者中括号获取到数据
print(request.META.get("REMOTE_ADDR")) # 127.0.0.1
"""获取自定义请求头,属于客户端开发人员自己声明的请求头(书写在Headers里面)"""
print(request.headers.get("Company")) # OldobyEd
4. 上传文件
# 获取上传文件 request.FILES
# 获取上传文件 在postman里面的body里面的form-data里面的key里面输入文件名,
request.FILES
1 . 获取查询字符串的参数
所谓的查询字符串就是url地址上面?号后面的数据,例如:
http://127.0.0.1:8000/index?name=xiaoming&pwd=123456
上面' name=xiaoming&pwd=123456 ' 就是查询字符串
可以通过 request.GET 来获取,注意: GET不是http请求,也就是说只要地址上有查询字符串,都可以通过 request.GET 来获取.
通过子应用views中的视图函数来获取
home/views.py代码
"""查询字符串[Query String]"""
def index(request):
# request是一个对象,是客户端请求web服务端时,wsgi服务器把客户端请求的报文解析成数据保存到request
print(request) # <WSGIRequest: GET '/student/index'>
# request本质就是 WSGIRequest的实例对象,父类是 from django.http.request import HttpRequest
# request提供用于获取http请求的信息的大部分属性都是父类声明的
# print(request.method) # 获取http请求动作 GET
# print(request.path) #获取路由地址 /student/index
# print(request.path_info) # /student/index
# print(request.get_port()) #获取端口 8000
获取http请求的查询字符串(Query String)或者查询参数(Query Params)
print(request.GET)
"""
postman的请求地址:
GET 127.0.0.1:8000/student/index?name=xiaoming&pwd=123&lve=swimming&lve=shop"""
'''
那么打印效果:
<QueryDict: {'name': ['xiaoming'], 'pwd': ['123'], 'lve': ['swimming', 'shop']}>
分析:
这次就获取到了name和pwd,lve参数以及参数的值
注意:
因为客户端传递过来的参数有可能多个值的情况,所以查询字符串返回的数据值都是列表格式'''
补充说明:
from django.http.request import QueryDict
QueryDict 是一个经过封装的字典,提供了基本的字典操作,还提供额外的操作给开发者获取字典内部的数据.
因为python基本数据类型dict是无法让字典在一个key下指向多个值的情况,所以django封装了一个新的字典来实现.
## 获取这个字典数据的常用方法:
get() # 根据指定的键获取一个值
getlist() # 根据指定的键获取所有值,以列表格式返回
dict() # 把整个查询字符串对象转换成字典格式[此时参数会去重]
# 获取一个参数值
# 因为QueryDict是一个伪字典对象,所以可以通过get或者中括号获取到数据
print(request.GET.get("name")) # xiaoming
print(request.GET["lve"]) # shop 只会获取最后一个值,后面的值覆盖了前面的值
# 有部分参数就一个名称对应多个值,获取参数的所有值我们使用getlist
print(request.GET.getlist("lve")) # ['swimming', 'shop']
# 把整个查询字符串转换成字典格式
print(request.GET.dict()) # {'name': 'xiaoming', 'pwd': '123', 'lve': 'shop'}
# 视图函数必须有返回值
return HttpResponse("hello querystring")
home/urls.py路由绑定视图代码
from django.urls import path
from . import views
urlpatterns = [
path("index", views.index ),
...
]
2 . 获取请求体数据
注意:常用的http请求方法中,只有post,put和patch请求才会有请求体数据
home/views.py 视图函数代码
def index(request):
"""获取请求体数据(请求正文) request body"""
# print(request.body) # 获取原始的请求体 :在postman的body里面的raw下输入的内容,请求方式是post
运行的manage里面打印的结果
打印效果:是json格式
b'{\n "username":"xiaoming",\n "age":16\n}'
说明:
通过body来获取数据,处理过程如下,比较麻烦:
import json
body_dict = json.loads(request.body) ->json 反序列化为字典格式
print(body_dict) # {'username': 'xiaoming', 'age': 16}
在打印下面的结果是先注释上面的json反序列化代码..
# request.POST 只能获取表单数据:在postman的body里面的form-data下输入的内容
print( request.POST )
"""
打印效果:
<QueryDict: {'username': ['xiaohuihui'], 'passsword': ['123456']}>
"""
## request.body(raw内容) 和request.POST(表单内容)只能选一种获取,不能同时获取,否则会报错
return HttpResponse("hello body")
home/urls.py 路由绑定视图代码
from django.urls import path
from . import views
urlpatterns = [
path("index", views.index ),
...
]
3 . 获取请求头数据
home/views.py 视图函数代码
def headers(request):
"""获取请求头信息"""
print(request.headers) # 获取在postman里面的Headers里面的内容
"""
{
'Content-Type': 'multipart/form-data;
'User-Agent': 'PostmanRuntime/7.26.10',
'Host': '127.0.0.1:8000',
}
"""
print(request.META)
"""
{
'SERVER_NAME': 'ubuntu', # 当前项目运行的服务器名称
'SERVER_PORT': '8000', # 当前服务端对外提供服务的端口
'REMOTE_ADDR': '127.0.0.1', # 客户端的IP地址[代理IP]
}
"""
# 因为QueryDict是一个伪字典对象,所以可以通过get或者中括号获取到数据
print(request.META.get("REMOTE_ADDR")) # 127.0.0.1
"""获取自定义请求头,属于客户端开发人员自己声明的请求头(书写在Headers里面)"""
print(request.headers.get("Company")) # OldobyEdu
return HttpResponse("request header")
home/urls.py 路由绑定视图代码
from django.urls import path
from . import views
urlpatterns = [
path("index", views.index ),
...
]
4 . 获取上传文件
home/views.py视图函数代码
def files(request):
"""获取上传文件"""
# 获取上传文件 在postman里面的body里面的form-data里面的key里面输入文件名,
# print( request.FILES )
"""
form-data类型选择file,在右边的selectfiles里面上传文件,在这里就可以获取到.
打印效果:
<MultiValueDict: {'myfile': [<InMemoryUploadedFile: release-roadmap.688d8d65db0b.png (image/png)>]}>
MultiValueDict 就是QueryDict的父类
"""
print( request.FILES.get("myfile") ) #获取文件名
# 获取文件对象<class 'django.core.files.uploadedfile.InMemoryUploadedFile'>
print( type( request.FILES.get("myfile") ) )
return HttpResponse("request files")
home/urls.py 路由绑定视图代码
from django.urls import path
from . import views
urlpatterns = [
path("index", views.index ),
...
]

浙公网安备 33010602011771号