首頁>技術>

預設監聽的是 " 127.0.0.1:5000", 若想調整, 可以在run的時候加入引數 host 和 port> 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)的方法, 例如

app.py 調整為

app.py

重新執行app.run()後, 在瀏覽器中輸入 http://localhost:5000, 會看到相應的輸出

配置檔案載入配置檔案的方式有幾種,from_object/ from_envvar/ from_pyfile其中, from_envvar 會載入環境變數中指定的檔案, 格式與 from_pyfile 相同, 路徑為相對(app.py)或者是絕對路徑我更傾向於使用 from_envvar/ from_pyfile 這種方式來載入配置檔案,理由如下專案開發,一般會分為 開發環境/ 測試環境/ 生產環境,會有不同的配置檔案由於配置檔案中可能會存放資料庫連線資訊,金鑰等敏感欄位,因此,不建議將測試/ 生產環境的配置上傳到程式碼伺服器上理想的方式是通過配置中心服務來管理,但是配置中心服務不一定會有專案的開發及初期運維可能會是同一個人,因此,可以在配置測試/ 生產環境的伺服器時,由開發人員將所需配置直接寫在相應的伺服器上,通過環境變數的方式指定其路徑即可在使用 supervisor 來管理專案程序時,可以通過配置 environment 來實現最簡單的配置檔案
# config.pyDEBUG = 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

修改配置檔案(使用 SQLite 來說明)# 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

初始化 migrate, 建立資料夾 migrations, 執行命令 flask db init, 這個時候檢視資料庫, 是沒有User 表的, 因為通過 app.py 所引用的包中, 並沒有使用到 models.user.User, 這裡, 有幾種方式可以解決這個問題,一是, 先寫用到 models.user.User 的 Blueprint, 接著在 app.py 中註冊這個 Blueprint 即可二是, 臨時在 app.py 中匯入, 在完成之後, 再刪除匯入即可三是, 通過另外的管理指令碼, 考慮到在初始化資料庫時可能會有其他的操作, 建立了 manage.py 這個檔案

manage.py

manage.py

增加藍圖 users新增查詢所有使用者的api /api/users

views/user.py

views/__init__.py

配置登入認證修改 models.user.User, 繼承 flask_login.UserMixin, 並重寫方法 get_id

models.user.py

修改配置檔案 config.py, 增加 SECRET_KEY = 'yoursecretkey', 不建議用過於簡單的key, 官方推薦通過 os.urandom 來生成, 這裡可能有一個地方需要注意, 當服務部署為多程序時(使用 gunicorn), 千萬避免寫成如下形式, SECRET_KEY = os.urandom(16), 由於每個程序都會生成一個隨機數, 可能會導致需要使用者重複登入, 這是個很愚蠢的錯誤, 由於我在開發時使用了 supervisor + gunicorn 來管理, 因此忘記了多程序的問題, 困惑了我好一會兒修改 app.py

app.py

unauthorized 方法: 在使用者未登入時, 會呼叫此方法load_user_from_request 方法: 通過 Request 資訊(header/ body/ ...)載入使用者, 有一點需要注意, 當 session 中存在使用者資訊時(在 request cookie 中包含 session_id), 不會呼叫此方法load_user 方法: 獲取當前登入使用者的資訊增加藍圖 login

views/login.py

未完待續通過 supervisor/ gunicorn/ nginx 來部署專案gunicorn/ supervisor 的配置項相關連結flask 文件: https://flask.palletsprojects.com/en/1.1.x/flask_login 文件: https://flask-login.readthedocs.io/en/latest/flask_migrate 文件: https://flask-migrate.readthedocs.ioflask_sqlalchemy 文件: https://flask-sqlalchemy.palletsprojects.com/en/2.x/專案 Github 連結: https://github.com/liuxuange/flask_tutorial鳴謝感謝在專案中幫助過我的人(抱歉, 不便透露真實姓名)

最新評論
  • BSA-TRITC(10mg/ml) TRITC-BSA 牛血清白蛋白改性標記羅丹明
  • 如何使用Javascript快速實現Web IM