Django HTTP传参全解析:Query、Body、URL及Headers提取指南

Leo
Leo
发布时间:2026-10-15 | 4人浏览过
原创

本文详细总结Django中五种HTTP传参方式:查询字符串、表单数据、JSON请求体、URL路径参数及请求头。重点解析request.GET、request.POST、request.body及request.META属性的用法,并深入讲解path()与re_path()提取路径参数的区别,包括默认转换器与自定义MobileConverter的实现。

当用户发起请求时,后端需要接收并处理携带的参数。不同的参数发送方式决定了后端提取参数的具体方法。

利用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) 可以发送请求体数据的 HTTP 方法包括: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 相关产品和应用

全部下载

专题列表