一、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;
}
}