как использовать файл cookie CSRF?

Я новичок в python. Также новичок в Django. Я пытаюсь сделать запрос AJAX и следовал инструкциям здесь. сначала результат извлечения файла cookie csrf всегда был нулевым, поэтому я нашел метод декоратора ensure_csrf_cookie. Проблема в том, что он запрашивает вид, и я понятия не имею, какой вид пройти и где я могу получить ссылку на него. Код довольно прост:

from django.shortcuts import render_to_response
from django.core.context_processors import csrf
from django.views.decorators.csrf import ensure_csrf_cookie

def csv_to_xform(csv, template):
    return render_to_response(template, { "data": "it works!" })

нужно ли использовать представление на основе класса? если да, то есть ли лучший способ установить печенье? Я бы не хотел использовать описанный метод здесь, потому что я не хочу вручную обрабатывать значение.

остальная часть кода выглядит следующим образом:

песочнице.HTML-код:

<!doctype html>

<html>
    <head>
        <title>Sandbox</title>

        <script src="http://code.jquery.com/jquery-1.10.1.min.js"></script>
        <script src="/static/js/csrf.js"></script>

        <script type="text/javascript">
            $(function () {
                $('#send-csv-btn').click(function () {
                    $.post('/csv', { 
                        data: '1, 2, 3',
                        success: function (response) {
                            console.debug(response);
                        },
                        error: function (response) {
                            console.debug(response);
                        }
                    });
                });
            });
        </script>
    </head>

    <body>
        <form>
            {% csrf_token %}
            <input type="button" id="send-csv-btn" />
        </form>
    </body>
</html>

urls.py:

urlpatterns = patterns('',
    url(r'^$', 'dkobo.formbuilder.views.main', name='fb'),
    url(r'^admin/', include(admin.site.urls)),
    url(r'^csv$', 'dkobo.formbuilder.views.csv_to_xform', { "template": "sandbox-stub.html" }),
    url(r'^sandbox$', 'dkobo.formbuilder.views.sandbox')
)

settings.py:

MIDDLEWARE_CLASSES = (
    'django.contrib.sessions.middleware.SessionMiddleware',
    'django.middleware.common.CommonMiddleware',
    'django.middleware.csrf.CsrfViewMiddleware',
    'django.contrib.auth.middleware.AuthenticationMiddleware',
    'django.contrib.messages.middleware.MessageMiddleware',
    'django.middleware.clickjacking.XFrameOptionsMiddleware',
)

4 ответов


Cookies устанавливает ответ сервера, поэтому вам нужно настроить @ ensure_csrf_cookie decorator для просмотра, который отображает страницу, с которой пользователь сделает ajax-запрос.

например, если пользователи браузера делают ajax-запрос на главную страницу сайта, установите этот декоратор для просмотра, ответственный за главную страницу.

обновление: ajax запрос вызовов со страницы песочницы? затем попробуйте установить ensure_csrf_cookie для песочницы, например:

@ensure_csrf_cookie
def sandbox(request):
...

для тех, кто ищет способ сделать это с класса вида:

from django.utils.decorators import method_decorator
from django.views.decorators.csrf import ensure_csrf_cookie

class MyView(View):

    @method_decorator(ensure_csrf_cookie)
    def get(self, request, *args, **kwargs):
       ...

хотя вы нашли то, что искали, эти концепции помогут вам.

представления-это функции, которые вызываются при запросе URL-адреса. И есть два типа представлений:

  1. представления на основе функций
  2. представления на основе классов.

основная работа представления-обработать HttpRequest и отправить HttpResponse. И каждое представление, возвращающее HttpResponse, должно иметь параметр запроса.

Ex представление на основе функции:

def myView(request):
   ...
  # process the request here
   return HttpResponse() # or render_to_response depending upon what you want.

Я не вижу request параметр в вашем представлении.

теперь декоратор-это то, что ставит определенные условия на вид.

например: если у вас есть функция просмотра для комментариев, и вы хотите, чтобы пользователь вошел в систему для комментариев, Вы можете использовать login_required оформителя на вид.

это гарантирует, что любой, кто хочет прокомментировать, сначала должен войти в систему. Базовый синтаксис есть:

@login_required   # this is the decorator
def comment(request):   # this is the view on which the decorator is acting upon
 ...
 ... 
 return HttpResponse()

подобно @login_required, @ensure_csrf_cookie является декоратором.


токены CSRF автоматически проверяются при наличии:

MIDDLEWARE_CLASSES = (
...
'django.middleware.csrf.CsrfViewMiddleware',
...
)

в проекте .

когда у вас есть такое промежуточное ПО, вам нужно только поместить переменную crsf_token во все ваши формы (в шаблонах), и она автоматически проверяется, например:

<form>
{% csrf_token %}
...

Я не знаю, понял ли я вашу проблему вообще ;)