Django API Post 方法返回 403 错误
Posted
技术标签:
【中文标题】Django API Post 方法返回 403 错误【英文标题】:Django API Post method returns 403 error 【发布时间】:2016-01-03 18:00:43 【问题描述】:我正在尝试设置 Django API(一个 POST API 端点)。我希望有相同的 URL 路径指向相同的函数,因为它是 POST 还是 GET,所以处理方式不同。因此,我使用了这样的方法
def handle_post(request):
dict =
dict['email'] = "test"
if request.method == "POST":
return HttpResponse(json.dumps(dict), content_type="application/json")
在url.py中,我有以下代码
router = routers.DefaultRouter()
router.register(r'notes', UsernotesViewSet)
urlpatterns = patterns('',
url(r'^', include(router.urls)),
url(r'^admin/', include(admin_site.urls)),
url(r'^api-auth/', include('rest_framework.urls', namespace='rest_framework')),
url(r'^docs/', include('rest_framework_swagger.urls')),
url(r'^example/postrequest', handle_post),
)
但是当我对 URL http://127.0.0.1:8000/example/postrequest?requestid=abc&starthour=10 执行 POST 时,我无法完成这项工作。我没有发布任何内容,只是将方法从 httpclient 上的 GET 更改为 POST 以尝试此 API。如果我没有在 URL 上发布任何内容可以吗?
我收到 403 错误,如下所示:
禁止 (403) CSRF 验证失败。请求中止。 您看到此消息是因为此站点在提交表单时需要 CSRF cookie。出于安全原因,需要此 cookie,以确保您的浏览器不被第三方劫持。 如果您已将浏览器配置为禁用 cookie,请至少为该站点或“同源”请求重新启用它们。
感谢任何帮助。
【问题讨论】:
【参考方案1】:我无法正确理解您的问题,但是在未使用针对 CSRF(跨站点请求伪造)的推荐防御设置的情况下执行“通过 POST、PUT 和 DELETE 等‘不安全’方法的请求”时,会导致 CSRF 验证失败。
您可以在此link 上阅读更多信息。
有一个快速解决问题的方法。您可以使用 csrf_exempt 装饰器将视图标记为不受 CSRF 视图中间件 (django.middleware.csrf.CsrfViewMiddleware) 确保的保护。示例:
from django.views.decorators.csrf import csrf_exempt
from django.http import HttpResponse
@csrf_exempt
def my_view(request):
return HttpResponse('Hello world')
您可以阅读更多关于here的信息。
【讨论】:
非常感谢。通过添加@csrf_exempt,您的工作方式 有什么方法可以使用csrf令牌而不是豁免它?【参考方案2】:阅读CSRF protection 上的 Django 文档。如果您的 api 将被浏览器中的 javascript 访问,那么有 instructions 用于如何在 ajax 请求中包含令牌。
如果以不同的方式访问 API,例如如果来自不使用 cookie 的移动客户端,则可能适合使用 csrf_exempt
装饰器关闭该视图的 CSRF 保护。
【讨论】:
【参考方案3】:禁止 (403) CSRF 验证失败。请求中止。
您看到此消息是因为此站点在提交表单时需要 CSRF cookie。出于安全原因需要此 cookie,以确保您的浏览器不被第三方劫持。
如果您已将浏览器配置为禁用 cookie,请重新启用它们,至少对于本网站或“同源”请求。
更多信息可通过 DEBUG=True 获得。
【讨论】:
以上是关于Django API Post 方法返回 403 错误的主要内容,如果未能解决你的问题,请参考以下文章
Django 使用 Fetch 对 POST 请求返回 403 错误
尽管有 AllowAny 权限,django-rest-framework 在 POST、PUT、DELETE 上返回 403 响应