1. 程式人生 > >django 1.10版本解決中CSRF問題

django 1.10版本解決中CSRF問題

本部分是基於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過程: