在多个不同的站点上重用Python烧录代码

时间:2013-09-10 14:59:24

标签: python django performance flask wsgi

我有一个设置,我将有大约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. 部署一个UWSGI实例,该实例只有一个代码实例并处理不同的主机名:http://flask.pocoo.org/docs/patterns/appdispatch/

  4. 我要复制的代码旨在查询API并显示结果。这些网站之间的差异有两个:

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

    2. API查询。大多数较小的网站都是针对城镇。这意味着将略微修改来自这些网站的API请求,以便仅在该区域返回结果。

      • sitelondon.com可能会在API中仅查询默认情况下的项目
      • sitehtml.com可能会在API中查询默认情况下具有“html”关键字的项目
    3. 我的目标是用户的表现。我最初将在具有2GB RAM的服务器上运行这些应该是充足的。

2 个答案:

答案 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')

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

我希望这有帮助!