form表格提交post請求,到後端變成了get請求,這個坑怎麼填?!
阿新 • • 發佈:2018-11-22
前端的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