Django获取请求参数的常用方式

作者:

文章目录
  • 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() # 返回字典
  • 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()
  • 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”)
  • # 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获取请求参数内容请搜索风君子博客以前的文章或继续浏览下面的相关文章希望大家以后多多支持风君子博客! 您可能感兴趣的文章: django-rest-framework解析请求参数过程详解 django框架配置swagger以及自定义参数使用方式 Django框架cookie和session方法及参数设置 Django中URL的参数传递的实现 Django跨域请求无法传递Cookie的解决
  • 目录
    • 一、GET 请求参数获取
    • 二、POST 请求参数获取
    • 三、JSON 请求体参数获取
    • 四、URL 路径参数获取
    • 五、文件上传处理
    • 六、请求头信息获取
    • 七、综合示例
    • 八、注意事项
    • 九、参数获取方法对比
    • 十、最佳实践建议

    在 Django 中获取请求参数的完整方法如下:

    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()  # 返回字典
    

    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()
    

    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")
    

    # 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获取请求参数内容请搜索风君子博客以前的文章或继续浏览下面的相关文章希望大家以后多多支持风君子博客!

    您可能感兴趣的文章:

    • django-rest-framework解析请求参数过程详解
    • django框架配置swagger以及自定义参数使用方式
    • Django框架cookie和session方法及参数设置
    • Django中URL的参数传递的实现
    • Django跨域请求无法传递Cookie的解决

    站内搜索