數(shù)據(jù)挖掘工程師Web開發(fā)修煉(1)---基于Flask的后端API搭建

Photo by Markus Spiske on Unsplash

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

image.png

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)載請注明出處!

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容