django csrf_token生成

django模板中生成csrf_token的不一樣方式

系統環境 CENTOS 6.4
python 2.7.6
django 1.7.1

當post提交表單的的時候,是須要 csrf_token的,
它須要把request也添加到模板中,第二到第四個例子,會生成 csrf_tokenhtml

當你用post提交表單,可是沒有csrf_token的時候,會提示下面的錯誤:python

Forbidden (403)
    CSRF verification failed. Request aborted.

兩種可選解決方式:django

  • 註釋 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_tokenapp

下面4個例子中,主要是爲了展現什麼狀況,纔有csrf_token,因此才使用了{{ csrf_token }}, 當表單中使用的時候,必須使用 {% csrf_token %}!!!post

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的內容:url

test.html模板必須放在template目錄中,而不能夠在其子目錄中
polls/templates/test.htmlspa

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

    </body>
</html>

mysite 中 的 urls.pycode

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.pycsrf

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

相關文章
相關標籤/搜索