Templates 允许用户更改模板的最佳方式是什么?

Templates 允许用户更改模板的最佳方式是什么?,templates,static-files,Templates,Static Files,在我的一个项目中,我的用户将拥有我的网站({username}.example.org)的一个专用部分。在该子域中,我计划允许他们轻松地更改设计。 我看了一些已经在做这件事的在线网站,比如,和 关于这个应用程序的语言,我从Django开始,我成功地实现了“基于url名称的模板呈现,默认为回退”(http://someuser.example.com 将在templates/someuser/*或templates/generic/*中加载模板(如果在第一个文件中找不到)。 但我可以将它导出到PH

在我的一个项目中,我的用户将拥有我的网站({username}.example.org)的一个专用部分。在该子域中,我计划允许他们轻松地更改设计。 我看了一些已经在做这件事的在线网站,比如,和

关于这个应用程序的语言,我从Django开始,我成功地实现了“基于url名称的模板呈现,默认为回退”(http://someuser.example.com 将在templates/someuser/*或templates/generic/*中加载模板(如果在第一个文件中找不到)。 但我可以将它导出到PHP或Play!框架,如果它们更适合我的需要

使用的模板引擎非常简单,因为它与Django模板引擎一样简单、易学且安全(没有Python代码可以(通常应该!)执行)

下面是我找到的每个解决方案的优缺点。我真的很感激你的想法,你会怎么做,为什么。谢谢

注意:用户将对HTML/CSS有很好的了解

更改变量(如标题颜色等)

  • 优点:

  • 简单安全
  • 缺点:

  • 由于太有限,想要个性化其网站的用户无法使用此解决方案
仅上传CSS

  • 优点:

  • 易于集成
  • 稳妥
  • 缺点:

  • 有限的
  • 用户图像存储在哪里?(徽标、背景、一些渐变等)
允许用户编辑模板(存储在数据库中)

  • 优点:

  • 变化更重要
  • 用户(几乎)可以随心所欲(实现GA、FeedBurner等)
  • 缺点:

  • 他们把静态文件(徽标、背景图像、一些特殊效果(渐变))放在哪里
  • 模板存储在数据库中,每个显示的页面都需要一个SQL请求
允许用户编辑模板(存储在文件中)

  • 优点:

  • 变化更重要
  • 用户(几乎)可以随心所欲(实现GA、FeedBurner等)
  • 可以启用FTP访问,使用户在其模板目录中生根
  • 缺点:

  • 静态文件也有同样的问题
另外,我遇到的问题是如何处理静态文件(图像、css、js):我看不出如何在Apache(或NGinx)中定义一个VirtualHost来请求数据库查看哪些用户属于这个url


谢谢你的帮助,我很感激

好的,我会根据我所做的和我的研究来回答我自己

正如Steve提到的,在让用户定制页面布局时必须非常小心

必须对风险进行良好评估

在我的例子中,允许用户更改完整的HTML/CSS/JS是可能的,在某种程度上,就像或确实是这样

风险是:

  • 用户可以添加一个javascript代码来收集其他用户的身份验证cookie。这样,该用户就可以访问其他用户的管理部分的任何令牌身份验证。一个简单的解决方案是避免管理员部分和用户网站之间的交叉cookie
  • 用户可以尝试在模板中执行代码,如Python、PHP、Java、Ruby等(关于使用的内容)。这里的解决方案是使用一个模板引擎,它完全不允许使用代码,只允许使用标记。对于python来说,这是一个完美的选择
如果这两个条件得到了很好的评估,那么选项“允许用户编辑模板(存储在数据库中)”是一个很好的解决方案

但是,如果您担心数据库可能有太多点击,最后一个解决方案,即“允许用户编辑模板(存储在文件中)”,可能是可行的,前提是:

  • 确保用户无法访问他可以访问的模板目录的其他文件夹。您可以通过设置一个FTP服务器来实现这一点,该服务器使用数据库进行用户访问(如ProFTPd with MySQL),并在其模板目录中显示用户。配额设置也非常重要,以避免用户将其模板目录用作库存设备;)

嗯,我想我解决了整个问题。我可能遗漏了一些要点,如果是这样的话,请添加评论或新帖子,我将完成回答。

您必须非常小心让用户自定义页面布局(使用原始HTML)当你以后想要重新设计基础站点时,你可能会遇到一个令人头疼的支持问题。我想了想,这就是为什么我选择了一个模板引擎(Jinja2,我更新了我的帖子)。那你建议做什么?我需要允许他们改变整个设计,以满足他们的需要,并添加新的页面(平面的)。我有点卡住了:/