Django獲取請求參數(shù)的常用方式
在 Django 中獲取請求參數(shù)的完整方法如下:
一、GET 請求參數(shù)獲取
def view_func(request):
# 獲取單個參數(shù)(推薦方式)
name = request.GET.get('name', 'default') # 帶默認值
age = request.GET.get('age', 0)
# 獲取多個同名參數(shù)(如復(fù)選框)
ids = request.GET.getlist('ids[]') # 返回列表
# 獲取所有參數(shù)
all_params = request.GET.dict() # 返回字典
二、POST 請求參數(shù)獲取
def view_func(request):
# 表單數(shù)據(jù)獲取
if request.method == 'POST':
username = request.POST.get('username')
password = request.POST.get('password')
# 處理多選數(shù)據(jù)
hobbies = request.POST.getlist('hobbies')
# 獲取所有參數(shù)
post_data = request.POST.dict()
三、JSON 請求體參數(shù)獲取
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 路徑參數(shù)獲取
# 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):
# 直接獲取路徑參數(shù)
print(user_id) # 自動轉(zhuǎn)換為整數(shù)
五、文件上傳處理
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. 獲取路徑參數(shù)
print(f"Product ID: {product_id}")
# 2. 獲取GET參數(shù)
page = request.GET.get('page', 1)
search = request.GET.get('q', '')
# 3. 獲取POST參數(shù)
if request.method == 'POST':
data = {
'form_data': request.POST.dict(),
'json_data': {}
}
# 4. 處理JSON數(shù)據(jù)
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.參數(shù)類型轉(zhuǎn)換
# 安全轉(zhuǎn)換示例
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):
# 驗證必要參數(shù)存在
if not all([request.GET.get('token'), request.POST.get('user_id')]):
raise PermissionDenied
# 參數(shù)白名單驗證
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)
九、參數(shù)獲取方法對比
| 參數(shù)位置 | 獲取方式 | 適用場景 |
|---|---|---|
| URL 查詢字符串 | request.GET | 過濾、分頁、搜索參數(shù) |
| 表單數(shù)據(jù) | request.POST | 傳統(tǒng)表單提交 |
| JSON 數(shù)據(jù) | json.loads(request.body) | API 接口、AJAX 請求 |
| 路徑參數(shù) | 視圖函數(shù)參數(shù) | RESTful 資源定位 |
| 文件上傳 | request.FILES | 文件上傳表單 |
| 請求頭信息 | request.META/request.headers | 認證、客戶端信息獲取 |
十、最佳實踐建議
始終對用戶輸入進行驗證和清理
優(yōu)先使用 get() 方法避免 KeyError
對數(shù)值型參數(shù)進行類型轉(zhuǎn)換和范圍驗證
使用 DRF 的 Serializer 處理復(fù)雜參數(shù)驗證
對敏感參數(shù)使用 HTTPS 傳輸
限制 GET 參數(shù)的最大長度(Django 默認 2500 字符)
完整示例項目結(jié)構(gòu):
myproject/
├── myapp/
│ ├── views.py
│ ├── urls.py
│ └── serializers.py
├── utils/
│ └── param_utils.py
└── myproject/
├── settings.py
└── urls.py
到此這篇關(guān)于Django獲取請求參數(shù)的常用方式的文章就介紹到這了,更多相關(guān)Django獲取請求參數(shù)內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Python multiprocess pool模塊報錯pickling error問題解決方法分析
這篇文章主要介紹了Python multiprocess pool模塊報錯pickling error問題解決方法,結(jié)合實例形式分析了multiprocess pool模塊報錯pickling error的原因與解決方法,需要的朋友可以參考下2019-03-03
Python中內(nèi)置函數(shù)append()、extend()的用法及區(qū)別詳解
這篇文章主要介紹了Python中內(nèi)置函數(shù)append()、extend()的用法及區(qū)別,還探討了append()函數(shù)添加列表時發(fā)生的同步變化問題,并提供了解決方案,需要的朋友可以參考下2025-03-03
python發(fā)送byte數(shù)據(jù)組到tcp的server問題
這篇文章主要介紹了python發(fā)送byte數(shù)據(jù)組到tcp的server問題,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教2023-09-09
Python lambda 匿名函數(shù)優(yōu)點和局限性深度總結(jié)
這篇文章主要為大家介紹了Python lambda 匿名函數(shù)的優(yōu)點和局限性深度總結(jié),有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪2022-08-08

