• django csrf_token生成


    django模板中生成csrf_token的不同方式

    系统环境CENTOS 6.4
    python2.7.6
    django 1.7.1

    当post提交表单的的时候,是需要 csrf_token的,
    它需要把request也添加到模板中,第二到第四个例子,会生成 csrf_token

    当你用post提交表单,但是没有csrf_token的时候,会提示下面的错误:

        Forbidden (403)
        CSRF verification failed. Request aborted.
    

    两种可选解决方式:

    • 注释 settings.py中的MIDDLEWARE_CLASSES 中的 'django.middleware.csrf.CsrfViewMiddleware',*
    • 在 HTML的 表单中添加{% csrf_token %}, 注意不是 {{ csrf_token }},
      {{ csrf_token}} 生成一个字符串,比如:lV1qtJ6GdSLChZLE6yYH37f10mN7Pjrd;
      {% csrf_token %} 是生成一个hidden的字段,比如<input type='hidden' name='csrfmiddlewaretoken' value='lV1qtJ6GdSLChZLE6yYH37f10mN7Pjrd' />

    django的csrf middleware 是保护django免受csrf攻击的!
    它需要把request也添加到模板中,第二到第四个例子,会生成 csrf_token

    下面4个例子中,主要是为了展示什么情况,才有csrf_token,所以才使用了{{ csrf_token }}, 当表单中使用的时候,必须使用 {% csrf_token %}!!!

    django的测试环境,是django tutorial中的mysite和polls

    django-admin startproject mysite
    cd mysite
    python manage.py startapp polls
    

    mysite/views.py

    from django.http import HttpResponse
    from django.shortcuts import render, render_to_response
    from django.template import RequestContext, loader, Context
    
    def my_view(request):
        t = loader.get_template('test.html')
        c = Context({'name':'my_view'})
        return HttpResponse(t.render(c),
                            content_type="text/html")
    def my_view1(request):
        t = loader.get_template('test.html')
        c = RequestContext(request, {'name':'my_view1'})
        return HttpResponse(t.render(c),
                            content_type="text/html")
    
    def my_view2(request):
        return render_to_response('test.html', {'name':'my_view2'},
                content_type="text/html",
            context_instance=RequestContext(request),
            )
    
    def my_view3(request):
        return render(request, 'test.html', {"name":"my_view3"},
                content_type="text/html")
    

    模板test.html的内容:

    test.html模板必须放在template目录中,而不可以在其子目录中
    polls/templates/test.html

    <html>
        <body>
            
            <h1>{{ name }}</h1>
            <h1>{{ csrf_token }}</h1>
    
        </body>
    </html>
    

    mysite 中 的 urls.py

    from django.conf.urls import patterns, include, url
    from django.contrib import admin
    
    urlpatterns = patterns('',
        url(r'^polls/', include('polls.urls', namespace='polls')),
        url(r'^admin/', include(admin.site.urls)),
    )
    

    polls 中的 urls.py

    urlpatterns = patterns('',
        url(r'^my_view/$', views.my_view, name='my_view'),
        url(r'^my_view1/$', views.my_view1, name='my_view1'),
        url(r'^my_view2/$', views.my_view2, name='my_view2'),
        url(r'^my_view3/$', views.my_view3, name='my_view3'),
    )
    

    访问4个链接,得到下面的结果:

    my_view

    my_view1

    my_view2

    my_view3

  • 相关阅读:
    部署 HTTPS 访问 ( https:// )
    Jquery百宝箱
    Python 模块和包
    Python 缓存
    Python 内存管理和回收
    Python上下文管理器
    MySQL 表约束
    MySQL 字符集和校验规则工作原理
    MySQL基础笔记整理
    Redis 数据结构 之 SDS
  • 原文地址:https://www.cnblogs.com/xupeiyuan/p/4246845.html
Copyright © 2020-2023  润新知