0

我正在使用 python-flask 编写一个网站,但遇到了一些问题。我的目的是每个用户都可以编写一个主题。我已经解决了主题引擎部分。我的问题从目录开始。

我们所知道的烧瓶中有两个名为templates和的目录static。当用户上传他/她的主题时,我应该将它放入templates还是static

在用户上传的主题中,有assets(js etc.)和文件。html如果我将它们放入templates目录中,我将无法访问这些css,js etc.文件。

否则,如果我将它们放入static文件夹,jinja2 找不到html文件,有些人说不要将html文件放入静态文件夹。

现在我该怎么办?我应该添加另一个名为 的文件夹userthemes etc.吗?

现在,我的目录是这样的:

/python
   /static
   /templates
     login.html
     admin_page.html
   app.py

index.html用户上传他/她的主题时会出现。如果你能提供帮助,我会很高兴。谢谢。

4

1 回答 1

2

我承认这个问题是在一年前提出的,但问题仍然存在。Flask-Themes 到目前为止还不起作用..因此我必须自己找到一种方法来完成它。

其实这是一个微不足道的过程。

一个干净的结构是以后维护的必要条件(即使它是一个作者的项目)。

因此,尝试调整 Özcan 的结构,以获得多模板配置,我们可以有这样的结构:

/python
_ _ _ _app.py
_ _ _ _config.py
______/templates
________________/default
_ _ _ _ _ _ _ _ _ _ _ _index.html
________________/custom
_ _ _ _ _ _ _ _ _ _ _ _index.html

我不知道他的应用程序文件上有什么代码,但我想在app.py中有这样的东西:

from flask import Flask, render_template

import config
app = Flask(__name__, template_folder='/templates/' + config.Config.ACTIVE_THEME)

@app.route('/')
def main():
  return render_template('index.html')

if '__name__' == '__main__':
  app.run()

config.py 是这样的:

class Config(object):
    ACTIVE_THEME='default'

模板文件夹中的默认主题 index.html可能如下所示:

<head>
  # We have the ability to include the css from the current path instead of having a separate static folder
  <style type='text/css'> {% include 'style.css' %} </style>
</head>
<body>
    <h1> This is the "default" theme </h1>
</body>

自定义主题 index.html 如下所示:

<head>
  <style type='text/css'> {% include 'style.css' %} </style>
</head>
<body>
    <h1> This is the "custom" theme </h1>
</body>

现在,访问127.0.0.1:5000将显示“这是“默认”主题”,因为实际上已加载默认主题。

要更改此设置,您必须按以下方式编辑配置文件:

class Config(object):
    # Set ACTIVE_THEME from default to custom
    ACTIVE_THEME='custom'

保存更改,重新加载页面,您应该会看到“这是“自定义”主题”。

这是一个非常基本的“hack”,但如果您对您的应用程序很认真,我建议您使用蓝图,除此之外,还有必须维护 2 个配置文件而不是一个配置文件的不便。

为了避免这些问题,我使用了蓝图和应用程序的良好结构。

例如,我在应用程序初始化后定义配置,所以不是这样:

import config
app = Flask(__name__, template_folder=/templates/' + config.Config.ACTIVE_THEME)

它是这样的:

app = Flask(__name__)
app.config.from_object('config.Config')

在包含所有视图的单独文件中,顶部的以下行:

# doing an "import app" would raise an error because of it being a circular import
import config
active_theme = config.Config.ACTIVE_THEME

# Watch out for the second argument as it seems to add a prefix to successive defined arguments. In fact you could swap the "themes" part to it and remove it from the third argument, but I prefer to leave it like this to avoid future headaches.
posts = Blueprint('posts', '', template_folder='templates/' + active_theme + '/post')

它还可以通过其他方式进行扩展,例如用户会话、数据库配置等。

希望这可以帮助某人。

于 2014-04-28T13:37:03.247 回答