成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

使用FastAPI整合Gradio和Django

人工智能
本文分享了一種整合 Gradio 和 Django 程序的方法,在這種方法下,Gradio 和 Django 可以使用同一個(gè)進(jìn)程,使用相同的端口號(hào)對外服務(wù),同時(shí)Gradio程序使用子目錄 /gradio 進(jìn)行訪問,Django 程序使用根目錄 / 進(jìn)行訪問。

大家好,我是每天分享AI應(yīng)用的螢火君!

經(jīng)常接觸機(jī)器學(xué)習(xí)的同學(xué)可能都接觸過Gradio這個(gè)框架,Gradio是一個(gè)基于Python的專門為機(jī)器學(xué)習(xí)項(xiàng)目創(chuàng)建的快速開發(fā)框架,可以讓開發(fā)者快速發(fā)布自己的模型給用戶測試,目前Huggingface上的機(jī)器學(xué)習(xí)項(xiàng)目都是基于Gradio對外提供服務(wù)的。

不過Gradio的目標(biāo)是機(jī)器學(xué)習(xí)模型的快速演示,真正為用戶提供服務(wù)時(shí),我們還有很多需要關(guān)注的方面,比如用戶的鑒權(quán)授權(quán)、消息通知、靜態(tài)頁面、SEO優(yōu)化等等,這些使用Gradio有點(diǎn)捉襟見肘,我們還需要使用更加成熟的Web開發(fā)框架,比如Django這種。

但是我們初期可能已經(jīng)用Gradio做了很多的功能,不想重寫這些東西,這時(shí)候就產(chǎn)生了集成Gradio到其它框架的需求。這篇文章就來分享如何將Gradio集成到成熟的Web框架Django,以方便后來者。

創(chuàng)建Django項(xiàng)目

這里假設(shè)我們已經(jīng)有了一個(gè)Gradio的項(xiàng)目,將在這個(gè)項(xiàng)目中繼續(xù)創(chuàng)建一個(gè)Django項(xiàng)目。

創(chuàng)建 Django 項(xiàng)目

首先通過 pip 安裝 Django

pip install django

然后在程序的根目錄初始化Django項(xiàng)目的一些基礎(chǔ)文件:

django-admin startproject myproject
cd myproject

這里的 myproject 需要替換成你的 Django 項(xiàng)目名。

然后我們還要繼續(xù)創(chuàng)建 Django 應(yīng)用,應(yīng)用可以理解為模塊,比如項(xiàng)目下有管理模塊、用戶模塊、支付模塊和具體的業(yè)務(wù)單元模塊。每個(gè)應(yīng)用都有自己的模型、視圖、模板和 URL 路由。

python manage.py startapp myapp

請將myapp改為你的應(yīng)用名稱。

執(zhí)行完這些命令之后,項(xiàng)目中將會(huì)增加一些Django的框架腳本。

創(chuàng)建 Django 頁面

有了Django的基礎(chǔ)腳本,然后就可以開發(fā)Web頁面了。

1個(gè)頁面涉及三個(gè)方面:視圖、路由和HTML模板,還是以 myapp 為例:

在 myapp/views.py 中創(chuàng)建一個(gè)視圖:

from django.shortcuts import render

def index(request):
    return render(request, 'index.html')

在 myapp/urls.py 中設(shè)置 URL 路由到這個(gè)視圖:

from django.urls import path
from .views import index

urlpatterns = [
    path('', index, name='index'),
]

在 myapp/templates/index.html 創(chuàng)建 HTML 模板:

<!DOCTYPE html>
<html>
<head>
    <title>Gradio in Django</title>
</head>
<body>
    <h1>Welcome to My App</h1>
</body>
</html>

然后我們就可以啟動(dòng)程序,在瀏覽器訪問這個(gè)頁面了:

uvicorn myproject.wsgi:application --reload

啟動(dòng)程序使用的是 uvicorn工具,myproject是項(xiàng)目的名稱,wsgi對應(yīng)到myproject文件夾下的 wsgi.py。

