0

我有一个设置,我将有大约 50 个站点使用相同的代码,配置略有不同。与其一遍又一遍地部署相同的代码,在不同的文件夹和存储库中复制,Flask 中是否有任何方法可以将站点的工作代码集中为某种库?

在 Django 中,它们有点像这样:

https://docs.djangoproject.com/en/dev/ref/contrib/sites/

一些想法

  1. 部署 50 个 UWSGI 实例,复制相同的代码和不同的配置

  2. 部署 50 个 UWSGI 实例,将 python 代码添加为一种模块或扩展,因此只有一个代码实例:http: //flask.pocoo.org/docs/extensiondev/

  3. 部署 1 个 UWSGI 实例,它只有一个代码实例并处理不同的主机名:http: //flask.pocoo.org/docs/patterns/appdispatch/

我正在复制的代码旨在查询 API 并显示结果。这些站点之间的差异有两个方面:

  1. 模板 - 虽然网站看起来很相似,但它们不会完全相同。它们的 CSS 和图像会略有不同。

  2. API 查询。大多数较小的站点用于城镇。这意味着来自这些站点的 API 请求将稍作修改,以便仅返回该区域的结果。

    • 默认情况下,sitelondon.com 可能仅在伦敦查询 API 项目
    • sitehtml.com 可能会在 API 中查询默认具有“html”关键字的项目

我的重点是用户的性能。我最初将在具有 2GB RAM 的服务器上运行这些,这应该足够了。

4

2 回答 2

2

通常对于这些类型的场景,应用程序中构建了“基于主机的不同行为”逻辑。

所以更好的解决方案是#3,但我的建议是不要使用 app dispatch

构建逻辑以hostname直接在主应用程序中获取配置(例如,您可以在@before_request处理程序中加载专用配置并使用单个数据库实例)。如您所说,如果您打算只使用一台小型服务器,则此解决方案资源较少。

50 个具有自己进程的不同 uWSGI 实例将填满您的内存并轻松开始交换。

于 2013-09-10T15:15:46.450 回答
1

我同意@Paolo 的观点,即#3 是您的最佳选择。

您可以通过在 Web 服务器中重写 URL 来进一步简化它。如果您重写 URL,以便查询http://sitelondon.com/examplebecomehttp://sitelondon.com/london/example和查询http://sitehtml.com/examplebecome ,http://sitehtml.com/html/example那么您可以轻松地通过路由获取站点:

@app.route('/<site>/example')
def example(site):
    return render_template(site + '/example.html')

使用此设置,您可以根据站点名称在子文件夹中组织模板,然后选择正确的模板成为构建模板路径的问题。

我希望这有帮助!

于 2013-09-10T16:27:06.053 回答