美文网首页
django的csrf踩坑

django的csrf踩坑

作者: 山坡上的斐德洛 | 来源:发表于2019-01-20 12:31 被阅读0次

环境:python3.6 django2.1
今天照着一本书上练习django的session功能时,发现使用form表单提交时总是403错误,我在form表单中也使用了{% csrf_token %},其他的感觉也没错,但是折腾了一上午,我发现是按照书上的思路导致我形成的思维定式了,根源是出在views.py中,说起来,知道错误后感觉自己好二。。。话不多说,直接上代码了


login.html的代码

<!-- login.html -->
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>登陆分享日记</title>
</head>
<body>
<nav>
    <div>分享日记</div>
    <ul>
        <li><a href="/">HOME</a></li>
        {% if username %}
            <li><a href="/logout">注销</a></li>
            <li><a href="/post">写日记</a></li>
            <li><a href="/admin">后台管理</a></li>
        {% else %}
            <li><a href="/login">登陆</a></li>
            <li><a href="/contact">联络管理员</a></li>
        {% endif %}
    </ul>
</nav>
    <div>
        {% if message %}
            <div>{{ message }}</div>
        {% endif %}
        <div>
            <h3>登陆我的私人日记</h3>
        </div>
        <form action="." method="post">
            {% csrf_token %}
            <label for="user_name">你的姓名:</label>
            <input id="user_name" type="text" name="user_name">
            <label for="user_color">你喜欢的颜色</label>
            <input id="user_color" type="text" name="user_color">
            <button type="submit" value="设置">提交</button>
        </form>
    </div>
</body>
</html>

这个是错误的views.py的代码

from django.shortcuts import render, HttpResponse, redirect, render_to_response
from django.template.loader import get_template
def login(request):
    # 如果是POST方法提交
    if request.method == 'POST':
        # 查看窗体属性的正确性
        username = request.POST['user_name']
        usercolor = request.POST['user_color']
        message = "登陆成功"

        response = render_to_response("login.html", locals())
        response.set_cookie('username', username)
        response.set_cookie('usercolor', usercolor)
    else:
        # 这里出的错
        response = render_to_response("login.html")
    return response

这个是改正后的views.py代码

from django.shortcuts import render, HttpResponse, redirect, render_to_response
from django.template.loader import get_template

def login(request):
    # 如果是POST方法提交
    if request.method == 'POST':
        # 查看窗体属性的正确性
        username = request.POST['user_name']
        usercolor = request.POST['user_color']
        message = "登陆成功"

        response = render_to_response("login.html", locals())
        response.set_cookie('username', username)
        response.set_cookie('usercolor', usercolor)
    else:
       # 改成render就好了...
       response = render(request, "login.html")
    return response

相关文章

网友评论

      本文标题:django的csrf踩坑

      本文链接:https://www.haomeiwen.com/subject/gzrxjqtx.html