国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 編程 > Python > 正文

一個基于flask的web應用誕生 flask和mysql相連(4)

2019-11-25 16:15:26
字體:
來源:轉載
供稿:網友

上一章實現了登錄的部分功能,之所以說是部分功能,是因為用戶名和密碼寫成固定值肯定是不可以的,一個整體的功能,至少需要注冊,登錄,密碼修改等,這就需要提供一個把這些值存儲到數據庫的能力。

當前的主流數據庫分為兩種,即關系數據庫和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 Managermamager=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++的工具包,按照提示上的下載地址

http://landinghub.visualstudio.com/visual-cpp-build-tools

下載完成直接為exe文件,安裝

重啟后安裝MySQL-python,發現還是不可以,經百度后才發現,MySQLdb這個庫最高只支持到python2.7,不在支持3.x,那只好用其他辦法,使用PyMySQL庫:

pip3.6 install PyMySQL

然后修改default.py的代碼,增加兩行:

import pymysqlpymysql.install_as_MySQLdb()

進入源碼,注意這一行:

sys.modules["MySQLdb"] = sys.modules["_mysql"] = sys.modules["pymysql"]

即可成功使用并連接mysql。
瀏覽器輸入連接,正確進入站點。

接下來,使用shell建立數據庫表,進入default.py根目錄:

python default.py shellfrom default import dbdb.create_all()

這時候如果沒有報錯,那么數據庫表應該建立完成:


數據庫遷移

那么問題來了,這時候,對模型進行修改,是不會反應到db中的,那么如果修改怎么辦呢?對于當前來說,也很簡單:

db.drop_all()db.create_all()

但這個僅僅是現在調試時候使用,如果db中已經有了數據,則這個肯定是無法忍受的,這時候,就輪到數據庫遷移插件Migrate登場了,首先還是一樣,需要進行安裝:

pip3.6 install flask-migrate

和之前一樣,安裝完之后修改default.py文件進行配置:

from flask.ext.migrate import Migrate,MigrateCommandmigrate=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相連的總結性的東西

數據類型

列選項

數據庫操作

查詢過濾器

經過這幾章,登錄功能已經基本完成,在下一章中將講解用戶注冊的相關功能。

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持武林網。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 阜平县| 汉中市| 吕梁市| 沐川县| 宁安市| 饶平县| 高安市| 大宁县| 秦皇岛市| 资阳市| 西乡县| 康乐县| 龙陵县| 方城县| 宜都市| 四会市| 望江县| 读书| 福贡县| 通许县| 托里县| 商城县| 鲁甸县| 马关县| 盐源县| 自治县| 宣化县| 通渭县| 正安县| 昌乐县| 丹阳市| 洞头县| 恩平市| 龙海市| 贵州省| 盐津县| 彰化市| 威海市| 澜沧| 台南县| 民勤县|