fastapi-amis-admin icon indicating copy to clipboard operation
fastapi-amis-admin copied to clipboard

怎么提供离线版本的?

Open EchoShoot opened this issue 2 years ago • 1 comments
trafficstars

怎么离线使用,有cdn太慢了,希望能在不联网的条件下使用有什么办法?

EchoShoot avatar Sep 22 '23 06:09 EchoShoot

这样离线,其中 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 就会出现数据修改失效的情况

EchoShoot avatar Oct 05 '23 07:10 EchoShoot

没那么复杂,只需要把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/ 指向这个目录也行。

oubeichen avatar Aug 07 '24 08:08 oubeichen