Django使用HTTP协议向服务器传参方式小结
作者:季布, 发布时间:2023-03-08 11:31:20
目录
1.查询字符串数据(query string):
2. 提取请求体数据
2.1 表单类型请求体数据(Form Data)
2.2 非表单类型请求体数据(Non-Form Data):JSON
3. URL路径参数:提取URL路径中的特定部分数据
3.1 path()提取路径参数
3.2 re_path()提取路径参数
3.3 path()和re_path()如何选择?
4. 请求头
5. 其他常用HttpRequest对象属性
用户发送请求时携带的参数后端需要使用,而不同的发送参数的方式对应了不同的提取参数的方式
利用HTTP协议向服务器传参有几种途径?
1.查询字符串数据(query string):
形如:?key1=value1&key2=value2
比如:http://127.0.0.1:8000/?name =lx&age=0中的?name =lx
1)获取请求路径中的查询字符串参数,形如:?k1=v1&k2=v2
2)可以通过request.GET属性获取,并返回QueryDict类型的对象
class TestQuery(View):
def get(self, request):
# 获取查询字符串参数name、age
name = request.GET.get('name', 'lx')
age = request.GET.get('age', '0')
return HttpResponse('查询字符串参数:%s %s' % (name, age))
重要提示:
提取查询字符串参数不区分请求方式,即使客户端进行POST方式的请求,依然可以通过request.GET获取请求中的查询字符串参数。
QueryDict补充:
1)QueryDict是由Django自己封装的一个数据类型,继承自python的字典Dict,它被定义在django.http.QueryDict中专门用来存储请求中提取的查询字符串参数和请求体参数.即,HttpRequest对象中的属性GET、POST都是QueryDict类型的数据
2. 提取请求体数据
1)可以发送请求体数据的请求方式有:POST、PUT、PATCH、DELETE
2)请求体数据格式不固定,常见的有:表单类型数据和JSON字符串类型,我们应区别对待
2.1 表单类型请求体数据(Form Data)
前端发送的表单类型的请求体数据,可以通过request.POST属性获取,并返回QueryDict对象。
class TestQuery(View):
def post(self, request):
# 获取表单类型请求体参数中的username、password
username = request.POST.get('username')
password = request.POST.get('password')
return HttpResponse('表单类型请求体参数:%s %s' % (username, password))
重要提示:
request.POST只能用来获取POST表单发送的请求体数据
2.2 非表单类型请求体数据(Non-Form Data):JSON
1)非表单类型的请求体数据,Django无法自动解析,可以通过request.body属性获取最原始的请求体数据
2)request.body获取的是bytes类型的请求体原始数据
class TestQuery(View):
def post(self, request):
# 获取请求体中原始的JSON数据
json_str = request.body
# 使用json模块将原始的JSON数据转字典
json_dict = json.loads(json_str)
# 请求体参数中的username、password
username = json_dict.get('username')
password = json_dict.get('password')
return HttpResponse('表单类型请求体参数:%s %s' % (username, password))
结果展示:
3. URL路径参数:提取URL路径中的特定部分数据
1)在定义路由时,可以从URL中获取特定部分的路径参数
2)Django的路由系统会将提取的路径参数传递到视图的内部
3)path()和re_path()都可以提取路径参数
需求1:http://127.0.0.1:8000/pratice/register/18/
提取路径中的数字18
需求2:http://127.0.0.1:8000/pratice/register/18500000000/
提取路径中的手机号18500000000
3.1 path()提取路径参数
测试path()提取普通路径参数:http://127.0.0.1:8000/pratice/register/18/
path(‘pratice/register/int:age/', views.URLParam1View.as_view()),
class TestQuery(View):
def get(self, request, age):
#提取路径参数是在路由中完成的,因为路径是在路由系统中处理的
print('提取的路径传参:',age)
return HttpResponse('path()提取普通路径参数:%s' % age)
路由中提取路径参数时,使用的关键字,必须跟视图中参数名一致
思考:
实现需求1时提取age数字的int:age是什么?
路由转换器
Django默认封装了一些正则表达式,用于在path()中要提取路径参数时使用
默认的路由转换器:
位置在django.urls.converters.py
DEFAULT_CONVERTERS = {
'int': IntConverter(), # 匹配正整数,包含0
'path': PathConverter(), # 匹配任何非空字符串,包含了路径分隔符
'slug': SlugConverter(), # 匹配字母、数字以及横杠、下划线组成的字符串
'str': StringConverter(), # 匹配除了路径分隔符(/)之外的非空字符串,这是默认的形式
'uuid': UUIDConverter(), # 匹配格式化的uuid,如 075194d3-6885-417e-a8a8-6c931e272f00
}
源码解析:
实现需求2
http://127.0.0.1:8000/pratice/register/18500000000/
提取路径中的手机号18500000000
问题:
1)默认的路由转换器中,没有专门用来匹配手机号的路由转换器
2)所以在使用path()实现需求2时,就无法直接使用默认的路由转换器
解决方案:
如果默认的路由转换器无法满足需求时,我们就需要自定义路由转换器
在任意可以被导入的python文件中,都可以自定义路由转换器
from django.urls import path, register_converter
from . import views
class MobileConverter:
"""自定义路由转换器:匹配手机号"""
# 匹配手机号码的正则
regex = '1[3-9]\d{9}'
def to_python(self, value):
# 将匹配结果传递到视图内部时使用
return int(value)
def to_url(self, value):
# 将匹配结果用于反向解析传值时使用
return str(value)
# 注册自定义路由转换器
# register_converter(自定义路由转换器, '别名')
register_converter(MobileConverter, 'mobile')
urlpatterns = [
# path('pratice/register/<‘路由转换器':<变量>, views.TestQuery.as_view()),
# path('pratice/register/<int:age>', views.TestQuery.as_view()),
path('pratice/register/<mobile:phone_num>', views.TestQuery.as_view()),
]
class TestQuery(View):
def get(self, request,phone_num):
#提取路径参数是在路由中完成的,因为路径是在路由系统中处理的
print('提取的路径传参:',phone_num)
return HttpResponse('path()提取普通路径参数:%s' % phone_num)
效果展示
3.2 re_path()提取路径参数
re_path(r'^pratice/register/(?P<phone_num>1[3-9]\d{9})/$', views.TestQuery.as_view()),
class TestQuery(View):
def get(self, request,phone_num):
#提取路径参数是在路由中完成的,因为路径是在路由系统中处理的
print('提取的路径传参:',phone_num)
return HttpResponse('path()提取普通路径参数:%s' % phone_num)
3.3 path()和re_path()如何选择?
1)path()语法相对简洁一些,如果没有路径参数要提取或者要提取的路径参数可以使用默认的路由转换器实现时,就选择path()。
2)re_path()语法相对复杂一些,但是,如果希望在匹配路由时,由自己编写所有的正则式,就选择re_path()。
需要注意的是,在使用re_path()时,网络地址正则表达式一定要写完整,要有严格的开头和结尾
4. 请求头
可以通过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).
class HeadersParamView(View):
"""提取请求头参数"""
def get(self, request):
# 获取请求头中文件的类型
ret = request.META.get('CONTENT_TYPE')
return http.HttpResponse('go')
5. 其他常用HttpRequest对象属性
method:一个字符串,表示请求使用的HTTP方法,常用值包括:'GET'、'POST'。
FILES:一个类似于字典的对象,包含所有的上传文件。
COOKIES:一个字符串,包含了浏览器自动发送的cookie缓存数据。
user:请求中认证出来的用户对象。
来源:https://blog.csdn.net/weixin_47906106/article/details/119700560


