Python Web框架Flask、Streamlit、FastAPI示例詳解
概述
Python提供了多種優(yōu)秀的Web框架,每個(gè)框架都有其獨(dú)特的特點(diǎn)和適用場(chǎng)景:
Flask:輕量級(jí)、靈活的Web框架,適合構(gòu)建傳統(tǒng)的Web應(yīng)用和API
Streamlit:專(zhuān)為數(shù)據(jù)科學(xué)和機(jī)器學(xué)習(xí)應(yīng)用設(shè)計(jì)的快速原型開(kāi)發(fā)框架
FastAPI:現(xiàn)代、高性能的API框架,具有自動(dòng)文檔生成和類(lèi)型檢查功能
本文將詳細(xì)介紹這三個(gè)框架的使用方法、核心特性和實(shí)際應(yīng)用場(chǎng)景。
Flask詳解
Flask簡(jiǎn)介
Flask是一個(gè)用Python編寫(xiě)的輕量級(jí)Web應(yīng)用框架。它被稱(chēng)為“微框架”,因?yàn)樗话琌RM(對(duì)象關(guān)系映射)、表單驗(yàn)證等開(kāi)箱即用的功能。相反,F(xiàn)lask提供了核心功能,并允許開(kāi)發(fā)者根據(jù)項(xiàng)目需求自由選擇和集成各種擴(kuò)展。這使得Flask非常靈活,適合構(gòu)建小型應(yīng)用、API服務(wù)以及作為大型項(xiàng)目中的微服務(wù)。
安裝和基礎(chǔ)配置
安裝Flask非常簡(jiǎn)單,通常使用pip進(jìn)行安裝:
pip install Flask
核心概念
Werkzeug:一個(gè)WSGI(Web Server Gateway Interface)工具包,用于處理HTTP請(qǐng)求和響應(yīng)。
Jinja2:一個(gè)現(xiàn)代的、設(shè)計(jì)友好的Python模板引擎,用于渲染HTML頁(yè)面。
路由(Routing):將URL映射到Python函數(shù)。
視圖函數(shù)(View Function):處理請(qǐng)求并返回響應(yīng)的Python函數(shù)。
模板(Templates):用于生成HTML的文本文件,通常使用Jinja2語(yǔ)法。
路由和視圖
Flask使用@app.route()裝飾器來(lái)定義路由和視圖函數(shù):
from flask import Flask
app = Flask(__name__)
@app.route('/')
def hello_world():
return 'Hello, World!'
if __name__ == '__main__':
app.run(debug=True)模板系統(tǒng)
Flask使用Jinja2作為其模板引擎。你可以在templates文件夾中創(chuàng)建HTML文件,并在視圖函數(shù)中渲染它們:
from flask import Flask
app = Flask(__name__)
@app.route('/')
def hello_world():
return 'Hello, World!'
if __name__ == '__main__':
app.run(debug=True)
templates/user.html:
<!DOCTYPE html>
<html>
<head>
<title>User Page</title>
</head>
<body>
<h1>Hello, {{ name }}!</h1>
</body>
</html>數(shù)據(jù)庫(kù)集成
Flask本身不提供數(shù)據(jù)庫(kù)集成,但可以通過(guò)各種擴(kuò)展來(lái)支持。例如,可以使用Flask-SQLAlchemy來(lái)集成SQLAlchemy ORM:
pip install Flask-SQLAlchemy
from flask import Flask
from flask_sqlalchemy import SQLAlchemy
app = Flask(__name__)
app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:///test.db'
db = SQLAlchemy(app)
class User(db.Model):
id = db.Column(db.Integer, primary_key=True)
username = db.Column(db.String(80), unique=True, nullable=False)
email = db.Column(db.String(120), unique=True, nullable=False)
def __repr__(self):
return '<User %r>' % self.username
with app.app_context():
db.create_all()
# 示例:添加用戶
# with app.app_context():
# admin = User(username='admin', email='admin@example.com')
# db.session.add(admin)
# db.session.commit()
?
# 示例:查詢(xún)用戶
# with app.app_context():
# user = User.query.filter_by(username='admin').first()
# print(user.email)
?
if __name__ == '__main__':
app.run(debug=True)實(shí)際示例
下面是一個(gè)簡(jiǎn)單的Flask應(yīng)用,演示了如何創(chuàng)建一個(gè)Web頁(yè)面并顯示一些數(shù)據(jù):
首先,創(chuàng)建一個(gè)名為app.py的文件:
from flask import Flask, render_template
app = Flask(__name__)
@app.route('/')
def index():
data = {
'title': '我的Flask應(yīng)用',
'items': ['項(xiàng)目A', '項(xiàng)目B', '項(xiàng)目C']
}
return render_template('index.html', data=data)
if __name__ == '__main__':
app.run(debug=True)然后,在與app.py同級(jí)目錄下創(chuàng)建一個(gè)名為templates的文件夾,并在其中創(chuàng)建一個(gè)名為index.html的文件:
<!DOCTYPE html>
<html>
<head>
<title>{{ data.title }}</title>
</head>
<body>
<h1>{{ data.title }}</h1>
<ul>
{% for item in data.items %}
<li>{{ item }}</li>
{% endfor %}
</ul>
</body>
</html>運(yùn)行應(yīng)用:
python app.py
在瀏覽器中訪問(wèn)http://127.0.0.1:5000/,你將看到一個(gè)包含標(biāo)題和列表的頁(yè)面。
Streamlit詳解
Streamlit簡(jiǎn)介
Streamlit是一個(gè)開(kāi)源的Python庫(kù),它允許數(shù)據(jù)科學(xué)家和機(jī)器學(xué)習(xí)工程師快速創(chuàng)建交互式Web應(yīng)用,而無(wú)需Web開(kāi)發(fā)經(jīng)驗(yàn)。Streamlit的特點(diǎn)是簡(jiǎn)單、快速,只需幾行Python代碼就能將數(shù)據(jù)腳本、模型和可視化轉(zhuǎn)換為可分享的Web應(yīng)用。
安裝和基礎(chǔ)配置
安裝Streamlit非常簡(jiǎn)單,通常使用pip進(jìn)行安裝:
pip install streamlit
運(yùn)行Streamlit應(yīng)用:
streamlit run your_app.py
核心概念
基于腳本:Streamlit應(yīng)用是Python腳本,每次用戶交互(如滑動(dòng)、輸入)都會(huì)重新運(yùn)行整個(gè)腳本。
數(shù)據(jù)流:Streamlit通過(guò)緩存機(jī)制優(yōu)化數(shù)據(jù)處理,避免重復(fù)計(jì)算。
Widget:Streamlit提供了豐富的UI組件(如滑塊、按鈕、文本輸入框),用于用戶交互。
組件和布局
Streamlit提供了多種組件和布局選項(xiàng),可以輕松構(gòu)建復(fù)雜的界面:
import streamlit as st
st.title("我的Streamlit應(yīng)用")
st.header("這是一個(gè)標(biāo)題")
st.subheader("這是一個(gè)副標(biāo)題")
st.write("Hello, Streamlit!")
name = st.text_input("請(qǐng)輸入你的名字")
if name:
st.write(f"你好, {name}!")
number = st.slider("選擇一個(gè)數(shù)字", 0, 100, 50)
st.write(f"你選擇的數(shù)字是: {number}")
option = st.selectbox(
"你喜歡哪種水果?",
("蘋(píng)果", "香蕉", "橙子")
)
st.write(f"你選擇的水果是: {option}")
# 布局
col1, col2 = st.columns(2)
with col1:
st.header("第一列")
st.write("這是第一列的內(nèi)容。")
with col2:
st.header("第二列")
st.write("這是第二列的內(nèi)容。")數(shù)據(jù)可視化
Streamlit與流行的Python數(shù)據(jù)可視化庫(kù)(如Matplotlib、Plotly、Altair)無(wú)縫集成,可以輕松展示數(shù)據(jù):
import streamlit as st
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
st.title("數(shù)據(jù)可視化示例")
# 生成一些隨機(jī)數(shù)據(jù)
data = pd.DataFrame(
np.random.randn(20, 3),
columns=["a", "b", "c"]
)
st.line_chart(data)
# 使用Matplotlib繪制圖表
st.subheader("Matplotlib圖表")
fig, ax = plt.subplots()
ax.scatter(data["a"], data["b"])
st.pyplot(fig)實(shí)際示例
下面是一個(gè)簡(jiǎn)單的Streamlit應(yīng)用,用于展示一個(gè)隨機(jī)生成的數(shù)據(jù)表格和圖表:
首先,創(chuàng)建一個(gè)名為my_streamlit_app.py的文件:
import streamlit as st
import pandas as pd
import numpy as np
st.title("隨機(jī)數(shù)據(jù)生成器")
# 用戶輸入生成數(shù)據(jù)的大小
num_rows = st.slider("選擇行數(shù)", 10, 100, 50)
# 生成隨機(jī)數(shù)據(jù)
data = pd.DataFrame(
np.random.randn(num_rows, 5),
columns=["A", "B", "C", "D", "E"]
)
st.subheader("原始數(shù)據(jù)")
st.dataframe(data)
st.subheader("數(shù)據(jù)折線圖")
st.line_chart(data)
# 顯示一些統(tǒng)計(jì)信息
st.subheader("數(shù)據(jù)統(tǒng)計(jì)")
st.write(data.describe())運(yùn)行應(yīng)用:
streamlit run my_streamlit_app.py
在瀏覽器中,你將看到一個(gè)交互式的數(shù)據(jù)應(yīng)用,可以調(diào)整行數(shù)并實(shí)時(shí)查看數(shù)據(jù)表格和折線圖的變化。
FastAPI詳解
FastAPI簡(jiǎn)介
FastAPI是一個(gè)現(xiàn)代、高性能的Web框架,用于使用Python 3.7+構(gòu)建API。它基于標(biāo)準(zhǔn)的Python類(lèi)型提示,并利用Starlette(用于Web部分)和Pydantic(用于數(shù)據(jù)部分)來(lái)提供出色的性能和開(kāi)發(fā)體驗(yàn)。FastAPI的主要特點(diǎn)包括:
高性能:與Node.js和Go相當(dāng),得益于Starlette和Pydantic。
快速開(kāi)發(fā):減少了大約20%的開(kāi)發(fā)時(shí)間。
更少的Bug:減少了大約40%的人為錯(cuò)誤。
直觀:強(qiáng)大的編輯器支持,代碼補(bǔ)全。
健壯:自動(dòng)生成交互式API文檔(Swagger UI和ReDoc)。
基于標(biāo)準(zhǔn):基于OpenAPI和JSON Schema。
安裝和基礎(chǔ)配置
安裝FastAPI及其推薦的ASGI服務(wù)器Uvicorn:
pip install fastapi uvicorn
核心概念
Pydantic:用于數(shù)據(jù)驗(yàn)證、設(shè)置和文檔的Python庫(kù)。FastAPI使用它來(lái)定義請(qǐng)求體和響應(yīng)模型。
Starlette:一個(gè)輕量級(jí)的ASGI框架/工具包,F(xiàn)astAPI在其之上構(gòu)建。
類(lèi)型提示(Type Hints):Python 3.5+引入的特性,用于聲明變量類(lèi)型。FastAPI廣泛使用它們來(lái)提供數(shù)據(jù)驗(yàn)證、序列化和自動(dòng)文檔。
路徑操作(Path Operations):定義API端點(diǎn)和HTTP方法。
路徑操作
FastAPI使用裝飾器來(lái)定義路徑操作,類(lèi)似于Flask的路由:
from fastapi import FastAPI
app = FastAPI()
@app.get("/")
async def read_root():
return {"Hello": "World"}
@app.get("/items/{item_id}")
async def read_item(item_id: int, q: str | None = None):
return {"item_id": item_id, "q": q}
?運(yùn)行應(yīng)用:
uvicorn main:app --reload
數(shù)據(jù)驗(yàn)證
FastAPI利用Pydantic進(jìn)行數(shù)據(jù)驗(yàn)證。你可以定義Pydantic模型來(lái)處理請(qǐng)求體:
from fastapi import FastAPI
from pydantic import BaseModel
app = FastAPI()
class Item(BaseModel):
name: str
description: str | None = None
price: float
tax: float | None = None
@app.post("/items/")
async def create_item(item: Item):
return item異步支持
FastAPI原生支持異步(async/await),這使得它在處理I/O密集型任務(wù)時(shí)表現(xiàn)出色:
from fastapi import FastAPI
import asyncio
app = FastAPI()
@app.get("/async_data/")
async def get_async_data():
await asyncio.sleep(1) # 模擬異步I/O操作
return {"data": "這是異步數(shù)據(jù)"}實(shí)際示例
下面是一個(gè)簡(jiǎn)單的FastAPI應(yīng)用,演示了如何創(chuàng)建一個(gè)帶有數(shù)據(jù)驗(yàn)證的API:
首先,創(chuàng)建一個(gè)名為main.py的文件:
from fastapi import FastAPI
from pydantic import BaseModel
app = FastAPI()
class Product(BaseModel):
name: str
price: float
is_available: bool = True
@app.post("/products/")
async def create_product(product: Product):
return {"message": "產(chǎn)品創(chuàng)建成功", "product": product}
@app.get("/products/{product_name}")
async def get_product(product_name: str):
# 實(shí)際應(yīng)用中會(huì)從數(shù)據(jù)庫(kù)查詢(xún)
if product_name == "apple":
return Product(name="apple", price=1.0, is_available=True)
return {"message": "產(chǎn)品未找到"}運(yùn)行應(yīng)用:
uvicorn main:app --reload
打開(kāi)瀏覽器訪問(wèn)
http://127.0.0.1:8000/docs,你將看到自動(dòng)生成的Swagger UI文檔,可以測(cè)試API。
框架對(duì)比
| 特性 | Flask | Streamlit | FastAPI |
|---|---|---|---|
| 類(lèi)型 | 微框架,Web應(yīng)用和API | 數(shù)據(jù)應(yīng)用和儀表板 | API框架,高性能Web服務(wù) |
| 學(xué)習(xí)曲線 | 中等,需要了解Web開(kāi)發(fā)基礎(chǔ) | 低,Python腳本即可 | 中等,需要了解異步編程和類(lèi)型提示 |
| 性能 | 良好,但不如FastAPI | 適用于數(shù)據(jù)展示,非高并發(fā)Web服務(wù) | 極高,與Node.js和Go相當(dāng) |
| 主要用途 | 傳統(tǒng)Web應(yīng)用、小型API、微服務(wù) | 數(shù)據(jù)科學(xué)應(yīng)用、機(jī)器學(xué)習(xí)演示、儀表板 | 高性能API、微服務(wù)、數(shù)據(jù)服務(wù) |
| 異步支持 | 不原生支持,需借助擴(kuò)展 | 不適用 | 原生支持async/await |
| 數(shù)據(jù)驗(yàn)證 | 需借助擴(kuò)展(如WTForms、Marshmallow) | 內(nèi)置UI組件提供簡(jiǎn)單驗(yàn)證 | 基于Pydantic,自動(dòng)數(shù)據(jù)驗(yàn)證和序列化 |
| 自動(dòng)文檔 | 無(wú),需借助擴(kuò)展(如Flask-RESTX) | 無(wú) | 內(nèi)置Swagger UI和ReDoc |
| 生態(tài)系統(tǒng) | 成熟,大量擴(kuò)展和社區(qū)支持 | 活躍,專(zhuān)注于數(shù)據(jù)科學(xué)領(lǐng)域 | 快速增長(zhǎng),得益于Starlette和Pydantic |
最佳實(shí)踐
選擇合適的框架:
如果你需要構(gòu)建一個(gè)傳統(tǒng)的Web應(yīng)用,或者一個(gè)輕量級(jí)的API服務(wù),并且希望有更大的靈活性和控制權(quán),Flask是一個(gè)不錯(cuò)的選擇。
如果你是一名數(shù)據(jù)科學(xué)家或機(jī)器學(xué)習(xí)工程師,希望快速將數(shù)據(jù)分析、模型演示或交互式儀表板部署為Web應(yīng)用,而不想深入Web開(kāi)發(fā)細(xì)節(jié),Streamlit是你的首選。
如果你需要構(gòu)建高性能的API服務(wù),對(duì)性能有較高要求,并且希望利用Python的類(lèi)型提示進(jìn)行數(shù)據(jù)驗(yàn)證和自動(dòng)文檔生成,FastAPI是最佳選擇。
項(xiàng)目結(jié)構(gòu):
對(duì)于Flask和FastAPI項(xiàng)目,建議采用模塊化的項(xiàng)目結(jié)構(gòu),將路由、模型、服務(wù)等分離到不同的文件中,保持代碼的清晰和可維護(hù)性。
Streamlit應(yīng)用通常是單個(gè)Python腳本,但對(duì)于復(fù)雜的應(yīng)用,也可以考慮將邏輯拆分為多個(gè)函數(shù)或模塊。
依賴(lài)管理:
始終使用
pipenv或poetry等工具管理項(xiàng)目依賴(lài),確保環(huán)境的隔離和可復(fù)現(xiàn)性。
錯(cuò)誤處理和日志:
在所有框架中,都應(yīng)該實(shí)現(xiàn)健壯的錯(cuò)誤處理機(jī)制,并使用日志記錄來(lái)跟蹤應(yīng)用的行為和問(wèn)題。
安全性:
對(duì)于Web應(yīng)用和API,安全性至關(guān)重要。始終注意輸入驗(yàn)證、身份驗(yàn)證、授權(quán)、CORS等安全問(wèn)題。
測(cè)試:
為你的應(yīng)用編寫(xiě)單元測(cè)試和集成測(cè)試,確保代碼的質(zhì)量和功能的正確性。
部署:
根據(jù)框架和應(yīng)用類(lèi)型選擇合適的部署方式。Flask和FastAPI應(yīng)用通常部署在Gunicorn、Uvicorn等ASGI/WSGI服務(wù)器上,并通過(guò)Nginx或Apache進(jìn)行反向代理。Streamlit應(yīng)用可以直接通過(guò)
streamlit run運(yùn)行,也可以部署到Streamlit Cloud或其他云平臺(tái)。
小結(jié)
Python生態(tài)系統(tǒng)為Web開(kāi)發(fā)提供了多樣化的選擇。Flask以其輕量和靈活性適用于通用Web應(yīng)用和API;Streamlit則專(zhuān)注于數(shù)據(jù)科學(xué)和機(jī)器學(xué)習(xí)應(yīng)用的快速原型開(kāi)發(fā)和部署;而FastAPI憑借其高性能和現(xiàn)代特性,成為構(gòu)建API服務(wù)的理想選擇。
選擇哪個(gè)框架取決于你的具體項(xiàng)目需求、團(tuán)隊(duì)經(jīng)驗(yàn)和對(duì)性能、開(kāi)發(fā)效率、生態(tài)系統(tǒng)等方面的考量。理解它們的特點(diǎn)和適用場(chǎng)景,將幫助你做出明智的決策,從而更高效地構(gòu)建出色的Python Web應(yīng)用。
尾聲
這里總結(jié)了Flask、Streamlit、FastAPI的詳解,需要的友友可以多多點(diǎn)贊收藏一波(?´?`?)。
到此這篇關(guān)于Python Web框架詳解:Flask、Streamlit、FastAPI的文章就介紹到這了,更多相關(guān)Python Flask、Streamlit、FastAPI內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
- Python使用Streamlit快速構(gòu)建一個(gè)數(shù)據(jù)應(yīng)用程序
- Python streamlit構(gòu)建令人驚嘆的可視化Web高級(jí)主題界面
- Python?Streamlit制作交互式可視化網(wǎng)頁(yè)應(yīng)用實(shí)例
- Python使用Streamlit快速創(chuàng)建儀表盤(pán)
- python使用Streamlit庫(kù)制作Web可視化頁(yè)面
- Python使用fastAPI如何實(shí)現(xiàn)一個(gè)流式傳輸接口
- Python?FastApi結(jié)合異步執(zhí)行方式
- Python?搭建?FastAPI?項(xiàng)目的詳細(xì)過(guò)程
相關(guān)文章
pandas如何將dataframe中的NaN替換成None
這篇文章主要介紹了pandas如何將dataframe中的NaN替換成None問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-08-08
遠(yuǎn)程部署工具Fabric詳解(支持Python3)
這篇文章主要介紹了遠(yuǎn)程部署神器 Fabric,支持Python3 ,Fabric 出場(chǎng)了。Fabric 是一個(gè)遠(yuǎn)程部署神器,它可以在本地執(zhí)行遠(yuǎn)程服務(wù)器的命令。,需要的朋友可以參考下2019-07-07
Pytorch加載部分預(yù)訓(xùn)練模型的參數(shù)實(shí)例
今天小編就為大家分享一篇Pytorch加載部分預(yù)訓(xùn)練模型的參數(shù)實(shí)例,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2019-08-08

