最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

python的簡單web框架flask快速實現(xiàn)詳解

 更新時間:2023年02月07日 08:59:24   作者:程序那些事  
這篇文章主要為大家介紹了python的簡單web框架flask快速實現(xiàn)詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪

簡介

python可以做很多事情,雖然它的強項在于進行向量運算和機器學習、深度學習等方面。但是在某些時候,我們?nèi)匀恍枰褂胮ython對外提供web服務(wù)。

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

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

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

web框架的重要組成部分

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

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

有了這個核心的功能,web框架基本上就可以正常運行了。配合上現(xiàn)在流行的前后端分離技術(shù),一切水到渠成。

如果不想用前后端分離,那么web框架還需要涉及到頁面的呈現(xiàn)技術(shù)。一般來說都會使用模板引擎作為前端頁面的呈現(xiàn)形式。

然后配合上對數(shù)據(jù)庫、緩存、消息隊列、靜態(tài)資源、日志、調(diào)試等附加的功能,一個完整的web框架就完成了。

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

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

快速上手flask

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

為了區(qū)分python的不同開發(fā)環(huán)境,我們在使用flask的時候,可以使用python自帶的venv來創(chuàng)建不同的虛擬環(huán)境。venv跟conda的env很類似,都是用來創(chuàng)建虛擬環(huán)境,從而實現(xiàn)不同的環(huán)境進行分離的作用。

使用venv非常簡單,如果你用的開發(fā)工具是pycharm,那么在創(chuàng)建python的flask項目的時候,會自動選擇對應(yīng)的虛擬環(huán)境創(chuàng)建工具,這里我們選擇使用venv即可自動創(chuàng)建。

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

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

創(chuàng)建好venv之后,使用下面的命令來激活這個env:

. venv/bin/activate

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

pip install Flask

安裝完畢之后,你可以在python項目site-packages里面找到flask對應(yīng)的依賴包:

可以看到里面出了flask之外,還有其他的一些第三方依賴包,這些都是可以在后續(xù)的flask應(yīng)用中使用到的。

flask的第一個應(yīng)用

flask的依賴包都安裝好之后,我們就可以寫一個最最簡單的web應(yīng)用程序了,我們把這個應(yīng)用程序命名為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這個方法上。

程序?qū)懞昧?,如果你在pycharm IDE中,那么可以右鍵運行,可以得到下面的內(nèi)容:

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為我們設(shè)置了幾個環(huán)境變量,分別是FLASK_APP:表示要運行的app名稱。FLASK_ENV:表示現(xiàn)在的運行環(huán)境是開發(fā)環(huán)境還是線上環(huán)境。FLASK_DEBUG表示是否是debug模式。

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

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

如果你想通過命令行來執(zhí)行flask的應(yīng)用,那么可以用下面的命令:

flask --app first run

注意,這里我們添加了--app這個參數(shù)來指定要運行的app名稱。如果不指定的話,flask會去尋找名叫app.py或者wsgi.py的文件。如果你有這兩個文件,那么就可以直接使用flask run來運行了。

這里的flask相當于python -m flask。

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

flask run --host=0.0.0.0

到此,我們的一個基本的最簡單的flask web應(yīng)用就完成了。

什么?你還要了解更多?別急,下面我們再詳細介紹一些web應(yīng)用程序所必須了解的知識。

flask中的路由

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

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

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

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

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

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

這里的方法體中我們調(diào)用了python的f函數(shù)來對字符串進行格式化,在內(nèi)部為了防止web輸入端的惡意注入,這里引用了markupsafe的escape方法,可以對輸入的字符串進行轉(zhuǎn)義,從而避免了惡意的攻擊。

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

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

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

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

上面我們提到了string和path的區(qū)別,就在于path可以接收/,而string不能。

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

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

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

withslash的定義中帶了slash后綴,所以不管你訪問/withslash還是/withslash/, 都會被跳轉(zhuǎn)到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'

靜態(tài)文件

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

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

這里面我們用到了url_for這個方法,這個方法實際上是用來構(gòu)建對應(yīng)方法的url的,可以舉下面的幾個例子來對url_for有個深入的了解。

urL_for的第一個參數(shù)是方法名,后面接的是url中定義的變量,如果url中并沒有這個變量,那么將會以參數(shù)的形式附加在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'))

輸出的內(nèi)容如下:

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