猜你喜欢
- 在TypeScript 项目中,我们经常需要使用声明一系列的ts类型。然而,手动写的效率实在太低,编写一个自动生成ts类型的工具可以解放生产
- 目录查找算法 -- 简介顺序查找二分查找插值查找斐波那契查找树表查找1、二叉树查找算法。2、平衡查找树之2-3查找树(2-3 Tree)3、
- Python实现模拟时钟代码推荐# coding=utf8import sys, pygame, math, randomfrom pyga
- 实验目的主要是获取2021年今日说法每期节目主要内容及时间今日说法的网址为:http://tv.cctv.com/lm/jrsf/index
- 本文实例讲述了Python爬虫框架Scrapy基本用法。分享给大家供大家参考,具体如下:Xpath<html><head&
- 问题在Django中使用mysql偶尔会出现数据库连接丢失的情况,错误通常有如下两种OperationalError: (2006,
- 1、||(逻辑或),从字面上来说,只有前后都是false的时候才返回false,否则返回true。alert(true||false); /
- 简介CountVectorizer官方文档。将一个文档集合向量化为为一个计数矩阵。如果不提供一个先验字典,不使用分析器做某种特征选择,那么特
- 如下所示:list = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10] slice = random.sample(list
- 之前一直使用的是MySQL5.7,但由于MySQL增加了一些新特性,所以选择了更新。下载MySQL进入MySQL官网下载地址,选择Windo
- 一、下载镜像docker Hub官网URL:https://hub.docker.com/_/mysql/下载最新版本:docker pul
- MySQL查询不使用索引汇总众所周知,增加索引是提高查询速度的有效途径,但是很多时候,即使增加了索引,查询仍然不使用索引,这种情况严重影响性
- 凯撒加密就是通过将字母移动一定的位数来实现加密和解密。明文中的所有字母都在字母表上向后(或向前)按照一个固定数目进行偏移,被替换成密文。例如
- Notepad++是一款不错的编辑器,很轻巧,我很喜欢它。再换个主题,加个代码高亮,看上去就更专业了。如果你是Mac用户,应该听说或使用过T
- int(整型)在32位机器上,整数的位数为32位,取值范围为-2**31~2**31-1,即-2147483648~2147483647在6
- 首先抛出我们在讨论使用回调编程时的一些观点:激活errback是非常重要的。由于errback的功能与except块相同,因此用户需要确保它
- 1、简介 table_cache是一个非常重要的MySQL性能参数,它在5.1.3之后的版本中叫做table_open_cache。tabl
- 数组是一种有序的集合,可随时添加、删除其中的元素book = ['xiao zhu pei qi','xiao ji
- asp使用WScript.Shell获取电脑的网络配置信息Option Explicit Dim WSHShe
- 前言大家都知道Python的优点是开发效率高,使用方便,C++则是运行效率高,这两者可以相辅相成,不管是在Python项目中嵌入C++代码,