我有一个设置,我将有大约50个站点使用相同的代码,配置略有不同。而不是一遍又一遍地部署相同的代码,在不同的文件夹和存储库中重复,Flask中是否有任何方法可以集中站点的工作代码,作为某种类型的库?
在Django,他们有类似的东西:
https://docs.djangoproject.com/en/dev/ref/contrib/sites/
一些想法
部署50个UWSGI实例,复制相同的代码和不同的配置
部署50个UWSGI实例,并将python代码添加为一种模块或扩展,因此只有一个代码实例:http://flask.pocoo.org/docs/extensiondev/
部署一个UWSGI实例,该实例只有一个代码实例并处理不同的主机名:http://flask.pocoo.org/docs/patterns/appdispatch/
我要复制的代码旨在查询API并显示结果。这些网站之间的差异有两个:
模板 - 虽然网站看起来很相似,但它们不会完全相同。它们的CSS和图像略有不同。
API查询。大多数较小的网站都是针对城镇。这意味着将略微修改来自这些网站的API请求,以便仅在该区域返回结果。
我的目标是用户的表现。我最初将在具有2GB RAM的服务器上运行这些应该是充足的。
答案 0 :(得分:2)
通常,对于这些类型的场景,应用程序中会内置“基于主机的行为不同”逻辑。
所以更好的解决方案是#3 ,但我的建议是不使用app dispatch 。
构建逻辑以直接在主应用程序中获取hostname
的配置(例如,您可以在@before_request
处理程序中加载专用配置并使用单个数据库实例)。
如果你打算只使用一个小型服务器,正如你所说,这个解决方案对资源很轻松。
50个不同的uWSGI实例及其自己的进程将填满你的记忆并开始轻松交换。
答案 1 :(得分:1)
我同意@Paolo的观点,#3是你最好的选择。
您可以通过网络服务器中的URL重写进一步简化它。如果您重写网址以使http://sitelondon.com/example
的查询变为http://sitelondon.com/london/example
,并且http://sitehtml.com/example
的查询变为http://sitehtml.com/html/example
,那么您可以轻松地通过路线获取该网站:
@app.route('/<site>/example')
def example(site):
return render_template(site + '/example.html')
使用此设置,您可以根据站点名称在子文件夹中组织模板,然后选择正确的模板就可以构建模板路径。
我希望这有帮助!