
1、前言
簡單API設(shè)計與制作是數(shù)據(jù)工程師必備的技能之一,同時相信數(shù)學(xué)科班出身的數(shù)據(jù)挖掘工程師在職業(yè)初期都會思考如何提高個人的工程性,所以數(shù)據(jù)挖掘工程師Web開發(fā)修煉系列文章主要簡單總結(jié)以下三個部分
- 基于Flask的后端API搭建
- 基于Bootstrap的簡單前端界面搭建
- 基于阿里云的應(yīng)用部署
本文更偏向介紹怎么利用Python微框架Flask搭建較為完整的后端API項目,至于flask的基礎(chǔ)部分,可直接看文檔即可。
Flask英文文檔、Flask中文文檔
2、創(chuàng)建項目myFlask
mkdir myFlask
3、虛擬環(huán)境利器——Virtualenv
在實際實踐中,不同項目可能使用不同版本的python第三方包,比如應(yīng)用A可能需要jinja 2.7,而應(yīng)用B需要jinja 2.6,所以需要一個工具來統(tǒng)一開發(fā)環(huán)境,在此使用Virtualenv進行演示,將路徑切換到項目根目錄下。
(1)安裝
sudo pip install virtualenv
(2)創(chuàng)建獨立的Python運行環(huán)境
virtualenv --no-site-packages env
參數(shù)--no-site-packages是防止本地的python包污染到虛擬環(huán)境,此時在我們項目的根目錄下便出現(xiàn)了env文件夾。
(3)進入環(huán)境
source env/bin/activate
注:退出虛擬環(huán)境命令為deactivate
(4)安裝Flask
sudo pip install flask
4、API文件組織結(jié)構(gòu)
假設(shè)目前我們基于歷史數(shù)據(jù)用機器學(xué)習(xí)算法一個簡單的推薦策略,那么運營部門需要我們做到他們每輸入一個新數(shù)據(jù),便可以實時返回一個數(shù)據(jù)結(jié)果。
此時,API初版文件組織如下
├── config.py 項目配置文件
├── env 虛擬環(huán)境
├── myapp API核心文件夾
│ ├── __init__.py 初始化應(yīng)用,組件組合
│ ├── views.py 頂層:定義路由,獲取前端輸入數(shù)據(jù)
│ ├── services.py 中間層:處理輸入數(shù)據(jù)并發(fā)送到model.py
│ ├── models.py 底層:定義數(shù)據(jù)模型,處理services請求數(shù)據(jù)并返回結(jié)果
│ ├── static 公共CSS、JS、 images等靜態(tài)文件
│ └── templates 應(yīng)用的Jinja2模板,實際上是html文件
├── requirements.txt應(yīng)用依賴的所有Python包
└── run.py啟動開發(fā)服務(wù)器
其中myapp目錄下文件設(shè)計實際上是參考MVC框架。為理解MVC,先假設(shè)電腦為M-model,顯示器為V-view,鍵盤或鼠標(biāo)為C-control,當(dāng)我們需要查看電腦本地某個文件,首先我們通過鼠標(biāo)或鍵盤輸入搜索請求,電腦接受請求后便返回結(jié)果,最后在顯示器上我們便可看到文件內(nèi)容。接下來,以一個簡單例子說明各個函數(shù)的功能。
4.1 models.py
該部分處理與數(shù)據(jù)庫交互部分。
#!/usr/bin/env python
# -*- coding: UTF-8 -*-
"""
M層-底層:處理業(yè)務(wù)模型
"""
def with_db():
"""測試函數(shù)"""
return 'hello, I am from ./myapp/models.py'
4.2 services.py
該文件主要對用戶輸入的數(shù)據(jù)進行驗證,驗證必要的參數(shù)是否存在,將輸入數(shù)據(jù)處理為適合數(shù)據(jù)模型的數(shù)據(jù)格式。
#!/usr/bin/env python
# -*- coding: UTF-8 -*-
"""
C層-中間層:對輸入數(shù)據(jù)進行驗證與處理
"""
from . import models
def service_demo():
"""測試函數(shù)"""
return models.with_db()
4.3 views.py
主要管理路由,獲取前端輸入內(nèi)容。
#!/usr/bin/env python
# -*- coding: UTF-8 -*-
"""
V層-頂層:處理展示
"""
from . import app
from . import services
@app.route('/api/v1')
def view_demo():
"""return"""
return services.service_demo()
4.4 __init__.py
#!/usr/bin/env python
# -*- coding: UTF-8 -*-
"""
初始化APP
"""
import config
from flask import Flask
app = Flask(__name__)
from . import views
4.5 config.py
#!/usr/bin/env python
# -*- coding: utf-8 -*-
"""
項目配置文件
"""
DEBUG = True # 啟動Flask的Debug模式
DEV_HOST = '0.0.0.0'
DEV_PORT = 5000
4.6 run.py
#!/usr/bin/env python
# -*- coding: utf-8 -*-
"""
應(yīng)用啟動程序
"""
from myapp import app
app.config.from_object('config')
app.run(host=app.config['DEV_HOST'], port=app.config['DEV_PORT'], debug=app.config['DEBUG'])
4.7 requirements.txt
pip freeze > requirements.txt
這樣子便可將項目所依賴的所有第三方包均包含到requirements.txt,當(dāng)?shù)搅诵颅h(huán)境中,便可直接使用以下命令進行安裝:
pip install -r requirements.txt
4.8 測試
可以利用curl命令進行測試,直觀的話可以直接在瀏覽器輸入localhost:5000/api/v1

5 藍圖
當(dāng)我們的API有不同的接口時候,我們便需要將接口進行分離,F(xiàn)lask中提供了藍圖功能,具體的項目文件組織可以如下,具體可以移步到拓展閱讀:
.
├── config.py
├── env 虛擬環(huán)境
├── myapp
│ ├── api_1_0
│ │ ├──__init__.py
│ │ ├── models.py
│ │ ├── services.py
│ │ ├── static
│ │ ├── templates
│ │ └── views.py
│ └── __init__.py
├── requirements.txt
└── run.py
參考:
[1] RESTful API 設(shè)計指南
[2] Principles of good RESTful API Design
[3] Github API v3
本文所有代碼只用于技術(shù)交流,如轉(zhuǎn)載請注明出處!