【Python】dash-fastapi前后端搭建

概述

項目中需要快速搭建一個前后端系統,涉及到dash-fastapi架構的時候,對該架構的時候進行總結。本文主要總結的是對該架構的基本使用,后續再對該架構的項目源碼進行總結分析

此處實現一個小的demo,迷你任務管理器,后端使用FastAPI,前端則使用Dash,數據存儲暫時使用列表進行存儲,主要功能如下

  • 任務列表展示: 前端頁面顯示一個簡單的任務列表,包含任務標題和狀態。
  • 添加任務: 用戶可以在前端輸入任務標題,點擊按鈕添加新任務。
  • 刷新任務列表: 點擊按鈕可以刷新任務列表,從后端獲取最新數據。

整體架構理解

代碼主體架構

  • 后端
    • main.py (Fast API主文件)
    • requirements.txt(后端依賴)
  • 前端
    • app.py(Dash主文件)
    • api_client.py(前端API客戶端)
    • layoputs.py(前端布局)
    • callbacks.py(前端回調函數)
    • requirements.txt(后端依賴)

主要邏輯理解

代碼中具體體現

  • 后端
    • main.py:后端,也就類似于廚房。專門負責接收顧客的訂單,然后準備食物(構建響應)并告知服務器食物準備后
    • tasks_db = []:通過列表內存列表,類似于廚師的菜單列表。其記錄了餐廳可以提供的菜品,也就是后端可以完成的任務
    • @app.get :廚師提供給服務員今日菜單,服務員發送get請求的時候,就可以知道后端提供什么服務(從tasks_db中獲取)
    • @app.post:創創建任務,類似于服務員將菜單傳給廚房;后面的邏輯就是請求響應的基本邏輯
    • Task(使用Pydantic模型):菜單上的菜品敘述,規定了每個任務包含哪些信息,提供任務名以及狀態是否完成
  • 前端
    • layouts.py:餐廳的菜單,定義了顧客可以看到什么,也就是前端顯示的頁面
      • dcc.Input:點餐單的填寫區域,顧客要吃什么
      • dbc.Button:提交按鈕,這里可以對應設計供,例如提交點餐單或者是刷新菜單信息
      • html.Div:上菜的盤子,廚房準備后的食物會放進這個盤子里展示給顧客
    • ?callbacks.py:服務員接收到顧客的指令應該如何行動
    • api_client.py:點餐系統,幫助前端與后端溝通,服務員與廚師之間的溝通? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?

具體實現

該實例主要用于理解該結構的運行

代碼

后端:主要提供兩個方法,獲取所有任務列表和創建新任務

# backend/main.pyfrom fastapi import FastAPI, HTTPException
from pydantic import BaseModel
from typing import Listapp = FastAPI()# 模擬內存數據庫 (使用 Python 列表)
tasks_db = []
# 用于生成唯一的用戶ID
task_id_counter = 1class Task(BaseModel):id: inttitle: strstatus: str = "待完成"  # 默認狀態class TaskCreate(BaseModel):title: strclass TaskResponse(BaseModel):tasks: List[Task]@app.get("/api/tasks", response_model=TaskResponse)
async def get_tasks():"""獲取所有任務列表"""return TaskResponse(tasks=tasks_db)@app.post("/api/tasks", response_model=Task)
async def create_task(task_create: TaskCreate):"""創建新任務"""global task_id_counternew_task = Task(id=task_id_counter, title=task_create.title)tasks_db.append(new_task)task_id_counter += 1return new_taskif __name__ == "__main__":import uvicornuvicorn.run(app, host="0.0.0.0", port=8000, reload=True)

后端依賴:requirements.txt

fastapi
uvicorn
pydantic

前端代碼:api_client.py(向服務端發起請求)

import requestsAPI_BASE_URL = "http://localhost:8000/api"  # 后端 API 基礎 URLdef get_task_list():"""獲取任務列表"""url = f"{API_BASE_URL}/tasks"response = requests.get(url)response.raise_for_status()  # 檢查請求是否成功 (狀態碼 2xx)return response.json()def create_new_task(title):"""創建新任務"""url = f"{API_BASE_URL}/tasks"headers = {'Content-Type': 'application/json'}data = {'title': title}response = requests.post(url, headers=headers, json=data)response.raise_for_status()return response.json()

前端回調:callbacks.py,當顧客觸碰哪些按鈕后與后端交互然后返回的邏輯實現

