You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用App Inventor向Django API发送POST请求时遇403错误求助

解决App Inventor向Django后端POST请求返回403的问题

常见原因及对应解决方案

1. CSRF验证失败(最常见)

Django默认开启CSRF保护机制,非浏览器客户端发起的POST请求如果未携带CSRF令牌,会直接被拦截返回403。

  • 解决方法:
    • 若该API专门为App这类非浏览器客户端设计,可在视图函数/类上添加@csrf_exempt装饰器跳过CSRF验证:
      from django.views.decorators.csrf import csrf_exempt
      from django.http import JsonResponse
      
      @csrf_exempt
      def login_api(request):
          if request.method == 'POST':
              # 编写登录逻辑
              return JsonResponse({'status': 'success'})
          return JsonResponse({'status': 'error'}, status=400)
      
    • 若使用Django REST Framework,直接继承APIView即可,它默认对API请求关闭CSRF验证:
      from rest_framework.views import APIView
      from rest_framework.response import Response
      
      class LoginAPI(APIView):
          def post(self, request):
              # 编写登录逻辑
              return Response({'status': 'success'})
      

2. CORS跨域限制

如果App Inventor的请求与Django后端不在同一域名/端口,会触发跨域限制导致403。

  • 解决方法:
    • 安装django-cors-headers包:
      pip install django-cors-headers
      
    • 在settings.py中配置跨域规则:
      INSTALLED_APPS = [
          # 其他已安装应用
          'corsheaders',
      ]
      
      MIDDLEWARE = [
          'corsheaders.middleware.CorsMiddleware',  # 需放在最靠前位置
          'django.middleware.common.CommonMiddleware',
          # 其他中间件
      ]
      
      # 开发环境可允许所有来源,生产环境建议指定具体域名
      CORS_ALLOW_ALL_ORIGINS = True
      

3. 请求格式不匹配

Django默认期望POST请求的内容类型为application/x-www-form-urlencoded或multipart/form-data,若App Inventor发送JSON格式数据,后端无法解析可能引发后续验证失败。

  • 解决方法:
    • 若App发送JSON,后端手动解析请求体:
      import json
      from django.views.decorators.csrf import csrf_exempt
      from django.http import JsonResponse
      
      @csrf_exempt
      def login_api(request):
          if request.method == 'POST':
              data = json.loads(request.body)
              username = data.get('username')
              password = data.get('password')
              # 编写登录逻辑
              return JsonResponse({'status': 'success'})
      
    • 或在App Inventor中设置请求内容类型为application/x-www-form-urlencoded,以键值对形式传递参数。

4. 权限配置错误

检查Django的权限规则,确保登录API允许未认证用户访问。

  • 解决方法:
    • 若使用DRF,在视图中设置权限类为AllowAny:
      from rest_framework.permissions import AllowAny
      from rest_framework.views import APIView
      from rest_framework.response import Response
      
      class LoginAPI(APIView):
          permission_classes = [AllowAny]
          def post(self, request):
              # 编写登录逻辑
              return Response({'status': 'success'})
      

调试建议

  • 查看Django测试服务器的日志,找到403对应的具体错误提示(如CSRF verification failed. Request aborted.),精准定位问题。
  • 在App Inventor中添加调试代码,打印请求的头部、参数信息,确认发送内容是否符合后端预期。

内容的提问来源于stack exchange,提问作者Moritz Deinzer

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.05 17:33:12