Python框架之Flask教程(二)

fans news 發佈 2021-12-04T07:51:31+00:00

一、Flask的資料庫SQLAlchemy1.1 SQLAlchemy簡介: SQLAlchemy是一個關係型資料庫框架,它提供了高層的ORM和底層的原生資料庫的操作。 flask-sqlalchemy是一個簡化了SQLAlchemy操作的flask擴展。1.

一、flask的資料庫SQLAlchemy

1.1 SQLAlchemy簡介:

SQLAlchemy是一個關係型資料庫框架,它提供了高層的ORM和底層的原生資料庫的操作。

flask-sqlalchemy是一個簡化了SQLAlchemy操作的flask擴展。


1.2 SQLAlchemy的使用:

1.2.1安裝導入: 安裝flask_sqlalchemy

from flask import Flask

from flask_sqlalchemy import SQLAlchemy


1.2.2創建flask的app:

app = Flask(__name__)


1.2.3配置SQLAlchemy參數:

class Config(object):

"""配置參數"""

# sqlalchemy的配置參數

SQLALCHEMY_DATABASE_URI = "mysql://root:mysql@127.0.0.1:3306/db_python04"

資料庫類型://用戶名:密碼@資料庫地址:埠號/資料庫名

# 設置sqlalchemy自動更跟蹤資料庫

SQLALCHEMY_TRACK_MODIFICATIONS = True


1.2.4添加配置到app:

app.config.from_object(Config)


1.2.5創建資料庫sqlalchemy工具對象:

db = SQLAlchemy(app)


1.2.6定義資料庫表:

class Role(db.Model):

"""用戶角色/身份表"""

__tablename__ = "tbl_roles" #表名


id = db.Column(db.Integer, primary_key=True) #表的主鍵

name = db.Column(db.String(32), unique=True)

users = db.relationship("User", backref="role")


def __repr__(self):

"""定義之後,可以讓顯示對象的時候更直觀"""

return "Role object: name=%s" % self.name


1.2.7啟動函數執行的命令:

if __name__ == '__main__':

# 清除資料庫里的所有數據

db.drop_all()


# 創建所有的表

db.create_all()


# 創建對象

role1 = Role(name="admin")

# session記錄對象任務

db.session.add(role1)

# 提交任務到資料庫中

db.session.commit()



二、資料庫遷移

2.1首先要在虛擬環境中安裝Flask-Migrate:

pip install flask-migrate


2.2導入相關文件:

from flask_migrate import Migrate,MigrateCommand

from flask_script import Shell,Manager


2.3使用Manager管理我們創建的app:

app = Flask(__name__)

manager = Manager(app)


2.4配置資料庫參數,同上1.2.3


2.5使用migrate將配置的資料庫與app關聯起來:

#第一個參數是Flask的實例,第二個參數是Sqlalchemy資料庫實例

migrate = Migrate(app,db)


2.6在flask-Script中的manager中添加一個db命令:

manager.add_command('db',MigrateCommand)


2.7定義模型類,同上1.2.6


2.8運行管理器:

if __name__ == '__main__':

manager.run()


2.9創建遷移倉庫,在命令行輸入:

#這個命令會創建migrations文件夾,所有遷移文件都放在裡面。

python code.py db init


2.10創建遷移腳本,同Django類似,有兩個命令:

#創建自動遷移腳本

python code.py db migrate -m 'initial migration' #後面為腳本的備註

#更新資料庫

python code.py db upgrade



三、發送郵件

3.1Flask框架使用Flask-Mail擴展包實現發送郵件功能


3.2使用QQ郵箱的smtp伺服器:


3.3在代碼中導入Flask-Mail擴展包:

from flask_mail import Mail, Message


3.4配置發送郵件需要的參數:

#配置郵件:伺服器/埠/傳輸層安全協議/郵箱名/密碼

app.config.update(

DEBUG = True,

MAIL_SERVER='smtp.qq.com',

MAIL_PROT=465,

MAIL_USE_TLS = True,

MAIL_USERNAME = '371673381@qq.com',

MAIL_PASSWORD = 'goyubxohbtzfbidd',

)


3.5關聯app:

mail = Mail(app)


3.6在視圖函數中的處理:

# sender 發送方,recipients 接收方列表

msg = Message("This is a test ",sender='371673381@qq.com', recipients= ['371673381@qq.com'])

#郵件內容

msg.body = "Flask test mail"


#發送郵件

mail.send(msg)


四、Flask中的藍圖

4.1藍圖簡介:藍圖是用於實現單個應用的視圖、模板、靜態文件的集合


4.2藍圖的初始化:

#Blueprint必須指定兩個參數,admin表示藍圖的名稱,__name__表示藍圖所在模塊

admin = Blueprint('admin',__name__)


4.3註冊藍圖路由:

@admin.route('/')

def admin_index():

return 'admin_index'


4.4在程序實例中註冊該藍圖:

app.register_blueprint(admin,url_prefix='/admin')


五、單元測試

5.1單元測試的意義:

Web程序開發過程一般包括以下幾個階段:[需求分析,設計階段,實現階段,測試階段]。其中測試階段通過人工或自動來運行測試某個系統的功能。目的是檢驗其是否滿足需求,並得出特定的結果,以達到弄清楚預期結果和實際結果之間的差別的最終目的。


5.2測試的分類:單元測試、集成測試、系統測試等,其中單元測試是由開發人員進行的


5.3單元測試的方法:開發者編寫一小段代碼,檢驗目標代碼的功能是否符合預期。通常情況下,單元測試主要面向一些功能單一的模塊進行。


5.4單元測試中斷言(assert)的使用:

5.4.1常用的斷言方法:

assertEqual 如果兩個值相等,則pass

assertNotEqual 如果兩個值不相等,則pass

assertTrue 判斷bool值為True,則pass

assertFalse 判斷bool值為False,則pass

assertIsNone 不存在,則pass

assertIsNotNone 存在,則pass


5.5單元測試的基本寫法:

5.5.1定義一個類,繼承自unittest.TestCase:

import unittest


class TestClass(unitest.TestCase):

#該方法會首先執行,方法名為固定寫法

def setUp(self):

pass

#測試代碼,函數命名格式一定以test_開頭

def test_app_exists(self):

pass

#該方法會在測試代碼執行完後執行,方法名為固定寫法

def tearDown(self):

pass


六、Flask的部署

6.1Flask部署示意圖:


6.2由上圖可以看出,Flask部署主要方式是Nginx+gunicorn+flask

其中Gunicorn(綠色獨角獸)是一個Python WSGI的HTTP伺服器,

優點是Gunicorn直接用命令啟動,不需要編寫配置文件,相對uWSGI要容易很多。


6.3Gunicorn的安裝:pip install gunicorn


6.4運行Gunicorn

#指定進程和埠號: -w: 表示進程(worker)-b:表示綁定ip地址和埠號(bind)。

$gunicorn -w 4 -b 127.0.0.1:5001 運行文件名稱:Flask程序實例名


6.5安裝Nginx:$sudo apt-get install nginx


6.6nginx的相關指令:先進入/usr/local/nginx/目錄

#啟動

sudo sbin/nginx

#查看

ps aux | grep nginx

#停止

sudo sbin/nginx -s stop


6.7修改nginx配置:打開/usr/local/nginx/conf/nginx.conf文件


server {

# 監聽80埠

listen 80;

# 本機

server_name localhost;

# 默認請求的url

location / {

#請求轉發到gunicorn伺服器

proxy_pass http://127.0.0.1:5001;

#設置請求頭,並將頭信息傳遞給伺服器端

proxy_set_header Host $host;

}

}

關鍵字: