form表格提交post请求,到后端变成了get请求,这个坑怎么填?!

前端的post请求到后端变成了get请求,什么鬼?

本人在编写flask服务器项目过程中,需要从前端接收用户的登录信息,将用户信息保存进session和cookie中。
后端代码如下:

@app.route('/login',methods=['GET','POST'])
def login_views():
    if request.method == 'GET':
        # 判断是否已经在登录状态:session中是否有uname值
        if 'uname' in session:
            # 已经登录成功,直接去首页
            return redirect('/')
        else:
            # 未在登录状态,继续判断cookie
            if 'uname' in request.cookies:
                # 曾经记录过用户,取出值,保存进session
                uname = request.cookies['uname']
                session['uname'] = uname
                return redirect('/')
            else:
                # 去往登录页
                return render_template('login.html')
    else:
        # 先处理登录,登录成功回首页;否则回登录页面。
        uname = request.form.get('uname')
        upwd = request.form.get('upwd')
        print('********************')
        print(uname)
        print(upwd)
        print('********************')
        if uname == 'admin' and upwd == 'admin':
            # 声明重定向首页的对象
            resp = redirect('/')
            # 登录成功
            # 先将数据保存近session
            session['uname'] = uname
            # 是否要记住密码
            if 'isSaved' in request.form:
                # 需要记住密码,将信息保存进cookies
                resp.set_cookie('uname',uname,60*60*24*31)
            return resp
        else:
            # 登录失败
            return redirect('/login')

在点击登录前,控制台中的cookie和session数据为空:
在这里插入图片描述
目标结果图片如下:
在这里插入图片描述
但实际结果却是下图所示:
在这里插入图片描述
本人不死心,找来前端核心代码查看,代码如下:

<form action="/login" method="post">
    <p>
        用户名:<input type="text" name="uname">
    </p>
    <p>
        用户密码:<input type="password" name="upwd">
    </p>
    <p>
        记住密码:<input type="checkbox" name="isSaved">
    </p>
    <p>
        <input type="submit" name="login" value="登录">
    </p>                  
</form>

有错么???!!窃以为,没有!!!

我不服!重写代码如下:

<form action="/login" method="post">
    <p>
        用户名:<input type="text" name="uname">
    </p>
    <p>
        用户密码:<input type="password" name="upwd">
    </p>
    <p>
        记住密码:<input type="checkbox" name="isSaved">
    </p>
    <p>
        <input type="submit" name="login" value="登录">
    </p>                  
</form>

运行,成功!!!结果如下:

在这里插入图片描述
上面两端代码有区别么?

我从前到后看来10遍!10遍!!!没有发现问题!!!!

于是决定从后向前一句一句地替换,当只剩下第一条语句还没有检查时,问题依然没有发现。也就是说,问题出现在下面这句代码:

错误代码:
<form action="/login" method="post">
正确代码:
<form action="/login" method="post">

我依然认为这两句代码是一模一样的,但是问题果然出现在这一句。WHY???!!!
正当我开始怀疑人生时,居然发现,这两句代码虽然是一个爹生的,但貌似长度不一样。问题出现在下面两个单词中间的空格上!!

"/login" method   #中间隐藏了一个中文空格
"/login" method

把空格改掉之后,果然如此!!

原因原来是这样:
当post请求代码中出现语法错误时,代码本身有时候是不报错的。但是post请求却无法提交,而是将post请求信息封装到url地址中,以get请求方式提交。

也就出现了下面的这种url地址:

http://127.0.0.1:6060/login?uname=admin&upwd=admin&isSaved=on&login=%E7%99%BB%E5%BD%95
当然,具体什么语法错误,要就事论事!!
此坑已填!!!!!

猜你喜欢

转载自blog.csdn.net/weixin_43409302/article/details/83756204