2015-10-06 119 views
4

我试图设置Django API(一个POST API端点)。我想要具有相同的URL路径指向相同的函数,如果它是POST或GET,则处理方式不同。因此,我所用的方法是这样Django API Post方法返回403错误

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), 
) 

但是,当我执行POST到URL http://127.0.0.1:8000/example/postrequest?requestid=abc&starthour=10我不能得到这个工作。我没有发布任何内容,只是将方法更改为从httpclient上的POST来尝试此API。如果我没有发布任何内容到URL,可以吗?

我收到403错误,如下:

禁止(403)
CSRF验证失败。请求中止。
您看到此消息是因为此网站在提交表单时需要CSRF Coo​​kie。出于安全原因,此cookie是必需的,以确保您的浏览器不被第三方劫持。 如果您已将浏览器配置为禁用Cookie,请重新启用它们,至少对于本网站或“同源”请求来说,请重新启用它们。

赞赏有帮助。

回答

4

我无法正确理解您的问题,但是CSRF验证失败是因为“通过”不安全“方法(例如POST,PUT和DELETE)执行请求时未使用CSRF(Cross Site Request Forgeries,跨站点请求伪造) 。

您可以在此link了解更多。

有一个快速的工作,各地的问题。您可以使用csrf_exempt装饰标记一个视图是由通过CSRF查看中间件(django.middleware.csrf.CsrfViewMiddleware)确保保护豁免。例如:

​​

您可以阅读更多关于here

+0

非常感谢。你的工作方式,通过增加@csrf_exempt – Terry

2

请阅读CSRF protection上的Django文档。如果您的API将在浏览器中通过JavaScript访问,那么有instructions关于如何在ajax请求中包含令牌。

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