fastapi-amis-admin
fastapi-amis-admin copied to clipboard
怎么提供离线版本的?
trafficstars
怎么离线使用,有cdn太慢了,希望能在不联网的条件下使用有什么办法?
这样离线,其中 amis.html 从源代码里面拷贝,static 中的文件逐个下载即可。
from starlette.requests import Request
from fastapi.responses import HTMLResponse, JSONResponse, Response
from fastapi_amis_admin.amis.components import Page
from fastapi_amis_admin.admin.site import AdminSite as _AdminSite
from fastapi_amis_admin.amis.types import BaseAmisApiOut
from fastapi_amis_admin.utils.translation import i18n as _
from fastapi_amis_admin.amis.components import App
from pydantic.utils import deep_update
import os
class OfflineAdminSite(_AdminSite):
""" 支持离线跑 fastapi-amis-admin"""
template_path = os.path.join(os.path.dirname(os.path.realpath(__file__)), 'amis.html')
async def get_page(self, request: Request) -> App:
app: App = await super().get_page(request)
# 去掉版权信息
app.header = None
app.footer = None
return app
async def page_parser(self, request: Request, page: Page) -> Response:
""" 离线化处理 """
if request.method == "GET":
result = page.amis_html(
template_path=self.template_path,
locale=_.get_language(),
cdn=self.site.settings.amis_cdn,
pkg=self.site.settings.amis_pkg,
theme=self.site.settings.amis_theme,
site_title=self.site.settings.site_title,
site_icon=self.site.settings.site_icon,
)
result = HTMLResponse(result)
else:
data = page.amis_dict()
if await request.body():
data = deep_update(data, (await request.json()).get("_update", {}))
result = BaseAmisApiOut(data=data)
result = JSONResponse(result.dict())
return result
初始化这样做, 其他按教程走
from sqlalchemy_database import Database
site = OfflineAdminSite(settings=Settings(amis_cdn='/static',
amis_pkg='[email protected]'),
engine=Database(engine=engine)) # 不套一层 Database 就会出现数据修改失效的情况
没那么复杂,只需要把settings里的amis_cdn改成相对路径,比如/static,准备一个目录,把amis,history,vue(虽然不知道有什么用)这三个npm库对应版本文件按对应目录命名好放到里面,可以看本项目的模板app.html,也可以实际看chrome请求了哪些静态文件。到 http://npmmirror.com 下载。
然后在FastApi里面mount对应的目录到/static
https://fastapi.tiangolo.com/zh/tutorial/static-files/
或者如果外层有Nginx,加一条 location ^~ /static/ 指向这个目录也行。