使用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'})
- 若该API专门为App这类非浏览器客户端设计,可在视图函数/类上添加
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,以键值对形式传递参数。
- 若App发送JSON,后端手动解析请求体:
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'})
- 若使用DRF,在视图中设置权限类为
调试建议
- 查看Django测试服务器的日志,找到403对应的具体错误提示(如
CSRF verification failed. Request aborted.),精准定位问题。 - 在App Inventor中添加调试代码,打印请求的头部、参数信息,确认发送内容是否符合后端预期。
内容的提问来源于stack exchange,提问作者Moritz Deinzer
相关产品推荐
相关产品推荐