from dash import Output, Input, State
from .app import app  # 導入 Dash app 實例
from frontend import api_client  # 導入 API 客戶端
import dash_html_components as html
import  dash@app.callback(Output("task-list-output", "children"),[Input("refresh-tasks-button", "n_clicks"),Input("add-task-button", "n_clicks")],[State("new-task-title", "value")]
)
def update_task_list(refresh_clicks, add_clicks, new_task_title):"""更新任務列表顯示"""triggered_id = [p['prop_id'] for p in dash.callback_context.triggered][0]if "add-task-button" in triggered_id:if new_task_title:api_client.create_new_task(new_task_title) # 調用 API 創建新任務tasks_data = api_client.get_task_list() # 調用 API 獲取任務列表task_items = []if tasks_data and tasks_data.get('tasks'): # 檢查 tasks_data 和 tasks 鍵是否存在for task in tasks_data['tasks']:task_items.append(html.Li(f"{task['title']} - 狀態: {task['status']} (ID: {task['id']})"))else:task_items.append(html.Li("暫無任務"))return html.Ul(task_items)

?前端頁面布局layouts.py

import dash_html_components as html
import dash_core_components as dcc
import dash_bootstrap_components as dbclayout = dbc.Container([html.H1("迷你任務管理器"),dbc.Row([dbc.Col([html.Div("任務標題:"),dcc.Input(id="new-task-title", type="text", placeholder="請輸入任務標題"),dbc.Button("添加任務", id="add-task-button", n_clicks=0, className="mt-2"),]),]),html.Hr(className="mt-3"),html.H4("任務列表"),dbc.Button("刷新任務列表", id="refresh-tasks-button", n_clicks=0, className="mb-2"),html.Div(id="task-list-output"), # 用于顯示任務列表
])

前端依賴

dash
dash-bootstrap-components
requests

pydantic補充

