1. 程式人生 > >form表格提交post請求,到後端變成了get請求,這個坑怎麼填?!

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
當然,具體什麼語法錯誤,要就事論事!!
此坑已填!!!!!