集成Gradio到Django

準(zhǔn)備一個(gè)Gradio項(xiàng)目

為了演示,這里準(zhǔn)備一個(gè)Gradio的程序。

假設(shè)文件路徑為:gradio/app.py

import gradio as gr

def greet(name):
    return f"Hello {name}!"

# 定義 Gradio 接口
demo = gr.Interface(fn=greet, inputs="text", outputs="text")

整合 Gradio 和 Django

現(xiàn)在我們把 Gradio 集成到 Django 中,它們將在同一個(gè)進(jìn)程中運(yùn)行,對外使用一個(gè)端口號(hào)。Django 默認(rèn)通過根目錄 / 進(jìn)行訪問,Gradio則通過 /gradio 進(jìn)行訪問。

這里走過一些彎路,有問題的方法就不講了,直接給出我的方案。

這里還要引入一個(gè)框架 FastAPI,我們將使用 FastAPI 來代理對 Gradio 和 Django 的訪問,所以其實(shí)不是將Gradio集成到Django,這個(gè)方法本質(zhì)上是將 Gradio 和 Django 整合到一起。

打開 myproject/wsgi.py,這是 Django 項(xiàng)目的主文件:

import os
from django.core.wsgi import get_wsgi_application
from fastapi import Request, Response
from starlette.middleware.wsgi import WSGIMiddleware
import gradio as gr
from gradio.app import demo

os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'myproject.settings')

# 創(chuàng)建 FastAPI 應(yīng)用
app = FastAPI()

# 掛載 Gradio 到FastAPI,注意這個(gè)path要和下邊中間件中的一致
app = gr.mount_gradio_app(app, demo, path="/gradio")

# 獲取 Django 的 WSGI 應(yīng)用
django_app = get_wsgi_application()

# 注冊一個(gè)FastAPI中間件,實(shí)現(xiàn)
@app.middleware("http")
async def route_middleware(request: Request, call_next):
   
    # 如果路徑是 /gradio,則調(diào)用call_next,F(xiàn)astAPI框架會(huì)交給已經(jīng)注冊的 Gradio程序 處理
    if request.url.path.startswith("/gradio"):
        return await call_next(request)
    
    # 否則交給Django處理
    response = Response()
    
    async def send(message):
        if message['type'] == 'http.response.start':
            response.status_code = message['status']
            response.headers.update({k.decode(): v.decode() for k, v in message['headers']})
        elif message['type'] == 'http.response.body':
            response.body += message.get('body', b'')  # 注意這里用 += 來累積響應(yīng)體
            
    await WSGIMiddleware(django_app)(request.scope, request.receive, send)
    
    response.headers["content-length"] = str(len(response.body))
    return response

這段代碼的邏輯也比較簡單,先創(chuàng)建FastAPI應(yīng)用,然后將Gradio程序掛載到FastAPI,這里使用的是Gradio自帶的mount_gradio_app方法,然后創(chuàng)建了一個(gè)FastAPI的中間件,對不同的路由使用不同的處理。

重點(diǎn)就在這個(gè)FastAPI中間件,它可以保證通過 /gradio 訪問到Gradio程序,通過 / 訪問到 Django 程序。

如果我們使用下面的這種方式來代理 Django,實(shí)測將不能通過 /gradio 訪問到Gradio程序,無論 Gradio 和 Django 誰先注冊。如果你的環(huán)境可以,歡迎留下你的各個(gè) package 的版本。

app.mount("/", WSGIMiddleware(django_app))

靜態(tài)文件的訪問

因?yàn)殪o態(tài)文件是每個(gè)Web程序幾乎避不開的,比如圖片、css、js等,所以這里特別提下。

在上邊的路由中間件中,除了 /gradio 會(huì)路由到Gradio程序,其它都會(huì)走Django進(jìn)行處理,靜態(tài)文件也不例外。

這里假設(shè)靜態(tài)文件放在 static 目錄下。

打開 myproject/settings.py,這是 Django 項(xiàng)目的基礎(chǔ)設(shè)置文件,修改其中靜態(tài)文件的部分:

