Django API Post 方法 returns 403 错误

Django API Post method returns 403 error

我正在尝试设置 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 时,我无法完成这项工作。我没有 post 任何东西,只是将方法从 httpclient 上的 GET 更改为 POST 来尝试这个 API。如果我没有 post 任何内容到 URL 可以吗?

我收到 403 错误,如下所示:

Forbidden (403)
CSRF verification failed. Request aborted.
You are seeing this message because this site requires a CSRF cookie when submitting forms. This cookie is required for security reasons, to ensure that your browser is not being hijacked by third parties. If you have configured your browser to disable cookies, please re-enable them, at least for this site, or for 'same-origin' requests.

感谢任何帮助。

阅读 CSRF protection. If your api is going to be accessed by javascript in the browser, then there are instructions 上的 Django 文档,了解如何在 ajax 请求中包含令牌。

如果 API 以不同的方式访问,例如来自不使用 cookie 的移动客户端,那么使用 csrf_exempt 装饰器关闭该视图的 CSRF 保护可能是合适的。

我没能正确理解你的问题,但CSRF验证失败是由于"requests via ‘unsafe’ methods, such as POST, PUT and 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

禁止访问 (403) CSRF 验证失败。请求已中止。

您看到此消息是因为此站点在提交表单时需要 CSRF cookie。出于安全原因需要此 cookie,以确保您的浏览器不被第三方劫持。

如果您已将浏览器配置为禁用 cookie,请至少为本网站或 'same-origin' 请求重新启用它们。

更多信息可用 DEBUG=True。