在 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 json
def 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 views
urlpatterns = [
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)八、注意事项
1.参数类型转换
# 安全转换示例
def safe_conversion(request):
page = request.get.get('page', '1')
try:
page_num = int(page)
except valueerror:
page_num = 1
is_admin = request.get.get('admin', 'false').lower() == 'true'
2.安全验证
from django.core.exceptions import permissiondenied
def 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")
3.django rest framework 方式
# serializers.py
from rest_framework import serializers
class 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
到此这篇关于django获取请求参数的常用方式的文章就介绍到这了,更多相关django获取请求参数内容请搜索代码网以前的文章或继续浏览下面的相关文章希望大家以后多多支持代码网!
发表评论