系統環境 | 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
<input type='hidden' name='csrfmiddlewaretoken' value='lV1qtJ6GdSLChZLE6yYH37f10mN7Pjrd' />
django的csrf middleware 是保護django免受csrf攻擊的!
它須要把request也添加到模板中,第二到第四個例子,會生成 csrf_tokenapp
下面4個例子中,主要是爲了展現什麼狀況,纔有csrf_token,因此才使用了{{ csrf_token }}, 當表單中使用的時候,必須使用 {% csrf_token %}!!!post
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個連接,獲得下面的結果: