flask和mysql相連的實例詳解(python)

Y2J
發布: 2017-04-26 11:09:59
原創
5648 人瀏覽過

一個基於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)
登入後複製

模型設定

安裝完成之後,繼續完善登入的範例,修改default.py文件,新增User模型(類別)和Role模型(以示關聯)

Role類別

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)
登入後複製

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列
登入後複製

下面要考慮如何執行,要既方便,有不能入侵到邏輯程式碼,這就要求不能硬編碼到邏輯程式碼中,例如把判斷db狀態的程式碼當作參數傳遞給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
登入後複製

發現並沒有成功運行,而是有提示:


#可以看到,後邊需要參數,分別為shell(執行腳本),runserver(啟動服務)與說明

下邊啟動服務:

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
登入後複製

然後修改default.py的程式碼,增加兩行:

import pymysql
pymysql.install_as_MySQLdb()
登入後複製

進入原始碼,注意這一行:

sys.modules["MySQLdb"] = sys.modules["_mysql"] = sys.modules["pymysql"]
登入後複製
即可成功使用並連接mysql。

瀏覽器輸入連接,正確進入網站。


接下來,使用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中文網其他相關文章!

相關標籤:
來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板