一個基于flask的web應用誕生 flask和mysql相連(4)
上一章實現(xiàn)了登錄的部分功能,之所以說是部分功能,是因為用戶名和密碼寫成固定值肯定是不可以的,一個整體的功能,至少需要注冊,登錄,密碼修改等,這就需要提供一個把這些值存儲到數(shù)據(jù)庫的能力。
當前的主流數(shù)據(jù)庫分為兩種,即關(guān)系數(shù)據(jù)庫和NoSql數(shù)據(jù)庫,對于中小型的系統(tǒng)來說,兩種數(shù)據(jù)庫性能,易用性都相當,都是很好的選擇。
基礎(chǔ)配置
這里使用SQLAlchemy數(shù)據(jù)庫框架的flask集成包,即flask-SQLAlchemy來進行數(shù)據(jù)庫操作。
SQLAlchemy是一個非常好的框架,簡化了數(shù)據(jù)庫的操作,即提供了高層次的ORM,也提供了低層次的SQL功能,使用起來非常方便。
安裝方式與之前類型,還是pip命令:
pip3.6 install flask-sqlalchemy
安裝完成之后,對default的配置部分進行修改,首先導入包:
from flask.ext.sqlalchemy import SQLAlchemy
然后配置鏈接字符串:
app.config["SQLALCHEMY_DATABASE_URI"]='mysql://root:1234@localhost/cblog'
配置請求結(jié)束后更改自動提交:
app.config["SQLALCHEMY_COMMIT_ON_TEARDOWN"]=True
實例化SQLAlchemy:
db=SQLAlchemy(app)
模型設(shè)置
安裝完成之后,繼續(xù)完善登錄的例子,修改default.py文件,新增User模型(類)和Role模型(以示關(guān)聯(lián))
Role類
class Role(db.Model): #需繼承模型 __tablename__="roles" #db中表明,如果不設(shè)置,則會與class同的默認名 id=db.Column(db.Integer,primary_key=True) #SQLAlchemy要求必須有主鍵,一般命名為id即可 name=db.Column(db.String(50),unique=True) #表示name為字符串,不重復 users=db.relationship("User",backref='role') #關(guān)聯(lián)user模型,并在user中添加反向引用(backref)
User類
class User(db.Model): __tablename__="users" id=db.Column(db.Integer,primary_key=True) username=db.Column(db.String(50),unique=True,index=True) #此列帶索引 password=db.Column(db.String(50)) role_id=db.Column(db.Integer,db.ForeignKey("roles.id")) #外鍵指向roles表中的id列
下面要考慮如何執(zhí)行,要既方便,有不能入侵到邏輯代碼,這就要求不能硬編碼到邏輯代碼中,比如把判斷db狀態(tài)的代碼作為參數(shù)傳遞給app.run(),這時候shell就派上了用場
配置腳本
想讓flask支持命令行腳本,首先需要安裝flask-script擴展:
pip3.6 install flask-script
修改default.py的代碼:
from flask.ext.script import Manager mamager=Manager(app) .... if __name__=='__main__': #app.run(debug=True) mamager.run()
修改過之后,再次運行:
python default.py
發(fā)現(xiàn)并沒有成功運行,而是有提示:
可以看到,后邊需要參數(shù),分別為shell(執(zhí)行腳本),runserver(啟動服務)和幫助
下邊啟動服務:
python default.py runserver
服務成功執(zhí)行
數(shù)據(jù)庫更多配置
但這個時候,訪問站點(127.0.0.1:5000),會出現(xiàn)500錯誤,提示沒有mysql模塊,這是為什么呢?很明顯是沒有安裝mysql驅(qū)動的原因,使用pip命令安裝驅(qū)動:
pip3.6 install MySQL-python
發(fā)現(xiàn)出現(xiàn)錯誤,顯示內(nèi)容為(此處僅為win系統(tǒng)):
根據(jù)提示,安裝c++的工具包,按照提示上的下載地址
http://landinghub.visualstudio.com/visual-cpp-build-tools
下載完成直接為exe文件,安裝
重啟后安裝MySQL-python,發(fā)現(xiàn)還是不可以,經(jīng)百度后才發(fā)現(xiàn),MySQLdb這個庫最高只支持到python2.7,不在支持3.x,那只好用其他辦法,使用PyMySQL庫:
pip3.6 install PyMySQL
然后修改default.py的代碼,增加兩行:
import pymysql pymysql.install_as_MySQLdb()
進入源碼,注意這一行:
sys.modules["MySQLdb"] = sys.modules["_mysql"] = sys.modules["pymysql"]
即可成功使用并連接mysql。
瀏覽器輸入連接,正確進入站點。
接下來,使用shell建立數(shù)據(jù)庫表,進入default.py根目錄:
python default.py shell from default import db db.create_all()
這時候如果沒有報錯,那么數(shù)據(jù)庫表應該建立完成:
數(shù)據(jù)庫遷移
那么問題來了,這時候,對模型進行修改,是不會反應到db中的,那么如果修改怎么辦呢?對于當前來說,也很簡單:
db.drop_all() db.create_all()
但這個僅僅是現(xiàn)在調(diào)試時候使用,如果db中已經(jīng)有了數(shù)據(jù),則這個肯定是無法忍受的,這時候,就輪到數(shù)據(jù)庫遷移插件Migrate登場了,首先還是一樣,需要進行安裝:
pip3.6 install flask-migrate
和之前一樣,安裝完之后修改default.py文件進行配置:
from flask.ext.migrate import Migrate,MigrateCommand migrate=Migrate(app,db) #配置遷移 mamager.add_command("db",MigrateCommand) #配置遷移命令
然后使用init命令初始化遷移倉庫
python default.py db init
命令行顯示:
然后增加migrations目錄:
表示遷移文件已經(jīng)初始化完成。
migrate框架提供了一些命令來進行遷移操作,分別為(使用default.py文件舉例):
#根據(jù)差異創(chuàng)建遷移 python default.py db migrate -m "說明" #改動差異 python default.py db upgrade #取消差異改動 python default.py db downgrade
回到表單
接下來看看登錄如何與數(shù)據(jù)庫關(guān)聯(lián)起來,修改login方法內(nèi)的代碼:
@app.route("/login",methods=["POST"]) def loginPost(): username=request.form.get("username","") password=request.form.get("password","") user=User.query.filter_by(username=username,password=password).first() #數(shù)據(jù)庫查詢 if user is not None: session["user"]=username return render_template("/index.html",name=username,site_name='myblog') else: flash("您輸入的用戶名或密碼錯誤") return render_template("/login.html") #返回的仍為登錄頁
執(zhí)行結(jié)果非常完美。
一些總結(jié)
下面是一些關(guān)于python和db相連的總結(jié)性的東西
數(shù)據(jù)類型
列選項
數(shù)據(jù)庫操作
查詢過濾器
經(jīng)過這幾章,登錄功能已經(jīng)基本完成,在下一章中將講解用戶注冊的相關(guān)功能。
以上就是本文的全部內(nèi)容,希望對大家的學習有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
Keras 實現(xiàn)加載預訓練模型并凍結(jié)網(wǎng)絡(luò)的層
這篇文章主要介紹了Keras 實現(xiàn)加載預訓練模型并凍結(jié)網(wǎng)絡(luò)的層,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2020-06-06python tkiner實現(xiàn) 一個小小的圖片翻頁功能的示例代碼
這篇文章主要介紹了python tkiner實現(xiàn) 一個小小的圖片翻頁功能,需要的朋友可以參考下2020-06-06PyTorch CNN實戰(zhàn)之MNIST手寫數(shù)字識別示例
本篇文章主要介紹了PyTorch CNN實戰(zhàn)之MNIST手寫數(shù)字識別示例,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2018-05-05舉例講解Django中數(shù)據(jù)模型訪問外鍵值的方法
這篇文章主要介紹了舉例講解Django中數(shù)據(jù)模型訪問外鍵值的方法,Django是最具人氣的Python web開發(fā)框架,需要的朋友可以參考下2015-07-07