2015-05-10 47 views
3

我使用的服务器:Django的,Gunicorn,ngnix,PostgreSQL的CSRF验证失败。请求中止 - Django的,POST

Client: Chrome Advanced Rest Client 

views.py


from django.views.decorators.csrf import csrf_exempt, **ensure_csrf_cookie** # Newly added 
    from django.http import HttpResponse 

    **@ensure_csrf_cookie** # newly added 
    def hello(request): 
    return HttpResponse("Hello world") 


    def hi(request): 
    return HttpResponse("Hi World") 

    def display_meta(request): 
    values = request.META.items() 
    values.sort() 
    html = [] 
    for k, v in values: 
     html.append('<tr><td>%s</td><td>%s</td></tr>' % (k, v)) 
    return HttpResponse('<table>%s</table>' % '\n'.join(html)) 

    def addUser(request): 
    if request.method == 'POST': 
    # Convert JSON to python objects and 
    # store into the DB 
    print 'Raw Json "%s"' % request.body 
    #return HttpResponse("%s" %request.body) 
    return HttpResponse("Thank God") 

url.py


from django.conf.urls import patterns, include, url 
from django.contrib import admin 
from requests import hello, hi, addUser, display_meta 

urlpatterns = patterns('', 
    # Examples: 
    # url(r'^$', 'testProject.views.home', name='home'), 
    # url(r'^blog/', include('blog.urls')), 
    url(r'^hello/$', hello), 
    url(r'^hi/$', hi), 
    url(r'^admin/', include(admin.site.urls)), 
    url(r'^addPatient/$', addUser), 
    url(r'^displaymeta/$', display_meta), 
) 

manage.py


# Application definition 

INSTALLED_APPS = (
    'django.contrib.admin', 
    'django.contrib.auth', 
    'django.contrib.contenttypes', 
    'django.contrib.sessions', 
    'django.contrib.messages', 
    'django.contrib.staticfiles', 
    'dbTransactions', 
) 

MIDDLEWARE_CLASSES = (
    'django.contrib.sessions.middleware.SessionMiddleware', 
    'django.middleware.common.CommonMiddleware', 
    'django.middleware.csrf.CsrfViewMiddleware', 
    'django.contrib.auth.middleware.AuthenticationMiddleware', 
    'django.contrib.auth.middleware.SessionAuthenticationMiddleware', 
    'django.contrib.messages.middleware.MessageMiddleware', 
    'django.middleware.clickjacking.XFrameOptionsMiddleware', 
                   27,18   35% 

从提前REST客户端:

一)GET喜优良工程没有错误 B)POST到ADDUSER赋予“ CSRF验证失败。请求中止

我试了一下:

  1. @csrf_exempt的意见 - 在POST同样的错误没有变化
  2. 把X-CSRF令牌 - 在POST头 - 无变化在POST 。同样的错误

我将不胜感激这个帮助我已经阅读:

+0

你可以显示你的前端表单吗? – rnevius

+0

用户如何使用您的服务进行身份验证?你可以导入csrf_exempt装饰器,但是你没有使用它 - 你可以有一个csrf_exempt GET视图,把csrf标记放到响应中:'request.META [“CSRF_COOKIE_USED”] = True',然后在客户端捕获它与您的POST请求一起发送。 – henrikstroem

+0

@rnevius我没有任何前端形式。我正在考虑直接在iOS应用上使用此服务来发布数据。如果我的理解有缺陷,请纠正我。 – tesla

回答

1

谢谢你的答复。我学习了以下关于CSRF,Django和Chrome Advanced Rest API Client的内容。

a。 CSRF - 跨站请求伪造是在客户端和服务器之间经过身份验证的连接上专门保护恶意事务POST,PUT,DELETE的一种方式。

b。 Django允许使用CSRF令牌进行GET,但对于任何POST,PUT或DELETE都会失败。

c。要在GET的响应中获取CSRF标记,可以使用@ensure_csrf_cookie,它将确保响应具有CSRF标记。 d)。对于Chrome高级REST客户端的POST,必须使用X-CSRFTOKEN和从GET命令的响应中获取的令牌。

相关问题