Django 6中文教程

5.5 请求参数处理

Django6教程:请求参数处理详解 | 路径参数、查询参数、请求头与请求体

Django 6中文教程

本教程详细讲解Django6中的请求参数处理,包括路径参数提取与验证、查询参数(GET参数)处理、请求头与请求体数据获取,附带代码示例,适合初学者快速上手。

推荐工具
PyCharm专业版开发必备

功能强大的Python IDE,提供智能代码补全、代码分析、调试和测试工具,提高Python开发效率。特别适合处理列表等数据结构的开发工作。

了解更多

Django6 请求参数处理详解

在 Django Web 开发中,处理客户端请求是核心任务之一。请求参数包括 URL 路径中的参数、查询参数(如 GET 参数)、请求头和请求体数据。本教程将逐一讲解这些内容,帮助你快速掌握 Django6 中的请求处理技巧。

一、路径参数提取与验证

路径参数是 URL 路径的一部分,用于传递特定数据。在 Django 中,通过在 URLconf(路由配置)中定义参数,并在视图函数或类视图中使用。

1. 定义路径参数

urls.py 文件中,使用尖括号 <parameter_name> 定义路径参数。Django6 支持多种路径转换器(如 intstrslug 等),用于自动验证和转换参数类型。

示例代码:

# urls.py
from django.urls import path
from . import views

urlpatterns = [
    path('user/<int:user_id>/', views.user_detail, name='user_detail'),
    path('article/<slug:slug>/', views.article_detail, name='article_detail'),
]

在上例中:

  • <int:user_id> 定义一个整数参数,访问 /user/123/ 时,user_id 会被自动转换为整数 123。
  • <slug:slug> 定义一个 slug 参数(只包含字母、数字、连字符和下划线),用于 SEO 友好的 URL。

2. 在视图中提取和验证参数

在视图函数或类视图中,路径参数作为参数传入。Django 会自动进行类型转换,但如果参数无效(如非整数),会返回 404 错误。

示例视图函数:

# views.py
from django.http import HttpResponse
from django.shortcuts import get_object_or_404
from .models import User

def user_detail(request, user_id):
    # 验证 user_id 为正整数(Django 已做基本转换,这里可添加额外验证)
    if user_id <= 0:
        return HttpResponse("Invalid user ID", status=400)
    
    # 使用参数查询数据库
    user = get_object_or_404(User, id=user_id)
    return HttpResponse(f"User: {user.username}")

def article_detail(request, slug):
    # slug 参数已由路径转换器验证,这里可直接使用
    return HttpResponse(f"Article slug: {slug}")

验证提示

  • 利用路径转换器(如 int)进行基本类型验证。
  • 在视图中添加业务逻辑验证,如范围检查或数据库查询。

二、查询参数(GET 参数)处理

查询参数是 URL 中问号 ? 后面的键值对,常用于 GET 请求传递数据。在 Django 中,通过 request.GET 对象访问。

1. 获取查询参数

request.GET 是一个类似字典的对象,可以获取单个参数或多个参数。

示例代码:

# views.py
from django.http import HttpResponse

def search(request):
    # 获取单个参数,如果不存在则返回 None
    query = request.GET.get('q')
    
    # 获取带默认值的参数
    page = request.GET.get('page', 1)  # 默认值为 1
    
    # 获取多个值(如复选框多选),返回列表
    categories = request.GET.getlist('category')
    
    if query:
        return HttpResponse(f"Search for: {query}, Page: {page}, Categories: {categories}")
    else:
        return HttpResponse("Please provide a search query.")

2. 处理查询参数

  • 验证参数:使用 get() 方法避免 KeyError,并添加类型转换。
  • 构建 URL:在模板中使用 {% url %} 标签或 reverse() 函数时,查询参数不会被自动处理,需要手动添加。

示例:处理分页参数。

def list_items(request):
    page = request.GET.get('page', 1)
    try:
        page = int(page)
        if page < 1:
            page = 1
    except ValueError:
        page = 1
    
    return HttpResponse(f"Page: {page}")