使用模板

如果我們只是用return來返回簡單的字符串或者變量,那么肯定滿足不了現(xiàn)代應(yīng)用的需求了。

為了實現(xiàn)復(fù)雜的頁面功能,我們通常會使用模板。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是模板文件中定義的變量。

總結(jié)

以上就是flask的基本使用了,掌握到這些內(nèi)容之后,相信大家已經(jīng)可以使用flask做出一個簡單的web應(yīng)用了。

以上就是python的簡單web框架flask快速實現(xiàn)詳解的詳細內(nèi)容,更多關(guān)于python web框架flask的資料請關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • Python深入06——python的內(nèi)存管理詳解

    Python深入06——python的內(nèi)存管理詳解

    本篇文章主要介紹了python的內(nèi)存管理詳解,語言的內(nèi)存管理是語言設(shè)計的一個重要方面。它是決定語言性能的重要因素。有興趣的同學可以了解一下。
    2016-12-12
  • Pyinstaller打包文件太大的解決方案

    Pyinstaller打包文件太大的解決方案

    這篇文章主要介紹了Pyinstaller打包文件太大的解決方案,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2021-03-03
  • CentOS系統(tǒng)Python卸載攻略大揭秘

    CentOS系統(tǒng)Python卸載攻略大揭秘

    想要徹底卸載?CentOS?上的?Python?嗎?不用擔心,我們來幫你搞定!本指南將教你如何在?CentOS?系統(tǒng)上完全清理?Python,讓你的系統(tǒng)煥然一新,跟著我們的步驟,讓你的系統(tǒng)煥然一新吧!
    2023-11-11
  • Python  OpenCV實現(xiàn)攝像頭人臉識別功能

    Python  OpenCV實現(xiàn)攝像頭人臉識別功能

    這篇文章主要介紹了Python  OpenCV實現(xiàn)攝像頭人臉識別,使用Python 3和OpenCV進行攝像頭人臉識別的基本步驟,本文結(jié)合實例代碼給大家介紹的非常詳細,需要的朋友可以參考下
    2023-07-07
  • bpython 功能強大的Python shell

    bpython 功能強大的Python shell

    bpython是一個不錯的Python解釋器的界面,本文帶著大家了解認識一下bpython,感興趣的小伙伴們可以參考一下
    2016-02-02
  • Python實現(xiàn)求一個集合所有子集的示例

    Python實現(xiàn)求一個集合所有子集的示例

    今天小編就為大家分享一篇Python 實現(xiàn)求一個集合所有子集的示例,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2018-05-05
  • 跟老齊學Python之總結(jié)參數(shù)的傳遞

    跟老齊學Python之總結(jié)參數(shù)的傳遞

    這篇文章主要介紹了Python參數(shù)的傳遞的總結(jié),非常的實用,有需要的朋友可以參考下
    2014-10-10
  • Python 多線程的實例詳解

    Python 多線程的實例詳解

    這篇文章主要介紹了 Python 多線程的實例詳解的相關(guān)資料,希望通過本文大家能掌握多線程的知識,需要的朋友可以參考下
    2017-09-09
  • python OpenCV的imread不能讀取中文路徑問題及解決

    python OpenCV的imread不能讀取中文路徑問題及解決

    這篇文章主要介紹了python OpenCV的imread不能讀取中文路徑問題及解決方案,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-07-07
  • python中28種極坐標繪圖函數(shù)總結(jié)

    python中28種極坐標繪圖函數(shù)總結(jié)

    這篇文章主要為大家詳細介紹了python中28種極坐標繪圖函數(shù)的用法,文中的示例代碼講解詳細,具有一定的學習價值,感興趣的小伙伴可以跟隨小編一起了解一下
    2023-09-09

最新評論

石狮市| 黔西县| 永年县| 常州市| 黔南| 临夏市| 兴宁市| 同江市| 固镇县| 红原县| 固安县| 偃师市| 太和县| 嘉祥县| 黔西县| 余庆县| 贵德县| 辛集市| 卢龙县| 汝城县| 天长市| 湟源县| 南靖县| 广安市| 沅江市| 江达县| 长宁区| 渭源县| 南昌县| 丹东市| 措勤县| 沁阳市| 兴海县| 徐汇区| 乐昌市| 连平县| 洞头县| 伊吾县| 若羌县| 堆龙德庆县| 鄄城县|