【问题标题】:Django API Post method returns 403 errorDjango API Post 方法返回 403 错误
【发布时间】:2023-03-10 08:05:01
【问题描述】:

我正在尝试设置 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,请至少为该站点或“同源”请求重新启用它们。

感谢任何帮助。

【问题讨论】:

    标签: python django http-post http-status-code-403


    【解决方案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 获得。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2011-10-11
        • 2017-10-07
        • 2023-01-31
        • 2012-05-26
        • 2022-08-03
        • 1970-01-01
        • 1970-01-01
        • 2018-04-22
        相关资源
        最近更新 更多