python的簡單web框架flask快速實現詳解

簡介

python可以做很多事情,雖然它的強項在於進行向量運算和機器學習、深度學習等方面。但是在某些時候,我們仍然需要使用python對外提供web服務。

比如我們現在有一個用python寫好的模型算法,這個模型算法需要接收前端的輸入,然後進行模擬運算,最終得到最後的輸出。這個流程是一個典型的web服務,與其我們使用java或者nodejs來搭建一個web服務器,不如我們就使用python自己的web框架來實現這一目標,減少技術棧的同時,還可以實現代碼邏輯的統一,何樂而不為呢?

其實python的web框架也有很多種,比如django、flask等等。

這本系列的文章中,我們會介紹flask這個輕量級的web框架。

web框架的重要組成部分

相信大傢都用過不少web框架吧,從java的spring MVC,到nodejs的express和koa,有功能復雜的,也有功能簡單的。

但是不管他們的功能如何,其最重要最基本的一個功能就是能夠提供web服務,也就是說可以接收HTTP或者HTTPS的請求,然後返回對應的數據。這個功能通常包含的是核心的路由跳轉功能。

有瞭這個核心的功能,web框架基本上就可以正常運行瞭。配合上現在流行的前後端分離技術,一切水到渠成。

如果不想用前後端分離,那麼web框架還需要涉及到頁面的呈現技術。一般來說都會使用模板引擎作為前端頁面的呈現形式。

然後配合上對數據庫、緩存、消息隊列、靜態資源、日志、調試等附加的功能,一個完整的web框架就完成瞭。

flask雖然是一個輕量級web框架,但是該有的功能它全都有。

它的核心是提供瞭對web路由的支持,同時支持Jinja的模板語言。

快速上手flask

flask是一個非常簡單優雅的web框架,flask需要Python 3.7及以上版本的支持。

為瞭區分python的不同開發環境,我們在使用flask的時候,可以使用python自帶的venv來創建不同的虛擬環境。venv跟conda的env很類似,都是用來創建虛擬環境,從而實現不同的環境進行分離的作用。

使用venv非常簡單,如果你用的開發工具是pycharm,那麼在創建python的flask項目的時候,會自動選擇對應的虛擬環境創建工具,這裡我們選擇使用venv即可自動創建。

當然你也可以使用下面的命令來手動創建venv:

$ mkdir learn-flask
$ cd learn-flask
$ python3 -m venv venv

創建好venv之後,使用下面的命令來激活這個env:

. venv/bin/activate

venv安裝完畢之後,我們可以使用下面的命令安裝flask:

pip install Flask

安裝完畢之後,你可以在python項目site-packages裡面找到flask對應的依賴包:

可以看到裡面出瞭flask之外,還有其他的一些第三方依賴包,這些都是可以在後續的flask應用中使用到的。

flask的第一個應用

flask的依賴包都安裝好之後,我們就可以寫一個最最簡單的web應用程序瞭,我們把這個應用程序命名為first.py:

from flask import Flask
app = Flask(__name__)
@app.route('/')
def first():
    return "<p>這是我的第一個flask程序!</p>"
if __name__ == '__main__':
    app.run()

和普通的python程序不同的是,這裡我們先實例化瞭一個Flask對象,然後用類似註解的方式定義瞭一個route在fist這個方法上。

程序寫好瞭,如果你在pycharm IDE中,那麼可以右鍵運行,可以得到下面的內容:

FLASK_APP = first.py
FLASK_ENV = development
FLASK_DEBUG = 0
In folder /Users/data/git/ddean2009/learn-flask
/Users/data/git/ddean2009/learn-flask/venv/bin/python -m flask run 
 * Serving Flask app 'first.py'
 * Debug mode: off
WARNING: This is a development server. Do not use it in a production deployment. Use a production WSGI server instead.
 * Running on http://127.0.0.1:5000

可以看到IDE為我們設置瞭幾個環境變量,分別是FLASK_APP:表示要運行的app名稱。FLASK_ENV:表示現在的運行環境是開發環境還是線上環境。FLASK_DEBUG表示是否是debug模式。

最終我們可以訪問默認的http://127.0.0.1:5000,可以得到下面的內容:

說明整個程序運行成功瞭。

如果你想通過命令行來執行flask的應用,那麼可以用下面的命令:

flask --app first run

註意,這裡我們添加瞭–app這個參數來指定要運行的app名稱。如果不指定的話,flask會去尋找名叫app.py或者wsgi.py的文件。如果你有這兩個文件,那麼就可以直接使用flask run來運行瞭。

這裡的flask相當於python -m flask。

默認情況下flask的應用程序隻能通過本地的瀏覽器來訪問,如果你想通過遠程來訪問的話,可以指定訪問的host,如下所示:

flask run --host=0.0.0.0

