我该如何使用ensure_csrf_cookie?

时间:2013-11-21 13:56:42

标签: python django django-views csrf

我是python的新手。 Django也是新手。我正在尝试发出一个AJAX请求,并按照here的说明进行操作。首先,检索csrf cookie的结果总是为null,所以我找到了一个名为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!" })

我是否需要使用基于类的视图?如果是这样,有没有更好的方法来设置cookie?我不想使用here描述的方法,因为我不想手动处理该值。

其余代码如下:

sandbox.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 个答案:

答案 0 :(得分:14)

Cookie设置服务器响应,因此您需要设置@ensure_csrf_cookie装饰器以进行查看,即呈现页面,用户将从该页面发出ajax请求。

例如,如果用户浏览器在网站主页上发出ajax-request,请将此装饰器设置为view,负责主页。

更新:来自沙盒页面的ajax请求调用? 然后尝试为sandbox视图设置ensure_csrf_cookie,如下所示:

@ensure_csrf_cookie
def sandbox(request):
...

答案 1 :(得分:12)

对于那些寻找基于类视图的方法的人:

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):
       ...

答案 2 :(得分:3)

虽然您已找到所需内容,但这些概念对您有帮助。

视图是在请求URL时调用的函数。有两种类型的观点:

  1. 基于功能的观点
  2. 基于班级的观点。
  3. 视图的基本工作是处理HttpRequest并发出HttpResponse。 每个返回HttpResponse的视图都必须有一个请求参数。

    基于功能的视图:

    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是装饰者。

答案 3 :(得分:2)

当您拥有以下内容时,CSRF令牌会自动验证:

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

在您的项目settings.py文件中。

当你有这样的中间件时,你只需要将crsf_token变量放到所有表单中(在模板中),并且它会自动验证,例如:

<form>
{% csrf_token %}
...

我不知道我是否理解你的问题;)