寫在最前
後臺編輯器對代碼塊的支持並不友好, 因此代碼塊大部分以圖片的形式展現, 最後可能會把代碼放到 github 上, 鏈接會在最後給出在篇文章的示例中,所有的 API 的返回都是 JSON使用到的擴展 flask-login/ flask-sqlalchemy/ flask-migrate第一次使用 flask 及其擴展,如文章中存在錯誤,請各位包涵,期待各位的指點最簡單的app
> app.run(host='0.0.0.0', port=8080)
...
* Running on http://0.0.0.0:8080/ (Press CTRL+C to quit)
最後部署項目的時候會用到 gunicorn, 通過 --bind 參數來調整第一個 Blueprint
Blueprint 是用來管理一組相似視圖(理解為管理api)的方法, 例如
# 用戶API Blueprint
/api/users
/api/users/<user> /<user>
# 組API Blueprint
/api/groups
/api/groups/<group>
index blueprint
app.py 調整為
app.py
重新運行app.run()後, 在瀏覽器中輸入 http://localhost:5000, 會看到相應的輸出
output
配置文件
加載配置文件的方式有幾種,from_object/ from_envvar/ from_pyfile其中, from_envvar 會加載環境變量中指定的文件, 格式與 from_pyfile 相同, 路徑為相對(app.py)或者是絕對路徑我更傾向於使用 from_envvar/ from_pyfile 這種方式來加載配置文件,理由如下項目開發,一般會分為 開發環境/ 測試環境/ 生產環境,會有不同的配置文件由於配置文件中可能會存放數據庫連接信息,密鑰等敏感字段,因此,不建議將測試/ 生產環境的配置上傳到代碼服務器上理想的方式是通過配置中心服務來管理,但是配置中心服務不一定會有項目的開發及初期運維可能會是同一個人,因此,可以在配置測試/ 生產環境的服務器時,由開發人員將所需配置直接寫在相應的服務器上,通過環境變量的方式指定其路徑即可在使用 supervisor 來管理項目進程時,可以通過配置 environment 來實現最簡單的配置文件# config.py
DEBUG = True
# app.py
...
加載配置文件
app.config.from_envvar('APP_CONFIG_FILE')
# 添加環境變量
> export APP_CONFIG_FILE="/yourpath/config.py"
# 或者在 supervisor 的配置文件中聲明
# environment=APP_CONFIG_FILE="/yourpath/config.py"
數據庫
用到的擴展組件flask-sqlalchemy: 基於ORM 框架 SQLAlchemyflask-migrate: 管理數據模型,用於初始化,升級,降級等操作增加 ext.py, 用於定義(聲明)用到的擴展組件ext.py
# config.py
...
SQLALCHEMY_DATABASE_URI = 'sqlite:///tutorial.db'
若是使用 MySQL, 需要在配置文件中加入 SQLALCHEMY_POOL_RECYCLE = 3600, 會自動收回無用的數據庫連接, 如果不加這個配置, 連接會在 8 小時後斷開, 要重啟 app 才可以恢復(這是在第一次使用的時候碰到的問題, 由於服務器沒有關閉, 第二天一早在使用時, 出現了連接斷開的異常)修改 app.py...
from ext import db, migrate
...
db.init_app(app)
migrate.init_app(app, db)
增加數據模型base.py
user.py
manage.py
manage.py
增加藍圖 users
添加查詢所有用戶的api /api/usersviews/user.py
views/__init__.py
# app.py
...
from views import index, user
...
app.register_blueprint(user.bp)
瀏覽器中輸入 http://localhost:5000, 會看到返回結果如下配置登錄認證
修改 models.user.User, 繼承 flask_login.UserMixin, 並重寫方法 get_idmodels.user.py
app.py
增加藍圖 login
views/login.py
...
from views import index, user, login
...
app.register_blueprint(login.bp)
修改 views/users.py...
from flask_login import login_required
...
@bp.route('')
@login_required
def list_users(): ...
此時, 訪問 http://localhost:5000/api/users, 會返回 401 錯誤