Django使用HTTP协议向服务器传参方式小结

 更新时间:2021年08月17日 09:42:32   作者:季布,  
本文主要介绍了Django使用HTTP协议向服务器传参方式小结,用户发送请求时携带的参数后端需要使用,而不同的发送参数的方式对应了不同的提取参数的方式,本文就详细的介绍一下

用户发送请求时携带的参数后端需要使用,而不同的发送参数的方式对应了不同的提取参数的方式

利用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:请求中认证出来的用户对象。

到此这篇关于Django使用HTTP协议向服务器传参方式小结的文章就介绍到这了,更多相关Django HTTP协议向服务器传参内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • Python中非常实用的一些功能和函数分享

    Python中非常实用的一些功能和函数分享

    这篇文章主要介绍了Python中非常实用的一些功能和函数分享,本文讲解了带任意数量参数的函数、使用Glob()查找文件、调试、生成唯一ID等内容,需要的朋友可以参考下
    2015-02-02
  • 解决python 3 urllib 没有 urlencode 属性的问题

    解决python 3 urllib 没有 urlencode 属性的问题

    今天小编就为大家分享一篇解决python 3 urllib 没有 urlencode 属性的问题,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2019-08-08
  • Python爬虫实例爬取网站搞笑段子

    Python爬虫实例爬取网站搞笑段子

    这篇文章主要介绍了Python爬虫实例爬取网站搞笑段子,具有一定参考价值,看完了代码不妨看看段子,希望大家每天开心。
    2017-11-11
  • Python实现处理管道的方法

    Python实现处理管道的方法

    这篇文章主要介绍了Python实现处理管道的方法,实例分析了Python实现管道调用子程序的技巧,需要的朋友可以参考下
    2015-06-06
  • 50行Python代码实现视频中物体颜色识别和跟踪(必须以红色为例)

    50行Python代码实现视频中物体颜色识别和跟踪(必须以红色为例)

    本文通过50行Python代码实现视频中物体颜色识别和跟踪效果,通过实例截图和实例代码给大家讲解的非常详细,需要的朋友可以参考下
    2019-11-11
  • Python 手动导包的实现

    Python 手动导包的实现

    本文主要介绍了Python 手动导包的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2023-03-03
  • 如何使用Python VTK高亮显示actor

    如何使用Python VTK高亮显示actor

    这篇文章主要介绍了如何使用Python VTK高亮显示actor,通过Python-VTK在同一个窗口中,高亮显示选中的actor。本例子中的代码,当窗口中的圆球actor被选中时,会变成红色,并且会显示actor三遍面片边缘信息,下文相关内容需要的小伙伴可以参考一下
    2022-04-04
  • Python使用matplotlib.pyplot画热图和损失图的代码详解

    Python使用matplotlib.pyplot画热图和损失图的代码详解

    众所周知,在完成论文相关工作时画图必不可少,如损失函数图、热力图等是非常常见的图,在本文中,总结了这两个图的画法,下面给出了完整的代码,开箱即用,感兴趣的同学可以自己动手尝试一下
    2023-09-09
  • Python eval函数介绍及用法

    Python eval函数介绍及用法

    在本篇文章里小编给大家整理的是一篇关于Python eval函数介绍及用法,有兴趣的朋友们可以参考下。
    2020-11-11
  • python读写csv文件的方法

    python读写csv文件的方法

    这篇文章主要介绍了python读写csv文件的方法,本文通过实例代码给大家介绍的非常详细,具有一定的参考借鉴价值 ,需要的朋友可以参考下
    2019-08-08

最新评论