亚洲国产精品一区|午夜精品久久久久久久99热|草久在线观看高清|欧美精品V国产不卡在线观看

  • <tbody id="6baca"><style id="6baca"><track id="6baca"></track></style></tbody><dl id="6baca"></dl>

      1. <dl id="6baca"><thead id="6baca"></thead></dl>
          <dl id="6baca"></dl>
        1. <acronym id="6baca"><button id="6baca"><sup id="6baca"></sup></button></acronym>

          新疆信息港歡迎您!

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

          基于 Flask 開(kāi)發(fā) RESTful API 的簡(jiǎn)單向?qū)?

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

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

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

          寫(xiě)在最前

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

          最簡(jiǎn)單的app

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

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

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

          • 最后部署項(xiàng)目的時(shí)候會(huì)用到 gunicorn, 通過(guò) --bind 參數(shù)來(lái)調(diào)整

          第一個(gè) Blueprint

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

          # 用戶API Blueprint

          /api/users

          /api/users/

          # 組API Blueprint

          /api/groups

          /api/groups/

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

          index blueprint

          app.py 調(diào)整為

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

          app.py

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

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

          output

          配置文件

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

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

          ext.py

          • 修改配置文件(使用 SQLite 來(lái)說(shuō)明)

          # config.py

          ...

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

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

          ...

          from ext import db, migrate

          ...

          db.init_app(app)

          migrate.init_app(app, db)

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

          base.py

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

          user.py

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

          manage.py

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

          manage.py

          增加藍(lán)圖 users

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

          views/user.py

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

          views/__init__.py

          • 修改 app.py

          # app.py

          ...

          from views import index, user

          ...

          app.register_blueprint(user.bp)

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

          配置登錄認(rèn)證

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

          models.user.py

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

          app.py

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

          增加藍(lán)圖 login


          基于 Flask 開(kāi)發(fā) RESTful API 的簡(jiǎn)單向?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(): ...

          • 此時(shí), 訪問(wèn) http://localhost:5000/api/users, 會(huì)返回 401 錯(cuò)誤
          基于 Flask 開(kāi)發(fā) RESTful API 的簡(jiǎn)單向?qū)? inline=

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

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

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

          未完待續(xù)

          • 通過(guò) supervisor/ gunicorn/ nginx 來(lái)部署項(xiàng)目
          • gunicorn/ supervisor 的配置項(xiàng)

          相關(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/
          • 項(xiàng)目 Github 鏈接: https://github.com/liuxuange/flask_tutorial

          鳴謝

          • 感謝在項(xiàng)目中幫助過(guò)我的人(抱歉, 不便透露真實(shí)姓名)

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

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