5.5 请求参数处理
Django6教程:请求参数处理详解 | 路径参数、查询参数、请求头与请求体
本教程详细讲解Django6中的请求参数处理,包括路径参数提取与验证、查询参数(GET参数)处理、请求头与请求体数据获取,附带代码示例,适合初学者快速上手。
Django6 请求参数处理详解
在 Django Web 开发中,处理客户端请求是核心任务之一。请求参数包括 URL 路径中的参数、查询参数(如 GET 参数)、请求头和请求体数据。本教程将逐一讲解这些内容,帮助你快速掌握 Django6 中的请求处理技巧。
一、路径参数提取与验证
路径参数是 URL 路径的一部分,用于传递特定数据。在 Django 中,通过在 URLconf(路由配置)中定义参数,并在视图函数或类视图中使用。
1. 定义路径参数
在 urls.py 文件中,使用尖括号 <parameter_name> 定义路径参数。Django6 支持多种路径转换器(如 int、str、slug 等),用于自动验证和转换参数类型。
示例代码:
# 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.POST、request.body 等属性访问。
1. 表单数据(POST 请求)
对于 application/x-www-form-urlencoded 或 multipart/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.POST、request.json()或request.body。 - 验证:始终验证输入数据,避免安全风险(如 SQL 注入、XSS)。
- 错误处理:返回适当的 HTTP 状态码(如 400 表示错误请求)。
通过学习本教程,你应该能掌握 Django6 中请求参数的基本处理。练习这些技巧,构建更健壮的 Web 应用!