django 1.10版本解決中CSRF問題
阿新 • • 發佈:2019-01-28
本部分是基於Django 1.10版本
>>> import django
>>> django.get_version()
'1.10.6'
CSRF是(Cross-Site Request Forgery)跨站請求偽造,簡單的用於防止惡意網站上的表單或者JavaScript利用使用者登入過的認證資訊,對網站進行某些操作,利用Django進行web開發過程中,如不對app下的views.py指令碼和template下的html檔案做重寫,在進行POST時就會出現403錯誤;
如下使用題注自行開發的簡易blog進行演示:
1.POST提交過程
2.報錯過程
根據help中提示的內容進行排除(Django專案中的setting.py檔案的debug=True時才能顯示詳細資訊):
重寫html檔案:
<!-- archive.html --> <form action="/blog/create/" method="post">{% csrf_token %} Title: <input type=text name=title><br> Body: <textarea name=body rows=3 cols=60></textarea><br> <input type=submit> </form> <hr> {% for post in posts %} <h2>{{post.title}}</h2> <p>{{post.body}}</p> <p>{{post.timestamp}}</p> {% endfor %}
重寫應用下的views.py檔案:
from django.shortcuts import render
from datetime import datetime
from django.http import HttpResponseRedirect
from blog.models import BlogPost
from django.template import RequestContext
import django.middleware.csrf
def create_blogpost(request):
if request.method == 'POST':
BlogPost(
title = request.POST.get('title'),
body = request.POST.get('body'),
timestamp = datetime.now(),
).save()
return HttpResponseRedirect('/blog/')
def archive(request):
posts = BlogPost.objects.all().order_by('-timestamp')[0:]
return render(request,'archive.html',{'posts':posts})
再次測試,能夠正常完成POST過程: