Python 我如何使用Sure_csrf_cookie?

Python 我如何使用Sure_csrf_cookie?,python,django,django-views,csrf,Python,Django,Django Views,Csrf,我是python新手。对Django来说也是新的。我正在尝试发出一个AJAX请求,并按照说明进行操作。起初,检索csrf cookie的结果总是空的,所以我找到了一个名为sure\u csrf\u cookie的装饰器方法。问题是它需要一个视图,而我不知道要传递什么视图以及在哪里可以获得对它的引用。代码非常简单: from django.shortcuts import render_to_response from django.core.context_processors import c

我是python新手。对Django来说也是新的。我正在尝试发出一个AJAX请求,并按照说明进行操作。起初,检索csrf cookie的结果总是空的,所以我找到了一个名为sure\u csrf\u 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?我不想使用描述的方法,因为我不想手动处理该值

代码的其余部分如下:

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>
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',
)

当您具备以下条件时,将自动验证CSRF令牌:

MIDDLEWARE_CLASSES = (
...
'django.middleware.csrf.CsrfViewMiddleware',
...
)
在您的项目
settings.py
文件中

当您有这样的中间件时,您只需将crsf_令牌变量放入所有表单(在模板中),它会自动验证,例如:

<form>
{% csrf_token %}
...

{%csrf_令牌%}
...

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

Cookies设置在服务器响应上,所以您需要设置@Survey_csrf_cookie decorator for view,用于呈现页面,用户将从中发出ajax请求

例如,若用户浏览器在站点主页上发出ajax请求,则将此装饰器设置为视图,并负责主页

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

@ensure_csrf_cookie
def sandbox(request):
...

虽然你已经找到了你想要的东西,但这些概念将对你有所帮助

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

  • 基于函数的视图
  • 基于类的视图
  • view的基本工作是处理HttpRequest并发送HttpResponse。 每个返回HttpResponse的视图都必须有一个请求参数

    基于函数的视图的示例:

    def myView(request):
       ...
      # process the request here
       return HttpResponse() # or render_to_response depending upon what you want.
    
    我没有在您的视图中看到
    请求
    参数

    现在,装饰师是在视图上设置特定条件的东西

    例如:如果您有用于评论的视图功能,并且希望用户登录进行评论,那么您可以在视图上使用
    login\u required
    decorator

    这将确保任何想发表评论的人首先需要登录。基本语法是:

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

    与@login_required类似,@sure_csrf_cookie是一个装饰器

    对于那些希望通过基于类的视图实现此目的的人:

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

    据我所知,
    {%csrf\u token%}
    元素需要在表单中。我的模板上可能没有表单(在本例中我有,但它是沙箱)。我基本上希望能够在没有表单元素的情况下设置cookie我尝试了你所说的,但没有成功<代码>{%csrf\u令牌%}不返回任何内容。我正在更新帖子以包含其余的相关代码。我上传了其余的代码。。。你能举个例子吗?加上“从django.views.decorators.csrf导入确保\u csrf\u cookie”啊,现在我明白了!我知道关于视图的部分,刚刚发现传递的第一个参数是request对象。我不知道装饰器与正常功能不同。谢谢你把它清理干净!我应该把它放在基于类的视图中的什么位置?e、 g.DRF的超链接模型视图集?通过文档,我认为您应该装饰
    dispatch()
    。请参阅:。另外,您可以在类声明的正上方添加decorator,我认为这样更简洁。e、 g.
    @method\u decorator(确保\u csrf\u cookie,name='dispatch')
    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):
           ...