"""
簡單事例
"""# from pydantic import BaseModel
#
# class User(BaseModel):
#     id: int
#     name: str
#     email: str
#     is_active: bool = True  # 默認值
#
# # 示例數據
# user_data = {
#     'id': 1,
#     'name': 'Alice',
#     'email': 'alice@example.com',
# }
#
# # 使用 Pydantic 模型進行數據驗證和解析
# user = User(**user_data)
# print(user)"""
復雜事例的封裝
"""
from pydantic import BaseModel
from typing import Listclass Address(BaseModel):street: strcity: strzip_code: strclass User(BaseModel):id: intname: straddress: Address  # 嵌套模型# 創建嵌套數據
user_data = {'id': 1,'name': 'John','address': {'street': '123 Main St','city': 'New York','zip_code': '10001',}
}user = User(**user_data)
print(user)

前端回調邏輯

@app.callback(Output("task-list-output", "children"),[Input("refresh-tasks-button", "n_clicks"),Input("add-task-button", "n_clicks")],[State("new-task-title", "value")]
)
def update_task_list(refresh_clicks, add_clicks, new_task_title):"""更新任務列表顯示"""triggered_id = [p['prop_id'] for p in dash.callback_context.triggered][0]if "add-task-button" in triggered_id:if new_task_title:api_client.create_new_task(new_task_title) # 調用 API 創建新任務tasks_data = api_client.get_task_list() # 調用 API 獲取任務列表task_items = []if tasks_data and tasks_data.get('tasks'): # 檢查 tasks_data 和 tasks 鍵是否存在for task in tasks_data['tasks']:task_items.append(html.Li(f"{task['title']} - 狀態: {task['status']} (ID: {task['id']})"))else:task_items.append(html.Li("暫無任務"))return html.Ul(task_items)

回調函數callbacks理解

Dash框架中回調函數是實現交互的關鍵,其一可以連接前端的UI組件交互和侯丹數據的處理邏輯(調用API或者更新圖表操作),從而實現動態更新前端UI,而不需要更新整個頁面

Output("task-list-output", "children") (輸出)

該處定義了回調函數的輸出,其指定了當回調函數執行完畢后,哪個前端組件的哪個屬性會被更新

html.Div(id="task-list-output") #  <---  這里定義了 id="task-list-output" 的 Div 組件

這個回調函數執行完成后,將會更新 id"task-list-output"Div 組件的 children 屬性。 換句話說,回調函數的返回值將會被設置為這個 Div 組件的內容,從而更新任務列表的顯示

換句話說,output就是上菜的盤子,盤子里面的內容就是children屬性

[Input("refresh-tasks-button", "n_clicks"), Input("add-task-button", "n_clicks")] (輸入 - 觸發器)

指定了當前前端組件的哪些屬性發生變化的時候,會觸發這個回調函數執行

dbc.Button("刷新任務列表", id="refresh-tasks-button", ...) # <--- 這里定義了 id="refresh-tasks-button" 的按鈕

類似于顧客點擊菜價查詢,服務員就會去問一下菜價,當顧客點擊提交餐單的時候,服務員就會立馬去廚房下單

[State("new-task-title", "value")] (狀態)

指定哪些前端組件的哪些屬性的當前值需要傳遞給回調函數,但是State組件屬性的變化不會觸發回調函數執行

可以理解State就是顧客在菜單上書寫的菜名

update_task_list 回調函數被觸發執行時 (因為 "刷新任務列表" 按鈕或 "添加任務" 按鈕被點擊了),Dash 框架會將 id"new-task-title" 的輸入框組件的 value 屬性的 "當前值" 作為參數傳遞給 update_task_list 函數。 注意,輸入框內容的變化 不會 直接觸發回調函數,只有當 Input 指定的組件屬性變化時才會觸發

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/897856.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/897856.shtml
英文地址,請注明出處:http://en.pswp.cn/news/897856.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

IDEA中鏈接使用mysql數據庫

一、連接mysql 1. 打開idea&#xff0c;在右上角側邊欄有數據庫database插件&#xff0c;打開側邊欄點擊加號->數據源&#xff0c;可以看到支持很多數據庫&#xff0c;選擇mysql。 2. 首次使用需要下載驅動程序&#xff0c;不然連接數據庫會報錯。找到mysql&#xff0c;點擊…

程序編譯生成的文件

目錄 .i 文件 .s 文件 .o文件 總結 在 C 編程中&#xff0c;.i、.s和 .o 文件是編譯過程中生成的不同階段的文件&#xff0c;它們代表不同的含義&#xff1a; .i 文件 全稱 &#xff1a;預處理后的文件&#xff08;Intermediate File&#xff09;。 含義&#xff1a;.i文件…

[S32K]SPI

SpiShiftClockidleLevel: CLK空閑時電平(CPOL)&#xff1b; SpiDataShifrEdge:數據移位邊沿(CPHA)&#xff1b; SpiDataWidth: SpiTransferStart: MSB(高位起始)&#xff0c;LSB(低位起始)&#xff1b;&#xff1b; SpiHwUnit: 這是一個具體的硬件&#xff1f; SpiDataShiftE…

系統思考:客戶價值

“真正的市場競爭&#xff0c;不是比誰更能制造產品&#xff0c;而是比誰更能創造價值。” ——杰夫貝索斯 在組織輔導中&#xff0c;我經常問團隊一個問題&#xff1a;“我們的客戶是誰&#xff1f;”大多數人的第一反應是——“支付費用的就是客戶。” 這在過去的市場擴張階…

ArcGIS Pro 車牌分區數據處理與地圖制作全攻略

在大數據時代&#xff0c;地理信息系統&#xff08;GIS&#xff09;技術在各個領域都有著廣泛的應用&#xff0c;而 ArcGIS Pro 作為一款功能強大的 GIS 軟件&#xff0c;為數據處理和地圖制作提供了豐富的工具和便捷的操作流程。 車牌數據作為一種重要的地理空間數據&#xf…

OpenCV圖像加權函數:addWeighted

1 addWeighted函數 在OpenCV 里&#xff0c;addWeighted 函數的作用是對兩個圖像進行加權求和&#xff0c;常用于圖像融合、圖像過渡等場景。函數如下&#xff1a; cv2.addWeighted(src1, alpha, src2, beta, gamma[, dst[, dtype]])2 參數解釋 src1&#xff1a;第一個輸入圖…

Tcp網絡通信的基本流程梳理

先來一張經典的流程圖 接下介紹一下大概流程&#xff0c;各個函數的參數大家自己去了解加深一下印象 服務端流程 1.創建套接字&#xff1a;使用 socket 函數創建一個套接字&#xff0c;這個套接字后續會被用于監聽客戶端的連接請求。 需要注意的是&#xff0c;服務端一般有倆…

mysql學習-刪除數據(drop、truncate、delete)

1、概述 drop、truncate、delete都可以刪除mysql中的數據&#xff0c;但它們的作用范圍和操作方式有很大的不同。 2、詳細區別 2.1、drop 特點&#xff1a; 1、速度快 2、會刪除表數據&#xff0c;還會刪除表結構&#xff0c;包括與該表相關的所有數據&#xff0c;索引&…

編程自學指南:java程序設計開發,網絡編程基礎,TCP編程,UDP編程,HTTP客戶端開發

編程自學指南&#xff1a;java程序設計開發&#xff0c;網絡編程基礎 學習目標&#xff1a; 理解網絡協議&#xff08;TCP/IP、UDP&#xff09;的核心概念 掌握Socket編程實現客戶端與服務端通信 能夠通過多線程處理并發網絡請求 開發簡單的網絡應用&#xff08;如聊天程序…

leecode797.所有可能的路徑

深度優先搜索 class Solution { private:vector<vector<int>> result;vector<int> temp;void allPathsSourceTarget(vector<vector<int>> &graph,int v){if(vgraph.size()-1)result.push_back(temp);else{for(auto& adjVertex:graph[v]…

第八節:紅黑樹(初階)

【本節要點】 紅黑樹概念紅黑樹性質紅黑樹結點定義紅黑樹結構紅黑樹插入操作的分析 一、紅黑樹的概念與性質 1.1 紅黑樹的概念 紅黑樹 &#xff0c;是一種 二叉搜索樹 &#xff0c;但 在每個結點上增加一個存儲位表示結點的顏色&#xff0c;可以是 Red和 Black 。 通過對 任何…

微信小程序threejs三維開發

微信小程序threejs開發 import * as THREE from three; const { performance, document, window, HTMLCanvasElement, requestAnimationFrame, cancelAnimationFrame, core, Event, Event0 } THREE .DHTML import Stats from three/examples/jsm/libs/stats.module.js; im…

jupyter無法轉換為PDF,HTMLnbconvert failed: Pandoc wasn‘t found.

無法轉為PDF 手動下載工具 https://github.com/jgm/pandoc/releases/tag/3.6.3 似乎跟我想的不大一樣&#xff0c;還有新的報錯 https://nbconvert.readthedocs.io/en/latest/install.html#installing-tex 不知道下的啥玩意兒 sudo apt-get install texlive-xetex texlive-fon…

關于PLC、電纜線材及氣缸選型的詳細教程

以下是關于PLC、電纜線材及氣缸選型的詳細教程&#xff0c;整合了多個專業來源的核心要點&#xff1a; 一、PLC選型要點 生產廠家選擇 日系PLC&#xff08;如三菱FX系列、歐姆龍CP1系列&#xff09;適合獨立設備或簡單控制系統&#xff0c;性價比高。歐美系PLC&#xff08;如西…

使用 Excel 實現績效看板的自動化

引言 在日常工作中&#xff0c;團隊的績效監控和管理是確保項目順利進行的重要環節。然而&#xff0c;面臨著以下問題&#xff1a; ?數據分散&#xff1a;系統中的數據難以匯總&#xff0c;缺乏一個宏觀的團隊執行情況視圖。?看板缺失&#xff1a;系統本身可能無法提供合適…

02 windows qt配置ffmpeg開發環境搭建

版本說明 首先我使用ffmpeg版本是4.2.1 QT使用版本5.14.2 我選擇是c編譯 在02Day.pro??添加ffmpeg頭?件和庫?件路徑 win32 { INCLUDEPATH $$PWD/ffmpeg-4.2.1-win32-dev/include LIBS $$PWD/ffmpeg-4.2.1-win32-dev/lib/avformat.lib \$$PWD/ffmpeg-4.2.1-win32-dev/l…

Dask:Python高效并行計算利器

Dask&#xff1a;Python高效并行計算利器 Dask是一個開源的Python并行計算庫&#xff0c;旨在擴展Python常用工具&#xff08;如NumPy、Pandas、Scikit-learn等&#xff09;的功能&#xff0c;使其能夠處理更大規模的數據集和更復雜的計算任務。它通過動態任務調度和分布式計算…

掌握市場先機:9款銷售渠道管理工具深度測評

本文主要介紹了以下9款銷售渠道管理工具&#xff1a;1.紛享銷客&#xff1b; 2.銷幫幫&#xff1b; 3.小滿CRM&#xff1b; 4.有贊&#xff1b; 5.Oracle NetSuite&#xff1b; 6.Salesforce Sales Cloud&#xff1b; 7.Cin7&#xff1b; 8.Pipedrive&#xff1b; 9.BigCommerc…

C語言基礎知識04

指針 指針概念 指針保存地址&#xff0c;地址是字節的編號 指針類型和保存的地址類型要一直 使用時注意&#xff0c;把地址轉換為&變量的格式來看 int a[3]; a轉為&a[0] 指針的大小 64bit 固定8字節&#xff0c; 32bit 固定4字節 指針…

計算矩陣邊緣元素之和(信息學奧賽一本通-1121)

【題目描述】 輸入一個整數矩陣&#xff0c;計算位于矩陣邊緣的元素之和。所謂矩陣邊緣的元素&#xff0c;就是第一行和最后一行的元素以及第一列和最后一列的元素。 【輸入】 第一行分別為矩陣的行數m和列數n&#xff08;m<100&#xff0c;n<100&#xff09;&#xff0c…