我正在尝试设置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,请至少针对此站点或“相同来源”请求重新启用它们。
感谢任何帮助。
我无法正确理解您的问题,但是在执行“通过“不安全”方法(例如POST,PUT和DELETE)的请求而未使用针对CSRF的建议防御设置(跨站点请求伪造)时,导致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 protection上的Django文档。如果您的api将被浏览器中的javascript访问,则存在instructions有关如何在ajax请求中包括令牌的信息。
禁止(403)CSRF验证失败。请求中止。