django的csrf踩坑

环境: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
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • 一、Django框架前言知识: 1、C/S和B/S的区别: C/S结构软件:客户端/服务端软件,即客户端要自己下载...
    月下独酌123阅读 10,319评论 0 36
  • 在上一个章节,我们已经创建了一个基础的Blog程序。现在我们将使用一些Dajngo高级功能,去实现一个完整的blo...
    金金刚狼阅读 8,983评论 1 12
  • 此段内容简要来自自强学堂的教程详情请查询自强学堂 一、 后台的运作流程 接收request请求 处理数据 获取请求...
    coder_ben阅读 10,633评论 6 56
  • 利用HTTP协议向服务器传参的几种途径、响应、Cookie、Session、类视图、中间件 注意: 1>Dja...
    Cestine阅读 5,202评论 0 2
  • 当时买这本书也是出於一个好奇❤️,我想:什么样的人会如此地早起呢?早起的习惯会带给自己一样新的可能性呢?这...
    monkey立敏阅读 4,284评论 0 3

友情链接更多精彩内容