三、请求头数据获取

请求头包含客户端和服务器之间的元数据,如 User-Agent、Content-Type 等。在 Django 中,通过 request.META 字典访问。

1. 访问请求头

request.META 是一个字典,键是 HTTP 头名称,但经过转换(如 HTTP_USER_AGENT 对应 User-Agent 头)。

示例代码:

# views.py
from django.http import HttpResponse

def check_header(request):
    # 获取 User-Agent 头
    user_agent = request.META.get('HTTP_USER_AGENT', 'Unknown')
    
    # 获取 Content-Type 头
    content_type = request.META.get('CONTENT_TYPE', 'Not specified')
    
    # 其他常用头
    referer = request.META.get('HTTP_REFERER', 'No referer')
    
    return HttpResponse(f"User-Agent: {user_agent}, Content-Type: {content_type}, Referer: {referer}")

2. 常用请求头

  • HTTP_USER_AGENT: 客户端浏览器信息。
  • CONTENT_TYPE: 请求体的媒体类型(如 application/json)。
  • HTTP_REFERER: 来源页面 URL。

注意:Django 将 HTTP 头键转换为大写,并添加 HTTP_ 前缀(标准头除外)。

四、请求体数据获取

请求体用于 POST、PUT 等请求传递数据,如表单数据或 JSON 数据。在 Django 中,通过 request.POSTrequest.body 等属性访问。

1. 表单数据(POST 请求)

对于 application/x-www-form-urlencodedmultipart/form-data 类型的表单数据,使用 request.POST 对象。

示例代码:

# views.py
from django.http import HttpResponse

def submit_form(request):
    if request.method == 'POST':
        # 获取表单字段
        username = request.POST.get('username')
        email = request.POST.get('email')
        
        # 处理数据
        if username and email:
            return HttpResponse(f"Submitted: {username}, {email}")
        else:
            return HttpResponse("Please fill all fields.", status=400)
    else:
        return HttpResponse("Only POST requests allowed.", status=405)

2. JSON 数据

对于 application/json 类型的请求,需要解析 request.body。Django6 提供了 request.json() 方法简化处理。

示例代码:

# views.py
from django.http import JsonResponse
import json

def api_endpoint(request):
    if request.method == 'POST':
        # 方法1:使用 request.json()(Django 6 新增)
        try:
            data = request.json()
        except json.JSONDecodeError:
            return JsonResponse({"error": "Invalid JSON"}, status=400)
        
        # 方法2:手动解析(兼容旧版本)
        # data = json.loads(request.body)
        
        # 处理数据
        name = data.get('name')
        return JsonResponse({"message": f"Hello, {name}"})
    else:
        return JsonResponse({"error": "Method not allowed"}, status=405)

3. 文件上传

对于文件上传,使用 request.FILES 对象。

示例:

def upload_file(request):
    if request.method == 'POST':
        file = request.FILES.get('myfile')
        if file:
            # 保存文件或处理
            return HttpResponse(f"File uploaded: {file.name}")
        else:
            return HttpResponse("No file provided.", status=400)

五、总结与最佳实践

  • 路径参数:使用 URLconf 定义和转换器验证,在视图中添加业务逻辑检查。
  • 查询参数:通过 request.GET 获取,处理默认值和多值参数。
  • 请求头:通过 request.META 访问,注意键的转换。
  • 请求体:根据 Content-Type 使用 request.POSTrequest.json()request.body
  • 验证:始终验证输入数据,避免安全风险(如 SQL 注入、XSS)。
  • 错误处理:返回适当的 HTTP 状态码(如 400 表示错误请求)。

通过学习本教程,你应该能掌握 Django6 中请求参数的基本处理。练习这些技巧,构建更健壮的 Web 应用!

开发工具推荐
Python开发者工具包

包含虚拟环境管理、代码格式化、依赖管理、测试框架等Python开发全流程工具,提高开发效率。特别适合处理复杂数据结构和算法。

获取工具包