我不认为我的问题是特定于FastAPI的,但更多的是Python-virtualenv通用的,但这里是我使用FastAPI的例子。
我从Pipenv设置的虚拟环境中运行FastAPI,我希望它仅为开发目的提供静态文件。我知道这是通过适当的生产部署来解决的,我将为此使用适当的web服务器,但我下面的问题是关于开发环境的。
文件结构如下:
├── frontend <-- frontend code dir
│ ├── dist <-- frontend build output (static files)
│ ├── public
│ └── [..]
├── Pipfile <-- contains 'myproject = {editable = true, path = "."}' as dep
├── Pipfile.lock
├── setup.cfg
├── setup.py
├── myproject <-- backend code dir
│ ├── web.py <-- fastapi file
│ └── [...]
└── [...]
myproject/web.py
:
import fastapi
app = fastapi.FastAPI()
app.mount("/", fastapi.staticfiles.StaticFiles(
directory="/absolute/path/to/frontend/dist"),
name="static",
)
运行FastAPI dev server withpipenv run uvicorn myproject.web:app --reload
.
现在工作,但我想避免这个绝对路径在我的公共源代码。任何相对路径都不起作用,因为它似乎是相对于Pipenv创建的虚拟环境中的安装路径,这是不确定的。__file__
路径也是如此;它在一个虚拟环境中
我还考虑将静态数据作为数据文件添加到Python包中,并从pkg_resources
(例如pkg_resources.resource_filename('myproject', 'data/')
)提供的目录中加载它,但我不打算将静态数据与Python包一起发布到生产环境中,因此感觉有点粗糙。
是否有可能通过相对路径链接到这里的正确目录,或者您是否有另一个聪明的想法,以便在开发团队中共享项目(或在GitHub上公开)稍微好一点?
因为你想灵活地从它将运行的位置和静态的位置是不相关的,任何恒定的相对路径都不能工作。
我会选:
- 通过一些启发式方法发现静态点,例如走回某个已知的"锚点";目录(根目录?)
我曾经做过这样的事情,甚至将找到的绝对路径结果缓存到一些持久的临时文件中,所以这个发现只会在每台机器上发生一次(除非位置移动或临时缓存文件被删除)。
- 将静态位置设置为服务器启动时的config/command-line/both参数