在 Django 中获取请求参数的完整方法如下:
一、GET 请求参数获取
def view_func(request):# 获取单个参数(推荐方式)name = request.GET.get('name', 'default') # 带默认值age = request.GET.get('age', 0)# 获取多个同名参数(如复选框)ids = request.GET.getlist('ids[]') # 返回列表# 获取所有参数all_params = request.GET.dict() # 返回字典
二、POST 请求参数获取
def view_func(request):# 表单数据获取if request.method == 'POST':username = request.POST.get('username')password = request.POST.get('password')# 处理多选数据hobbies = request.POST.getlist('hobbies')# 获取所有参数post_data = request.POST.dict()
三、JSON 请求体参数获取
import jsondef view_func(request):if request.method == 'POST':try:data = json.loads(request.body)username = data.get('username')age = data.get('age')except json.JSONDecodeError:return HttpResponseBadRequest("Invalid JSON")
四、URL 路径参数获取
# urls.py
from django.urls import path
from . import viewsurlpatterns = [path('user/<int:user_id>/', views.user_detail),
]# views.py
def user_detail(request, user_id):# 直接获取路径参数print(user_id) # 自动转换为整数
五、文件上传处理
def upload_file(request):if request.method == 'POST':uploaded_file = request.FILES.get('myfile')if uploaded_file:# 保存文件到指定位置with open(f'uploads/{uploaded_file.name}', 'wb+') as destination:for chunk in uploaded_file.chunks():destination.write(chunk)return HttpResponse("File uploaded")
六、请求头信息获取
def get_headers(request):user_agent = request.META.get('HTTP_USER_AGENT')content_type = request.META.get('CONTENT_TYPE')auth_token = request.headers.get('Authorization') # Django 2.2+
七、综合示例
def complex_example(request, product_id):# 1. 获取路径参数print(f"Product ID: {product_id}")# 2. 获取GET参数page = request.GET.get('page', 1)search = request.GET.get('q', '')# 3. 获取POST参数if request.method == 'POST':data = {'form_data': request.POST.dict(),'json_data': {}}# 4. 处理JSON数据if request.content_type == 'application/json':try:data['json_data'] = json.loads(request.body)except json.JSONDecodeError:pass# 5. 获取文件uploaded_file = request.FILES.get('attachment')# 6. 获取请求头client_ip = request.META.get('REMOTE_ADDR')return JsonResponse(data)
八、注意事项
- 参数类型转换
# 安全转换示例
def safe_conversion(request):page = request.GET.get('page', '1')try:page_num = int(page)except ValueError:page_num = 1is_admin = request.GET.get('admin', 'false').lower() == 'true'
- 安全验证
from django.core.exceptions import PermissionDenieddef secure_view(request):# 验证必要参数存在if not all([request.GET.get('token'), request.POST.get('user_id')]):raise PermissionDenied# 参数白名单验证allowed_params = {'page', 'sort', 'filter'}if not set(request.GET.keys()).issubset(allowed_params):return HttpResponseBadRequest("Invalid parameters")
- Django REST Framework 方式
# serializers.py
from rest_framework import serializersclass UserSerializer(serializers.Serializer):username = serializers.CharField()email = serializers.EmailField()# views.py
from rest_framework.decorators import api_view
from rest_framework.response import Response@api_view(['POST'])
def drf_example(request):serializer = UserSerializer(data=request.data)if serializer.is_valid():username = serializer.validated_data['username']return Response({'status': 'success'})return Response(serializer.errors, status=400)
九、参数获取方法对比
参数位置 | 获取方式 | 适用场景 |
---|---|---|
URL 查询字符串 | request.GET | 过滤、分页、搜索参数 |
表单数据 | request.POST | 传统表单提交 |
JSON 数据 | json.loads(request.body) | API 接口、AJAX 请求 |
路径参数 | 视图函数参数 | RESTful 资源定位 |
文件上传 | request.FILES | 文件上传表单 |
请求头信息 | request.META /request.headers | 认证、客户端信息获取 |
十、最佳实践建议
- 始终对用户输入进行验证和清理
- 优先使用
get()
方法避免 KeyError - 对数值型参数进行类型转换和范围验证
- 使用 DRF 的 Serializer 处理复杂参数验证
- 对敏感参数使用 HTTPS 传输
- 限制 GET 参数的最大长度(Django 默认 2500 字符)
完整示例项目结构:
myproject/
├── myapp/
│ ├── views.py
│ ├── urls.py
│ └── serializers.py
├── utils/
│ └── param_utils.py
└── myproject/├── settings.py└── urls.py