STATIC_URL = '/static/'
if DEBUG:
    STATICFILES_DIRS = [
        os.path.join(BASE_DIR, "static"),
    ]
else:
    STATIC_ROOT = os.path.join(BASE_DIR, 'static')

打開 myproject/urls.py,修改其中的路由定義,增加 re_path 這一行。

urlpatterns = [
    re_path('^static/(?P<path>.*)', serve, {'document_root': settings.STATIC_ROOT}),
    path('', include('myapp.urls')),  # 包含 myapp 的 URL 配置
]

這樣可以在調(diào)測和生產(chǎn)環(huán)境都能正常訪問 static 目錄下的靜態(tài)文件,而不用再進(jìn)行不同的設(shè)置。

總結(jié)

本文分享了一種整合 Gradio 和 Django 程序的方法,在這種方法下,Gradio 和 Django 可以使用同一個(gè)進(jìn)程,使用相同的端口號(hào)對外服務(wù),同時(shí)Gradio程序使用子目錄 /gradio 進(jìn)行訪問,Django 程序使用根目錄 / 進(jìn)行訪問。

因本人對 Django 和 Gradio 的了解有限,文中介紹的方法可能存在瑕疵,請謹(jǐn)慎使用。



責(zé)任編輯:武曉燕 來源: 螢火架構(gòu)
相關(guān)推薦

2021-04-28 07:03:28

DjangoFlaskFastAPI

2023-10-09 18:17:52

Python語言Web

2012-04-19 10:04:20

ibmdw

2024-07-25 08:58:16

GradioPython數(shù)據(jù)應(yīng)用

2025-05-14 08:16:46

?Redis機(jī)器學(xué)習(xí)推薦模型

2025-06-16 07:55:29

2025-05-07 10:00:00

開發(fā)FastAPI日志

2020-06-04 17:38:49

PythonFastAPIWeb服務(wù)

2016-11-09 14:02:46

HiveHBase集成

2009-06-19 10:00:37

Struts和Spri

2023-12-05 15:44:46

計(jì)算機(jī)視覺FastAPI

2025-05-19 08:30:19

2017-04-19 22:30:26

LinuxNginxGunicorn

2023-03-27 15:07:27

PythonWeb 開發(fā)編程語言

2021-06-09 09:36:18

DjangoElasticSearLinux

2021-04-26 10:47:54

AJAXDjango前端

2025-05-12 10:02:05

2023-10-07 12:06:52

2009-07-03 13:31:07

PHP和JSPApache處理

2015-07-16 15:20:58

DockerDjango
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)

主站蜘蛛池模板: 中国三级黄色录像 | 中文字幕一区二区三区日韩精品 | 一区二区视频在线 | 亚洲欧美中文日韩在线v日本 | 91九色porny首页最多播放 | aaa在线观看 | 精品国产欧美一区二区三区成人 | 黄色在线| 亚洲精品免费在线观看 | 久久激情av| 男人的天堂久久 | 可以在线观看av的网站 | 97高清国语自产拍 | 欧洲尺码日本国产精品 | 国产专区在线 | 精品自拍视频 | 在线观看黄色电影 | 国产精品乱码一区二三区小蝌蚪 | 中文字幕在线三区 | 亚洲高清视频一区 | 欧美日韩亚洲视频 | 亚洲精品国产第一综合99久久 | 一区二区三区在线免费观看 | 国产分类视频 | 国家aaa的一级看片 h片在线看 | 成人毛片一区二区三区 | 狠狠爱一区二区三区 | 国产情侣在线看 | 日韩在线欧美 | 成人精品一区二区三区中文字幕 | 毛片软件 | 国产在线小视频 | caoporn国产精品免费公开 | 亚洲成人一二区 | 美女黄网站视频免费 | 成人欧美一区二区三区黑人孕妇 | 亚洲激情综合 | 一区二区三区亚洲视频 | 国产欧美一级二级三级在线视频 | 久草视频网站 | 久久久国产精品一区 |