搜尋
首頁後端開發Python教學flask和mysql相連的實例詳解(python)

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

Apr 26, 2017 am 11:09 AM
flaskmysqlpython

一個基於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中文網其他相關文章!

陳述
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
Python中的合併列表:選擇正確的方法Python中的合併列表:選擇正確的方法May 14, 2025 am 12:11 AM

Tomergelistsinpython,YouCanusethe操作員,estextMethod,ListComprehension,Oritertools

如何在Python 3中加入兩個列表?如何在Python 3中加入兩個列表?May 14, 2025 am 12:09 AM

在Python3中,可以通過多種方法連接兩個列表:1)使用 運算符,適用於小列表,但對大列表效率低;2)使用extend方法,適用於大列表,內存效率高,但會修改原列表;3)使用*運算符,適用於合併多個列表,不修改原列表;4)使用itertools.chain,適用於大數據集,內存效率高。

Python串聯列表字符串Python串聯列表字符串May 14, 2025 am 12:08 AM

使用join()方法是Python中從列表連接字符串最有效的方法。 1)使用join()方法高效且易讀。 2)循環使用 運算符對大列表效率低。 3)列表推導式與join()結合適用於需要轉換的場景。 4)reduce()方法適用於其他類型歸約,但對字符串連接效率低。完整句子結束。

Python執行,那是什麼?Python執行,那是什麼?May 14, 2025 am 12:06 AM

pythonexecutionistheprocessoftransformingpypythoncodeintoExecutablestructions.1)InternterPreterReadSthecode,ConvertingTingitIntObyTecode,whepythonvirtualmachine(pvm)theglobalinterpreterpreterpreterpreterlock(gil)the thepythonvirtualmachine(pvm)

Python:關鍵功能是什麼Python:關鍵功能是什麼May 14, 2025 am 12:02 AM

Python的關鍵特性包括:1.語法簡潔易懂,適合初學者;2.動態類型系統,提高開發速度;3.豐富的標準庫,支持多種任務;4.強大的社區和生態系統,提供廣泛支持;5.解釋性,適合腳本和快速原型開發;6.多範式支持,適用於各種編程風格。

Python:編譯器還是解釋器?Python:編譯器還是解釋器?May 13, 2025 am 12:10 AM

Python是解釋型語言,但也包含編譯過程。 1)Python代碼先編譯成字節碼。 2)字節碼由Python虛擬機解釋執行。 3)這種混合機制使Python既靈活又高效,但執行速度不如完全編譯型語言。

python用於循環與循環時:何時使用哪個?python用於循環與循環時:何時使用哪個?May 13, 2025 am 12:07 AM

UseeAforloopWheniteratingOveraseQuenceOrforAspecificnumberoftimes; useAwhiLeLoopWhenconTinuingUntilAcIntiment.forloopsareIdealForkNownsences,而WhileLeleLeleLeleLeleLoopSituationSituationsItuationsItuationSuationSituationswithUndEtermentersitations。

Python循環:最常見的錯誤Python循環:最常見的錯誤May 13, 2025 am 12:07 AM

pythonloopscanleadtoerrorslikeinfiniteloops,modifyingListsDuringteritation,逐個偏置,零indexingissues,andnestedloopineflinefficiencies

See all articles

熱AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Clothoff.io

Clothoff.io

AI脫衣器

Video Face Swap

Video Face Swap

使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱門文章

熱工具

Dreamweaver CS6

Dreamweaver CS6

視覺化網頁開發工具

SublimeText3 Mac版

SublimeText3 Mac版

神級程式碼編輯軟體(SublimeText3)

SublimeText3漢化版

SublimeText3漢化版

中文版,非常好用

Dreamweaver Mac版

Dreamweaver Mac版

視覺化網頁開發工具

SublimeText3 英文版

SublimeText3 英文版

推薦:為Win版本,支援程式碼提示!