引言:
Flask 是一個微型的 Python 開發的 Web 框架,基於Werkzeug WSGI工具箱和Jinja2 模板引擎。 Flask也被稱爲“microframework”,因爲它使用簡單的核心,用extension增加其他功能。Flask沒有默認使用的數據庫、窗體驗證工具。然而,Flask支持功能擴展,可以更加自己的需求還擴展所需的模塊。相較於Django,更加輕量,靈活,可定製化高,更適用於小型項目開發。
一 . 環境準備
版本:python3
開發工具:Pycharm
二 . 項目Demo步驟
-
創建demo項目
由於使用的Pycharm開發,在創建項目時,會自動生成python運行的虛擬環境 venv
-
運行項目
新建好的項目主要由4個文件夾構成:static,templates,venv,app.py
打開app.py 點擊run直接啓動,瀏覽器打開 http://127.0.0.1:5000/ 可看到 Hello World! ,即成功創建基本的Flask項目。
-
創建項目目錄
根據我們的需求,需要重新整理一下項目目錄及文件,刪除static,templates目錄和 app.py文件
創建如下目錄文件:
(1) app文件夾爲業務代碼的存放處,包括視圖+模型+靜態文件,也叫做應用包。
(2) config.py 和 manage.py是啓動應用和配置應用的關鍵。
(3) requirements.txt 裏面存放當前環境使用到的庫,當我們將項目遷移到別的服務器(環境)時,可以通過這個文件,快速導入依賴的所有庫。
pip3 freeze -l > requirements.txt #導出 pip3 install -r requirements.txt #導入
-
代碼編寫
(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部署等等一些功能,後續會繼續實現數據庫連接,部署等功能。