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 post请求 403错误解决方法

POST 方法总是返回 403 Forbidden

Django 在发送 POST 请求时返回 403 错误

Django 使用 Fetch 对 POST 请求返回 403 错误

python Django post方法报错

尽管有 AllowAny 权限,django-rest-framework 在 POST、PUT、DELETE 上返回 403 响应