- VisualStudio2022插件的安装及使用-编程手把手系列文章
- pprof-在现网场景怎么用
- C#实现的下拉多选框,下拉多选树,多级节点
- 【学习笔记】基础数据结构:猫树
大家好,我是每天分享AI应用的萤火君! 。
经常接触机器学习的同学可能都接触过Gradio这个框架,Gradio是一个基于Python的专门为机器学习项目创建的快速开发框架,可以让开发者快速发布自己的模型给用户测试,目前Huggingface上的机器学习项目都是基于Gradio对外提供服务的.
不过Gradio的目标是机器学习模型的快速演示,真正为用户提供服务时,我们还有很多需要关注的方面,比如用户的鉴权授权、消息通知、静态页面、SEO优化等等,这些使用Gradio有点捉襟见肘,我们还需要使用更加成熟的Web开发框架,比如Django这种.
但是我们初期可能已经用Gradio做了很多的功能,不想重写这些东西,这时候就产生了集成Gradio到其它框架的需求。这篇文章就来分享如何将Gradio集成到成熟的Web框架Django,以方便后来者.
这里假设我们已经有了一个Gradio的项目,将在这个项目中继续创建一个Django项目.
首先通过 pip 安装 Django:
pip install django
然后在程序的根目录初始化Django项目的一些基础文件:
django-admin startproject myproject
cd myproject
这里的 myproject 需要替换成你的 Django 项目名.
然后我们还要继续创建 Django 应用,应用可以理解为模块,比如项目下有管理模块、用户模块、支付模块和具体的业务单元模块。每个应用都有自己的模型、视图、模板和 URL 路由.
python manage.py startapp myapp
请将myapp改为你的应用名称.
执行完这些命令之后,项目中将会增加一些Django的框架脚本.
有了Django的基础脚本,然后就可以开发Web页面了.
1个页面涉及三个方面:视图、路由和HTML模板,还是以 myapp 为例:
在 myapp/views.py 中创建一个视图:
from django.shortcuts import render
def index(request):
return render(request, 'index.html')
在 myapp/urls.py 中设置 URL 路由到这个视图:
from django.urls import path
from .views import index
urlpatterns = [
path('', index, name='index'),
]
在 myapp/templates/index.html 创建 HTML 模板:
<!DOCTYPE html>
<html>
<head>
<title>Gradio in Django</title>
</head>
<body>
<h1>Welcome to My App</h1>
</body>
</html>
然后我们就可以启动程序,在浏览器访问这个页面了:
uvicorn myproject.wsgi:application --reload
启动程序使用的是 uvicorn工具,myproject是项目的名称,wsgi对应到myproject文件夹下的 wsgi.py.
为了演示,这里准备一个Gradio的程序.
假设文件路径为: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 中,它们将在同一个进程中运行,对外使用一个端口号。Django 默认通过根目录 / 进行访问,Gradio则通过 /gradio 进行访问.
这里走过一些弯路,有问题的方法就不讲了,直接给出我的方案.
这里还要引入一个框架 FastAPI,我们将使用 FastAPI 来代理对 Gradio 和 Django 的访问,所以其实不是将Gradio集成到Django,这个方法本质上是将 Gradio 和 Django 整合到一起.
打开 myproject/wsgi.py,这是 Django 项目的主文件:
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')
# 创建 FastAPI 应用
app = FastAPI()
# 挂载 Gradio 到FastAPI,注意这个path要和下边中间件中的一致
app = gr.mount_gradio_app(app, demo, path="/gradio")
# 获取 Django 的 WSGI 应用
django_app = get_wsgi_application()
# 注册一个FastAPI中间件,实现
@app.middleware("http")
async def route_middleware(request: Request, call_next):
# 如果路径是 /gradio,则调用call_next,FastAPI框架会交给已经注册的 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'') # 注意这里用 += 来累积响应体
await WSGIMiddleware(django_app)(request.scope, request.receive, send)
response.headers["content-length"] = str(len(response.body))
return response
这段代码的逻辑也比较简单,先创建FastAPI应用,然后将Gradio程序挂载到FastAPI,这里使用的是Gradio自带的mount_gradio_app方法,然后创建了一个FastAPI的中间件,对不同的路由使用不同的处理.
重点就在这个FastAPI中间件,它可以保证通过 /gradio 访问到Gradio程序,通过 / 访问到 Django 程序.
如果我们使用下面的这种方式来代理 Django,实测将不能通过 /gradio 访问到Gradio程序,无论 Gradio 和 Django 谁先注册。如果你的环境可以,欢迎留下你的各个 package 的版本.
app.mount("/", WSGIMiddleware(django_app))
因为静态文件是每个Web程序几乎避不开的,比如图片、css、js等,所以这里特别提下.
在上边的路由中间件中,除了 /gradio 会路由到Gradio程序,其它都会走Django进行处理,静态文件也不例外.
这里假设静态文件放在 static 目录下.
打开 myproject/settings.py,这是 Django 项目的基础设置文件,修改其中静态文件的部分:
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 配置
]
这样可以在调测和生产环境都能正常访问 static 目录下的静态文件,而不用再进行不同的设置.
本文分享了一种整合 Gradio 和 Django 程序的方法,在这种方法下,Gradio 和 Django 可以使用同一个进程,使用相同的端口号对外服务,同时Gradio程序使用子目录 /gradio 进行访问,Django 程序使用根目录 / 进行访问.
因本人对 Django 和 Gradio 的了解有限,文中介绍的方法可能存在瑕疵,请谨慎使用.
关注萤火架构,加速技术提升! 。
最后此篇关于使用FastAPI整合Gradio和Django的文章就讲到这里了,如果你想了解更多关于使用FastAPI整合Gradio和Django的内容请搜索CFSDN的文章或继续浏览相关文章,希望大家以后支持我的博客! 。
我正在研究最适合我的 Web 框架。 我们将开发几个微服务,我们需要在一些微服务上分派(dispatch)事件,这些事件可以在其他微服务上监听。 是否支持使用 FastAPI?如果没有,有没有办法监听
快速API 0.68.0 python 3.8 from fastapi import Depends, FastAPI, Header, HTTPException async def verify
在 FastAPI 框架内: 虽然请求数据当然可以作为参数传递,但我想知道函数是否可以在不传递参数的情况下访问有关当前请求的信息。 免责声明:我不认为全局访问请求数据是一个好的做法,但我有一个用例,如
无论如何,FastAPI“依赖项”是否可以解释路径参数。 我有很多形式的功能: @app.post("/item/{item_id}/process", response_class=ProcessR
我有一个由诗歌构建的 fastapi 项目。我想使用 pyproject.tom 中的脚本部分运行应用程序,如下所示: poetry run start 该部分的双引号内是什么? [tool.poet
我正在尝试将分页添加到我的 fastapi 项目中。所以我决定使用这个: fastapi-contrib 我在那里遵循相同的示例,但由于某种原因我收到此错误: type object 'MOrdene
在我的项目文件夹中,我有一个基本的 index.html文件加上静态文件(js、css)以及我的 main.py : from fastapi.staticfiles import StaticFil
FastAPI显示可以设置response_model_exclude_none=True在装饰器中忽略值为 None 的字段:https://fastapi.tiangolo.com/tutoria
FastAPI 生成自动 swagger/openapi 文档。 在 https://fastapi.tiangolo.com/tutorial/response-status-code 的教程中有一
我获得了使用FastApi运行推理服务器的以下代码。在大约8小时内,我的RAM内存增加了4Gi。。更有趣的是,当我停止我的容器时,内存并没有清理干净。。例如,在运行Docker Container之前
今天的文章分享如下在 FastAPI 框架下,使用 pytest 来自动化测试数据库相关的接口,文章的最后给出全部代码。 最近越来越喜欢使用 FastAPI 来写后端服务了,因为它是 Pyth
Docker 学习 https://www.cnblogs.com/poloyy/p/15257059.html 项目结构 .├── app│ ├── __init__.py│ └
下面代码来自官方FastAPI tutorials page ,我无法理解这些语句(例如,name: str)。 from typing import Optional from fastapi im
我是网络通信的新手。我使用 ubuntu 并尝试学习 fastapi。但是,我认为很难理解如何格式化我打算发送回客户端的响应。 要发回的响应的规则是什么?如果您想发回自定义答案 - 例如两个图像文件
我正在尝试从文件中添加路由,但我事先并不知道实际的参数,因此我需要一个通用函数来通过 **kwargs 处理参数。 要添加路由,我正在使用 add_api_route,如下所示: from fasta
我按照此文档设置了一个用户: https://fastapi.tiangolo.com/advanced/security/http-basic-auth/ 但我只收到一个端点“/users/me”的
当我尝试从我的 postgre 数据库中获取一些数据并使用 fastapi 时出现此错误。 我不知道为什么会这样......但这是我的代码,谢谢你的帮助。 路线 @router.get("/fuent
我有一个与在 pycharm 中使用 uvicorn 的 FastAPI 有关的问题。我的项目具有以下结构: LearningPy | |-- apis -----|--modelser
我已经创建了一个登录路径,我在其中发布了我的表单数据并设置了一个 cookie。设置 cookie 后,我重定向到“/main”,在那里我得到 {detail:"Method Not Allowed"
当我使用 FastAPI 时,如何为网络服务指定基本路径? 换句话说 - FastAPI 对象是否有参数可以将端点和我定义的任何其他对象设置为不同的根路径? 例如,如果我的代码带有下面的虚假参数 ro
我是一名优秀的程序员,十分优秀!