一個基於flask的web應用誕生第四篇,這篇文章主要介紹瞭如何讓flask和mysql進行互聯,具有一定的參考價值,感興趣的小伙伴們可以參考一下
#上一章實現了登錄的部分功能,之所以說是部分功能,是因為用戶名和密碼寫成固定值肯定是不可以的,一個整體的功能,至少需要註冊,登錄,密碼修改等,這就需要提供一個把這些值儲存到資料庫的能力。
目前的主流資料庫分為兩種,即關聯式資料庫和NoSql資料庫,對於中小型的系統來說,兩種資料庫效能,易用性都相當,都是很好的選擇。
基礎設定
這裡使用SQLAlchemy資料庫框架的flask整合包,也就是flask-SQLAlchemy來進行資料庫操作。
SQLAlchemy是一個非常好的框架,簡化了資料庫的操作,也就是提供了高層次的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'
設定請求結束後更改自動提交:
app.config["SQLALCHEMY_COMMIT_ON_TEARDOWN"]=True
實例化SQLAlchemy:
db=SQLAlchemy(app)
模型設定
class Role(db.Model): #需继承模型 __tablename__="roles" #db中表明,如果不设置,则会与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') #关联user模型,并在user中添加反向引用(backref)
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列
設定腳本
pip3.6 install flask-script
from flask.ext.script import Manager mamager=Manager(app) .... if __name__=='__main__': #app.run(debug=True) mamager.run()
python default.py
python default.py runserver
資料庫更多設定
##但這個時候,造訪網站(127.0.0.1:5000),會出現500錯誤,提示沒有mysql模組,這是為什麼呢?很明顯是沒有安裝mysql驅動的原因,使用pip指令安裝驅動程式:
pip3.6 install MySQL-python
發現出現錯誤,顯示內容為(此處僅為win系統):
根據提示,安裝c++的工具包,按照提示上的下載地址
landinghub.visualstudio.com/visual-cpp-build-tools
#下載完成直接為exe文件,安裝
重啟後安裝MySQL-python,發現還是不可以,經過百度後才發現,MySQLdb這個函式庫最高只支援到python2.7,不在支援3.x,那隻好用其他辦法,用PyMySQL函式庫:
pip3.6 install PyMySQL
import pymysql
pymysql.install_as_MySQLdb()
sys.modules["MySQLdb"] = sys.modules["_mysql"] = sys.modules["pymysql"]
接下來,使用shell建立資料庫表,進入default.py根目錄:
python default.py shell from default import db db.create_all()
這時候如果沒有報錯,那麼資料庫表應該建立完成:
#那麼問題來了,這時候,對模型進行修改,是不會反應到db的,那如果修改怎麼辦呢?對於目前來說,也很簡單:
db.drop_all() db.create_all()
但這個僅僅是現在調試時候使用,如果db中已經有了數據,則這個肯定是無法忍受的,這時候,就輪到數據庫遷移插件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目錄:
表示遷移文件已經初始化完成。
migrate框架提供了一些命令来进行迁移操作,分别为(使用default.py文件举例):
#根据差异创建迁移 python default.py db migrate -m "说明" #改动差异 python default.py db upgrade #取消差异改动 python default.py db downgrade
回到表单
接下来看看登录如何与数据库关联起来,修改login方法内的代码:
@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() #数据库查询 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") #返回的仍为登录页
执行结果非常完美。
一些总结
下面是一些关于python和db相连的总结性的东西
数据类型
列选项
数据库操作
查询过滤器
经过这几章,登录功能已经基本完成,在下一章中将讲解用户注册的相关功能。
以上是flask和mysql相連的實例詳解(python)的詳細內容。更多資訊請關注PHP中文網其他相關文章!