前后端交互就是在網(wǎng)頁(yè)上點(diǎn)擊一個(gè)按鈕或者是提交一個(gè)表單近刘,怎么傳到后端熙尉,后端怎么傳到數(shù)據(jù)庫(kù)里药有,又怎么返回?cái)?shù)據(jù)到前端的問題毅戈。
這里簡(jiǎn)單分為以下幾類:
1.前端提交表單數(shù)據(jù)傳給后端,后端接收返回一個(gè)新頁(yè)面愤惰。
舉一個(gè)登陸界面的簡(jiǎn)單例子苇经,前端輸入賬號(hào)密碼,后端從數(shù)據(jù)庫(kù)取出數(shù)據(jù)進(jìn)行比對(duì)宦言,如果一致則轉(zhuǎn)向主頁(yè)面扇单,不一致則返回當(dāng)前頁(yè)面。
html代碼:
<form class="form-4" action="/main/" method="post">
<h1>Login</h1>
<p>
<label for="login">Username or email</label>
<input type="text" name="login" placeholder="NameId" required>
</p>
<p>
<label for="password">Password</label>
<input type="password" name='password' placeholder="Password" required>
</p>
<p>
<input type="submit" name="submit" value="登陸" >
</p>
</form>?
兩個(gè)輸入框蜡励,賬號(hào)和密碼令花,和一個(gè)提交的按鈕。
在form標(biāo)簽里面以post方式進(jìn)行提交凉倚,action里面的就是你點(diǎn)擊按鈕的時(shí)候要跳轉(zhuǎn)到的url兼都,這時(shí)候我們就要在app.py里面來(lái)定義這個(gè)路由了。
后端代碼:
@app.route('/main/', methods=['post'])
def yanzheng():
nameid = request.form['login']
ps = request.form['password']
conn = pymysql.connect(host='127.0.0.1', port=3306, user='root', password='123', db='ci', charset='utf8')
cur = conn.cursor()
sql = "SELECT `name`, `password` FROM `information` WHERE name_id =" + nameid
cur.execute(sql)
realps = cur.fetchall()
conn.close()
session.permanent = True # 默認(rèn)session的時(shí)間持續(xù)31天
session['name_id'] = nameid
session['name_name'] = realps[0][0]
if ps == realps[0][1] :
return render_template('index.html')
else:
return render_template('login.html')
說明:
1.第一行單引號(hào)里面的 /main/ 這個(gè)路由和你上面html里面action里面一致稽寒,方法是post.
2.函數(shù)名隨便取扮碧,不過不要像我這樣不規(guī)范。
3.之后的2行是從form表單里接受的數(shù)據(jù),中括號(hào)里面的login,password是html標(biāo)簽里的name屬性慎王。
4.之后的6行是連接數(shù)據(jù)庫(kù)蚓土,根據(jù)name_id 從本地的 ci數(shù)據(jù)庫(kù)的 information表中取出來(lái) name 和 password兩項(xiàng),把值給realps這個(gè)元祖里面赖淤。此時(shí)realps=(('zhangsan','123'),)是一個(gè)二元數(shù)組蜀漆。
5.由于登陸一般都需要開啟會(huì)話session,簡(jiǎn)言之就是需要設(shè)置全局變量咱旱,
session['name_id'] = nameid
session['name_name'] = realps[0][0]
這就把這里接收到的nameid和數(shù)據(jù)庫(kù)中取出的'zhangsan'設(shè)置成了全局變量确丢,在其他@app.route()里面以如下方式調(diào)用全局變量:
@app.route('/sign_in', methods=['post'])
def sign_in():
name = session.get('name_name')
name_id = session.get('name_id')
6.最后就是判斷了,如果密碼相等吐限,就轉(zhuǎn)向主頁(yè)面鲜侥,如果不相等則返回登陸頁(yè)面。
7.需要至少引入以下模塊(應(yīng)該不用這么多诸典,記不清了描函,不過其他地方應(yīng)該能用到......):
from flask import Flask,render_template,request,session
import pymysql
import time
import json
import os
from datetime import timedelta
import datetime
app = Flask(__name__)
app.config['SECRET_KEY'] = os.urandom(24)
app.config['PERMANENT_SESSION_LIFETIME'] = timedelta(days=1) # 設(shè)置session的保存時(shí)間。