python3-Flask實現Api接口

引言:

Flask 是一個微型的 Python 開發的 Web 框架,基於Werkzeug WSGI工具箱和Jinja2 模板引擎。 Flask也被稱爲“microframework”,因爲它使用簡單的核心,用extension增加其他功能。Flask沒有默認使用的數據庫、窗體驗證工具。然而,Flask支持功能擴展,可以更加自己的需求還擴展所需的模塊。相較於Django,更加輕量,靈活,可定製化高,更適用於小型項目開發。

一 . 環境準備

版本:python3

開發工具:Pycharm

二 . 項目Demo步驟

  1. 創建demo項目

    由於使用的Pycharm開發,在創建項目時,會自動生成python運行的虛擬環境 venv
    在這裏插入圖片描述

  2. 運行項目

    新建好的項目主要由4個文件夾構成:static,templates,venv,app.py

    在這裏插入圖片描述

    打開app.py 點擊run直接啓動,瀏覽器打開 http://127.0.0.1:5000/ 可看到 Hello World! ,即成功創建基本的Flask項目。

    在這裏插入圖片描述

  3. 創建項目目錄

    根據我們的需求,需要重新整理一下項目目錄及文件,刪除static,templates目錄和 app.py文件

    創建如下目錄文件:

    ​ (1) app文件夾爲業務代碼的存放處,包括視圖+模型+靜態文件,也叫做應用包。

    ​ (2) config.py 和 manage.py是啓動應用和配置應用的關鍵。

    ​ (3) requirements.txt 裏面存放當前環境使用到的庫,當我們將項目遷移到別的服務器(環境)時,可以通過這個文件,快速導入依賴的所有庫。

    pip3 freeze -l > requirements.txt  #導出
    pip3 install -r requirements.txt   #導入
    

    在這裏插入圖片描述

  4. 代碼編寫
    (1) manage.py

    每個flask項目都必須有一個應用實例,新創建的項目的app.py裏面可以看到 app = Flask(__name__),app 便是應用實例,而這裏的app是在app模塊的__init__.py中創建,這樣做,可以動態修改配置,給腳本配置應用“留出時間”,還能夠創建多個應用,單元測試時也很有用。

    # 啓動程序
    from app import create_app
    
    """
    development:    開發環境
    production:     生產環境
    testing:        測試環境
    default:        默認環境
    
    """
    # 通過傳入當前的開發環境,創建應用實例,不同的開發環境配置有不同的config。這個參數也可以從環境變量中獲取
    app = create_app('development')
    
    if __name__ == '__main__':
        # flask內部自帶的web服務器,只可以在測試時使用
        # 應用啓動後,在9001端口監聽所有地址的請求,同時根據配置文件中的DEBUG字段,設置flask是否開啓debug
        app.run(host='0.0.0.0', port=9001, debug=app.config['DEBUG'])
    
    (2) app模塊中的__init__.py

    這裏主要是根據傳入的環境名來創建應用實例對象和註冊藍圖

    from flask import Flask
    from config import config
    
    def create_app(config_name):
    
        # 初始化
        app = Flask(__name__)
        
        # 導致指定的配置對象:創建app時,傳入環境的名稱
        app.config.from_object(config[config_name])
       	 
        # 註冊所有藍圖
        regist_blueprints(app)
        
        return app
    
    def regist_blueprints(app):
    
        # 導入藍圖對象
        # 方式一
        from app.api import api
        
        # 方式二:這樣,就不用在app/api/__init__.py(創建藍本時)裏面的最下方單獨引入各個視圖模塊了
        # from app.api.views import api
        # from app.api.errors import api
        
        # 註冊api藍圖,url_prefix爲所有路由默認加上的前綴
        app.register_blueprint(api, url_prefix='/api')
    
    (3) 配置文件 config.py

    這裏主要是管理項目的配置,如:數據庫,redis,或一些常量,根據不同環境進行配置

    # 配置環境的基類
    class Config(object):
    
        # 每次請求結束後,自動提交數據庫中的變動,該字段在flask-sqlalchemy 2.0之後已經被刪除了(有bug)
        SQLALCHEMY_COMMIT_ON_TEARDOWN = True
    
        # 2.0之後新加字段,flask-sqlalchemy 將會追蹤對象的修改並且發送信號。
        # 這需要額外的內存,如果不必要的可以禁用它。
        # 注意,如果不手動賦值,可能在服務器控制檯出現警告
        SQLALCHEMY_TRACK_MODIFICATIONS = False
    
        # 數據庫操作時是否顯示原始SQL語句,一般都是打開的,因爲後臺要日誌
        SQLALCHEMY_ECHO = True
    
    
    # 開發環境的配置
    class DevelopmentConfig(Config):
        """
        配置文件中的所有的賬號密碼等敏感信息,應該避免出現在代碼中,可以採用從環境變量中引用的方式,比如:
        username = os.environ.get('MYSQL_USER_NAME')
        password = os.environ.get('MYSQL_USER_PASSWORD')
        本文爲了便於理解,將用戶信息直接寫入了代碼裏
        """
        DEBUG = True
        # 數據庫URI
        # SQLALCHEMY_DATABASE_URI = 'mysql+pymysql://root:xxx@xxxx/xxx'
    
        # 也可如下來寫,比較清晰
        # SQLALCHEMY_DATABASE_URI = "mysql+pymysql://{username}:{password}@{hostname}/{databasename}".format(username="xxxx", password="xxxx", hostname="xxxx", databasename="xxxx")
    
    
    # 測試環境的配置
    class TestingConfig(Config):
    
        TESTING = True
        SQLALCHEMY_DATABASE_URI = 'mysql+pymysql://root:[email protected]:3306/cleven_test'
    
    
        """
        測試環境也可以使用sqlite,默認指定爲一個內存中的數據庫,因爲測試運行結束後無需保留任何數據
        也可使用  'sqlite://' + os.path.join(basedir, 'data.sqlite') ,指定完整默認數據庫路徑
        """
        # import os
        # basedir = os.path.abspath(os.path.dirname(__file__))
        # SQLALCHEMY_DATABASE_URI = os.environ.get('TEST_DATABASE_URL') or 'sqlite://'
    
    
    # 生產環境的配置
    class ProductionConfig(Config):
    
        # SQLALCHEMY_DATABASE_URI = 'mysql+pymysql://root:xxx@xxxx:3306/xxxx'
    
    
    # 初始化app實例時對應的開發環境聲明
    config = {
        'development': DevelopmentConfig,
        'production': ProductionConfig,
        'testing': TestingConfig,
        'default': DevelopmentConfig
    }
    
    (4) api藍本模塊中的 __init__.py
    from flask import Blueprint
    
    # 兩個參數分別指定藍本的名字、藍本所在的包或模塊
    api = Blueprint('api', __name__)
    
    """
     導入路由模塊、錯誤處理模塊,將其和藍本關聯起來
    
     1、應用的路由保存在包裏的 views.py 模塊中
     2、導入這兩個模塊就能把路由與藍本關聯起來
     3、注意,這些模塊在 app/__init__.py 腳本的末尾導入,原因是:
        爲了避免循環導入依賴,因爲在 app/views.py 中還要導入api藍本,所以除非循環引用出現在定義 api 之後,否則會致使導入出錯。
    
    """
    from app.api import views
    
    (5) 業務核心視圖 view.py

    這裏主要處理外部請求以及返回處理結果

    from flask import make_response, jsonify, request
    from app.api import api
    
    @api.route('/v1.0/test/', methods=['GET', 'POST'])
    def test():
        """
         上面 /v1.0/test/ 定義的url最後帶上"/":
         1、如果接收到的請求url沒有帶"/",則會自動補上,同時響應視圖函數
         2、如果/v1.0/test/這條路由的結尾沒有帶"/",則接收到的請求裏也不能以"/"結尾,否則無法響應
        """
        # 獲取參數
        #if request.method == "POST":
        		 # 獲取表單參數
        #    username = request.form.get("username")
        #    password = request.form.get("password")
        		 # 獲取json參數
        #    data = request.get_json()
        #else:
        		 #獲取get參數
        #    username = request.args.get("username")
        #    password = request.args.get("password")
        data = {'username': 'xxx', 'password': 'xxxx'}
        response = jsonify(code=200,
                           msg="success",
                           data=data)
        return response
        # 也可以使用 make_response 生成指定狀態碼的響應
        # return make_response(response, 200)
    

三 . 運行測試

​ 打開manage.py,運行即可。使用postman測試 http://127.0.0.1/api/v1.0/test/ 即可看到返回值。

總結:

​ 由此便實現了一個基於flask的簡單api項目,但是沒有包含數據庫,服務器分發以及uWSGI部署等等一些功能,後續會繼續實現數據庫連接,部署等功能。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章