美文网首页
使用 Django 中的 csrf 处理

使用 Django 中的 csrf 处理

作者: Lowry_Lee | 来源:发表于2017-12-31 11:01 被阅读0次

    Django中有一个django.middleware.csrf.CsrfViewMiddleware中间件提供了全局的csrf检查。它的原理是在标签中生成一个隐藏的标签,提交表单时将这个隐藏的一起提交,服务器端验证这个字段是否正确。

    官方给出的csrf的操作步骤是:

    在MIDDLEWARE_CLASSES中添加django.middleware.csrf.CsrfViewMiddleware,开启全局csrf保护。

    对于POST至站内的表单,在模板中的标签内添加{% csrf_token %}模板标签。

    在对应的视图函数中确保使用django.template.context_processors.csrfContext处理器。实现方式有两种:

    (1). 使用RequestContext或者直接使用通用视图,它们会自动将csrf_token添加至模板上下文中。

    return render_to_response("xxx.html", context_instance=RequestContext(request))

    (2). 手工导入并使用处理器来生成CSRF token,并将它添加到模板上下文中。例如:

    from django.shortcuts import render_to_response

    from django.template.context_processors import csrf

    def my_view(request):

    c = {}

    c.update(csrf(request))

    # ... view code here

    return render_to_response("a_template.html", c)

    但是,手工导入麻烦而且会使代码变得难以维护,使用RequestContext也没好到哪去, 并且在Django 1.8 的文档中说明context_instance1.8 之后会被废弃。

    那我们应该如何处理csrf_token呢?其实,Django提供了一个快捷函数可以处理这个问题。

    django.shortcuts.render在内部设定context_instance缺省是RequestContext的一个实例。调用render便可以自动将csrf_token添加至上下文中。

    网上有一些博客说可以在settings中设置TEMPLATE_CONTEXT_PROCESSORS实现全局的csrf_token填充至上下文。

    但是我实验后发现并不好使,如果有朋友知道原因的话,还望告知。

    我在settings中是这样设置的:

    TEMPLATE_CONTEXT_PROCESSORS = global_settings.TEMPLATE_CONTEXT_PROCESSORS + ('django.core.context_processors.csrf',)

    相关文章

      网友评论

          本文标题:使用 Django 中的 csrf 处理

          本文链接:https://www.haomeiwen.com/subject/zmvogxtx.html