久久久精品久久久久久96,91国高清在线,欧美日韩高清国产aⅴ一区,在线观看亚洲欧美一区二区三区

<sub id="e1sa3"></sub>

    <pre id="e1sa3"><del id="e1sa3"></del></pre>
    <noscript id="e1sa3"></noscript>

      新疆信息港歡迎您!

      新疆信息港
      新疆信息港 > 資訊 >基于 Flask 開發(fā) RESTful API 的簡單向?qū)?

      基于 Flask 開發(fā) RESTful API 的簡單向?qū)?

      2020-11-19 04:20:16
      來源:互聯(lián)網(wǎng)
      閱讀:-

      SQLALCHEMY_DATABASE_URI= 'sqlite:///tutorial.db'若是使用 MySQL, 需要在配置文件中加入 SQLALCHEMY_POOL_RECYCLE = 3600, 會自動收回?zé)o用的數(shù)據(jù)庫連接, 如果不加這個配置, 連接會在 8 小時后斷開...

      基于 Flask 開發(fā) RESTful API 的簡單向?qū)? inline=

      寫在最前

      • 后臺編輯器對代碼塊的支持并不友好, 因此代碼塊大部分以圖片的形式展現(xiàn), 最后可能會把代碼放到 github 上, 鏈接會在最后給出
      • 在篇文章的示例中,所有的 API 的返回都是 JSON
      • 使用到的擴展 flask-login/ flask-sqlalchemy/ flask-migrate
      • 第一次使用 flask 及其擴展,如文章中存在錯誤,請各位包涵,期待各位的指點

      最簡單的app

      基于 Flask 開發(fā) RESTful API 的簡單向?qū)? inline=

      基于 Flask 開發(fā) RESTful API 的簡單向?qū)? inline=

      • 默認(rèn)監(jiān)聽的是 " 127.0.0.1:5000", 若想調(diào)整, 可以在run的時候加入?yún)?shù) 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 參數(shù)來調(diào)整

      第一個 Blueprint

      Blueprint 是用來管理一組相似視圖(理解為管理api)的方法, 例如

      # 用戶API Blueprint

      /api/users

      /api/users/

      # 組API Blueprint

      /api/groups

      /api/groups/

      基于 Flask 開發(fā) RESTful API 的簡單向?qū)? inline=

      index blueprint

      app.py 調(diào)整為

      基于 Flask 開發(fā) RESTful API 的簡單向?qū)? inline=

      app.py

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

      基于 Flask 開發(fā) RESTful API 的簡單向?qū)? inline=

      output

      配置文件

      • 加載配置文件的方式有幾種,from_object/ from_envvar/ from_pyfile
      • 其中, from_envvar 會加載環(huán)境變量中指定的文件, 格式與 from_pyfile 相同, 路徑為相對(app.py)或者是絕對路徑
      • 我更傾向于使用 from_envvar/ from_pyfile 這種方式來加載配置文件,理由如下
        • 項目開發(fā),一般會分為 開發(fā)環(huán)境/ 測試環(huán)境/ 生產(chǎn)環(huán)境,會有不同的配置文件
        • 由于配置文件中可能會存放數(shù)據(jù)庫連接信息,密鑰等敏感字段,因此,不建議將測試/ 生產(chǎn)環(huán)境的配置上傳到代碼服務(wù)器上
        • 理想的方式是通過配置中心服務(wù)來管理,但是配置中心服務(wù)不一定會有
        • 項目的開發(fā)及初期運維可能會是同一個人,因此,可以在配置測試/ 生產(chǎn)環(huán)境的服務(wù)器時,由開發(fā)人員將所需配置直接寫在相應(yīng)的服務(wù)器上,通過環(huán)境變量的方式指定其路徑即可
        • 在使用 supervisor 來管理項目進(jìn)程時,可以通過配置 environment 來實現(xiàn)
      • 最簡單的配置文件

      # config.py

      DEBUG = True


      # app.py

      ...

      加載配置文件

      app.config.from_envvar('APP_CONFIG_FILE')

      # 添加環(huán)境變量

      > export APP_CONFIG_FILE="/yourpath/config.py"

      # 或者在 supervisor 的配置文件中聲明

      # environment=APP_CONFIG_FILE="/yourpath/config.py"

      數(shù)據(jù)庫

      • 用到的擴展組件
        • flask-sqlalchemy: 基于ORM 框架 SQLAlchemy
        • flask-migrate: 管理數(shù)據(jù)模型,用于初始化,升級,降級等操作
      • 增加 ext.py, 用于定義(聲明)用到的擴展組件
      基于 Flask 開發(fā) RESTful API 的簡單向?qū)? inline=

      ext.py

      • 修改配置文件(使用 SQLite 來說明)

      # config.py

      ...

      SQLALCHEMY_DATABASE_URI = 'sqlite:///tutorial.db'

      • 若是使用 MySQL, 需要在配置文件中加入 SQLALCHEMY_POOL_RECYCLE = 3600, 會自動收回?zé)o用的數(shù)據(jù)庫連接, 如果不加這個配置, 連接會在 8 小時后斷開, 要重啟 app 才可以恢復(fù)(這是在第一次使用的時候碰到的問題, 由于服務(wù)器沒有關(guān)閉, 第二天一早在使用時, 出現(xiàn)了連接斷開的異常)
      • 修改 app.py

      ...

      from ext import db, migrate

      ...

      db.init_app(app)

      migrate.init_app(app, db)

      • 增加數(shù)據(jù)模型
      基于 Flask 開發(fā) RESTful API 的簡單向?qū)? inline=

      base.py

      基于 Flask 開發(fā) RESTful API 的簡單向?qū)? inline=

      user.py

      • 初始化 migrate, 創(chuàng)建文件夾 migrations, 運行命令 flask db init, 這個時候查看數(shù)據(jù)庫, 是沒有User 表的, 因為通過 app.py 所引用的包中, 并沒有使用到 models.user.User, 這里, 有幾種方式可以解決這個問題,
        • 一是, 先寫用到 models.user.User 的 Blueprint, 接著在 app.py 中注冊這個 Blueprint 即可
        • 二是, 臨時在 app.py 中導(dǎo)入, 在完成之后, 再刪除導(dǎo)入即可
        • 三是, 通過另外的管理腳本, 考慮到在初始化數(shù)據(jù)庫時可能會有其他的操作, 創(chuàng)建了 manage.py 這個文件
      基于 Flask 開發(fā) RESTful API 的簡單向?qū)? inline=

      manage.py

      基于 Flask 開發(fā) RESTful API 的簡單向?qū)? inline=

      manage.py

      增加藍(lán)圖 users

      • 添加查詢所有用戶的api /api/users
      基于 Flask 開發(fā) RESTful API 的簡單向?qū)? inline=

      views/user.py

      基于 Flask 開發(fā) RESTful API 的簡單向?qū)? inline=

      views/__init__.py

      • 修改 app.py

      # app.py

      ...

      from views import index, user

      ...

      app.register_blueprint(user.bp)

      • 瀏覽器中輸入 http://localhost:5000, 會看到返回結(jié)果如下
      基于 Flask 開發(fā) RESTful API 的簡單向?qū)? inline=

      配置登錄認(rèn)證

      • 修改 models.user.User, 繼承 flask_login.UserMixin, 并重寫方法 get_id
      基于 Flask 開發(fā) RESTful API 的簡單向?qū)? inline=

      models.user.py

      • 修改配置文件 config.py, 增加 SECRET_KEY = 'yoursecretkey', 不建議用過于簡單的key, 官方推薦通過 os.urandom 來生成, 這里可能有一個地方需要注意, 當(dāng)服務(wù)部署為多進(jìn)程時(使用 gunicorn), 千萬避免寫成如下形式, SECRET_KEY = os.urandom(16), 由于每個進(jìn)程都會生成一個隨機數(shù), 可能會導(dǎo)致需要用戶重復(fù)登錄, 這是個很愚蠢的錯誤, 由于我在開發(fā)時使用了 supervisor + gunicorn 來管理, 因此忘記了多進(jìn)程的問題, 困惑了我好一會兒
      • 修改 app.py
      基于 Flask 開發(fā) RESTful API 的簡單向?qū)? inline=

      app.py

          • unauthorized 方法: 在用戶未登錄時, 會調(diào)用此方法
          • load_user_from_request 方法: 通過 Request 信息(header/ body/ ...)加載用戶, 有一點需要注意, 當(dāng) session 中存在用戶信息時(在 request cookie 中包含 session_id), 不會調(diào)用此方法
          • load_user 方法: 獲取當(dāng)前登錄用戶的信息

      增加藍(lán)圖 login


      基于 Flask 開發(fā) RESTful API 的簡單向?qū)? inline=

      views/login.py

      • 修改 app.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 錯誤
      基于 Flask 開發(fā) RESTful API 的簡單向?qū)? inline=

      • 登錄, 訪問 /api/sign/in
      基于 Flask 開發(fā) RESTful API 的簡單向?qū)? inline=

      • 之后, 再次訪問 /api/users, 就正常了
      • 注銷, /api/sign/out, 之后, 訪問 /api/users 時, 就會返回 401
      基于 Flask 開發(fā) RESTful API 的簡單向?qū)? inline=

      • 測試一下不登錄的情況下訪問 /api/users, 之前的 load_user_from_request 方法中, 有一句 if request.args.get('hack'): return User.query.get(1), 只要在請求上加上 ?hack=1, 就可以看到正常的結(jié)果
      基于 Flask 開發(fā) RESTful API 的簡單向?qū)? inline=

      未完待續(xù)

      • 通過 supervisor/ gunicorn/ nginx 來部署項目
      • gunicorn/ supervisor 的配置項

      相關(guān)鏈接

      • flask 文檔: https://flask.palletsprojects.com/en/1.1.x/
      • flask_login 文檔: https://flask-login.readthedocs.io/en/latest/
      • flask_migrate 文檔: https://flask-migrate.readthedocs.io
      • flask_sqlalchemy 文檔: https://flask-sqlalchemy.palletsprojects.com/en/2.x/
      • 項目 Github 鏈接: https://github.com/liuxuange/flask_tutorial

      鳴謝

      • 感謝在項目中幫助過我的人(抱歉, 不便透露真實姓名)

      推薦閱讀:中國創(chuàng)業(yè)在線

      免責(zé)聲明:本文僅代表企業(yè)觀點,與新疆信息港無關(guān)。其原創(chuàng)性以及文中陳述文字和內(nèi)容未經(jīng)本站證實,對本文以及其中全部或者部分內(nèi)容、文字的真實性、完整性、及時性本站不作任何保證或承諾,請讀者僅作參考,并請自行核實相關(guān)內(nèi)容。
      熱門圖片
      熱門搜索