2015-05-10 6 views
3

Я использую сервер: Django, Gunicorn, ngnix, PostgreSQLНе удалось выполнить проверку CSRF. Запрос прерван - Джанго, 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% 

С Advance Rest Клиент:

а) GET Высок отлично работает без ошибок б) POST в AddUser не дает " Не удалось выполнить проверку CSRF. Запрос прерван "

Что я пробовал:.

  1. @csrf_exempt в представлениях - Никаких изменений в POST же ошибки
  2. не Положив X-CSRF-токен - в заглавном посте - Никаких изменений в 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.

a. CSRF - Cross-Site Request Forgery - способ защиты вредоносных транзакций, особенно POST, PUT, DELETE на аутентифицированном соединении между клиентом и сервером.

b. Django позволяет GET с токеном CSRF, но он не работает для POST, PUT или DELETE.

c. Чтобы получить токен CSRF в ответе для GET, вы можете использовать @ensure_csrf_cookie, который будет уверен, что ответ имеет токен CSRF.

d. Для POST из расширенного клиента REST от Chrome нужно использовать X-CSRFTOKEN и токен, полученные из ответа команды GET.

Смежные вопросы