到此,我們的一個基本的最簡單的flask web應用就完成瞭。

什麼?你還要瞭解更多?別急,下面我們再詳細介紹一些web應用程序所必須瞭解的知識。

flask中的路由

路由也叫Routing,它是web應用程序中的靈魂,通過路由來定義各種URL和訪問路徑。

在flask中,可以使用@app.route來對路由進行定義。@app.route類似於註解,可以放置在python的方法之上。

route中可以定義路由的名稱,路由的名稱可以跟方法的名稱不一樣:

@app.route('/test')
def test123():
    return '我是一個測試'

路由的名稱還可以是動態的,可以取一個跟註解方法中參數的名稱一樣的參數名作為路由的參數用一個尖括號括起來,如下所示:

from markupsafe import escape
@app.route('/student/<name>')
def what_is_your_name(name):
    return f'你的名字是: {escape(name)}'

這裡的方法體中我們調用瞭python的f函數來對字符串進行格式化,在內部為瞭防止web輸入端的惡意註入,這裡引用瞭markupsafe的escape方法,可以對輸入的字符串進行轉義,從而避免瞭惡意的攻擊。

除瞭在路徑中指定參數之外,我們還可以自行指定參數的類型,在flask中路徑參數可以設置為下面的幾種類型:

類型 說明
string 默認類型,可以接收除瞭/之外的任何字符串
int 可以接收正整數
float 可以接收正的浮點數
path 和string類似,但是可以接收/
uuid 接收uuid字符串

比如我們想傳入一個路徑,那麼可以將其定義為path類型:

@app.route('/path/<path:subpath>')
def what_is_your_path(subpath):
    return f'你的路徑是: {escape(subpath)}'

上面我們提到瞭string和path的區別,就在於path可以接收/,而string不能。

那麼在flask中/有什麼特殊的含義嗎?

我們知道/是用做路徑分割的,在flask中包含/和不包含/還是有一定的區別的。以下面的代碼為例:

@app.route('/withslash/')
def with_slash():
    return '這是帶slash的'
@app.route('/withoutslash')
def with_out_slash():
    return '這是不帶slash的'

withslash的定義中帶瞭slash後綴,所以不管你訪問/withslash還是/withslash/, 都會被跳轉到withslash/

但是因為withoutslash沒有帶slash,所以你隻能訪問/withoutslash,但是不能訪問/withoutslash/,否則你可能得到一個404 “Not Found”錯誤。

不同的http方法

默認情況下@app.route對外提供的是GET方法,如果你想對外提供一些不同的http方法,那麼可以在@app.route中使用methods:

@app.route('/diffMethod', methods=['GET', 'POST'])
def diff_method():
    if request.method == 'POST':
        return '這是post'
    else:
        return '這是get'

當然,你還可以使用@app.get或者@app.post把不同方法的請求分開:

@app.get('/getMethod')
def get_method():
     return '這是get'
@app.post('/postMethod')
def post_method():
     return '這是post'

靜態文件

web應用中少不瞭的是一些靜態資源,比如圖片,js或者css等。這些靜態資源可以看做是一種特殊的路由規則。在flask中,可以通過創建特殊的static目錄來達到這一目的。如下所示:

url_for('static', filename='style.css')

這裡面我們用到瞭url_for這個方法,這個方法實際上是用來構建對應方法的url的,可以舉下面的幾個例子來對url_for有個深入的瞭解。

urL_for的第一個參數是方法名,後面接的是url中定義的變量,如果url中並沒有這個變量,那麼將會以參數的形式附加在url的後面:

@app.route('/')
def index():
    return 'index'
@app.route('/login')
def login():
    return 'login'
@app.route('/user/<username>')
def profile(username):
    return f'{username}\'s profile'
with app.test_request_context():
    print(url_for('index'))
    print(url_for('login'))
    print(url_for('login', next='/'))
    print(url_for('profile', username='John Doe'))

輸出的內容如下:

/
/login
/login?next=/
/user/John%20Doe

使用模板

如果我們隻是用return來返回簡單的字符串或者變量,那麼肯定滿足不瞭現代應用的需求瞭。

為瞭實現復雜的頁面功能,我們通常會使用模板。flask使用的是Jinja2這個模板語言。

怎麼使用模板呢?我們在返回的時候,可以使用render_template方法:

from flask import render_template
@app.route('/template/<name>')
def use_template(name=None):
    return render_template('hello.html', name=name)

其中hello.html是模板文件的名字,name是模板文件中定義的變量。

總結

以上就是flask的基本使用瞭,掌握到這些內容之後,相信大傢已經可以使用flask做出一個簡單的web應用瞭。

以上就是python的簡單web框架flask快速實現詳解的詳細內容,更多關於python web框架flask的資料請關註WalkonNet其它相關文章!

推薦閱讀: