提供烧瓶中的.html和.css目录,无需指定每个带路径的文件

时间:2015-07-16 18:46:12

标签: flask

如何在烧瓶中提供.html和.css目录?我的目录结构如下所示:

./docs/             # contains html
./docs/_static      # contains .css and images

我想用路线指定./docs/index.html文件:

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

并且可以访问包含在./docs中的index.html的所有链接,而无需使用@ app.route明确指定它们。是否/如何做到这一点的任何想法?

谢谢!

2 个答案:

答案 0 :(得分:1)

您必须将所有静态文件放在名为static的文件夹中,并将所有模板放在名为templates的文件夹中。所以你的文件夹结构应如下所示:

/docs/static/here_your_css_and_js_files
/docs/templates/here_your_html_files

要在您的html中加入.css.js个文件,您必须在html文件的头部添加:

<link rel="stylesheet" type="text/css" href="{{ url_for('static', filename='style.css') }}">

如果您将.html文件放在templates目录中,则会自动创建evalWithTimeout个文件。

答案 1 :(得分:0)

您可以动态创建路线,甚至可以创建自定义视图并浏览docs目录并设置自定义路径和模板名称。这样的事情对你有用:

import os
from flask import Flask, render_template
from flask.views import View

HOME_BASE = os.path.dirname(os.path.abspath(__file__))
TEMPLATE_BASE = os.path.join(HOME_BASE, 'templates')
TEMPLATE_BASE_LEN = len(TEMPLATE_BASE)

class CustomTemplateView(View):

    def __init__(self, template_name):
        self.template_name = template_name

    def dispatch_request(self):
        return render_template(self.template_name)

app = Flask(__name__)

for root, dirs, files in os.walk(os.path.join(TEMPLATE_BASE, 'docs')):
    for file in files:
        if file.endswith('.html'):
            template_name = os.path.join(root, file)[TEMPLATE_BASE_LEN:]
            doc_path = os.path.splitext(template_name)[0]
            app.add_url_rule(doc_path, view_func = CustomTemplateView.as_view(
                doc_path.replace('/', '_'), template_name = template_name[1:]))

此代码假定您的docs目录布局如下所示:

yourproject/__init__.py
yourproject/templates/docs/403.html
yourproject/templates/docs/404.html
yourproject/templates/docs/accounts/add.html
yourproject/templates/docs/accounts/edit.html
yourproject/templates/docs/accounts/groups/template1.html
yourproject/templates/docs/accounts/index.html
yourproject/templates/docs/accounts/users/index.html
yourproject/templates/docs/accounts/users/template1.html
yourproject/templates/docs/accounts/users/template2.html
...

上面的代码应该进入__init__.py文件。