【问题标题】:Define static file directory per route (URL) in flask在烧瓶中定义每个路由(URL)的静态文件目录
【发布时间】:2020-01-19 22:49:07
【问题描述】:

我有几个文件:1.html2.html 等包含以下内容:

1.html有

<h1>Hello</h1>
<img src="1-directory/image.jpg" />

2.html有

<h1>Hello</h1>
<img src="2-directory/image.jpg" />

等等

因此,每个文件在&lt;i&gt;-directory/ 中都有一个图像(i 变化:1、2、3,...)。 如何在烧瓶中为每个文件加载这些图像。

我的路线是:

@app.route('/docs/show/<int:i>')
def show(i):
    with open(i + '.html', 'r') as f:
        content = f.read()
        return render_template('show.html', content = content)

我的模板 show.html

{content | safe}

所以,我想在烧瓶中为每个文件设置&lt;i&gt;-directory,然后显示相应的图像。

【问题讨论】:

    标签: python-3.x flask static-files


    【解决方案1】:

    您必须创建静态文件夹,然后必须将所有文件夹与图像一起添加。你可以按照这个目录结构:

    PROJECT NAME
    >> static
      >> 1-directory
          >> 1.jpg
      >> 2-directory
          >> 2.jpg
      >> 3-directory
          >> 3.jpg
      >> 4-directory
          >> 4.jpg
    >> templates
      >> 1.html
      >> 2.html
      >> 3.html
      >> 4.html
      >> show.html
    >> venv folder
    >> app.py
    

    您可以将此代码用于app.py

    import flask
    
    app = flask.Flask(__name__)
    
    @app.route('/docs/show/<string:i>', methods=['GET'])
    def show(i):
        with open('templates/' + str(i) + '.html', 'r') as f:
            content = f.read()
        return flask.render_template('show.html', content = content)
    
    if __name__=='__main__':
        app.run('0.0.0.0',port=<your_port_name>)
    

    1.html可以保留如下:

    <h1>Hello</h1>
    <img src="/static/1-directory/1.jpg" />
    

    2.html可以保留如下:

    <h1>Hello</h1>
    <img src="/static/2-directory/2.jpg" />
    

    3.html可以保留如下:

    <h1>Hello</h1>
    <img src="/static/3-directory/3.jpg" />
    

    4.html可以保留如下:

    <h1>Hello</h1>
    <img src="/static/4-directory/4.jpg" />
    

    而且,您可以在 show.html 中显示您的代码(与您显示它的方式相同):

    <html>
    <body>{{content | safe}}</body>
    </html>
    

    编辑(根据您的 cmets):

    我根据您的 cmets 以下列方式创建了文件结构:

    PROJECT NAME
    >> templates
      >> 1-directory
          >> 1.jpg
      >> 2-directory
          >> 2.jpg
      >> 3-directory
          >> 3.jpg
      >> 4-directory
          >> 4.jpg
      >> 1.html
      >> 2.html
      >> 3.html
      >> 4.html
      >> show.html
    >> venv folder
    >> app.py
    

    您可以像这样为 app.py 编写代码:

    @app.route('/docs/show/<string:i>', methods=['GET'])
    def show(i):
        internal_html = flask.render_template(str(i)+'.html', file_name = str(i)+'-directory/'+str(i)+'.jpg')
        return flask.render_template('show.html', content = internal_html)
    
    @app.route('/serve_file/<path:filename>')
    def serve_file(filename):
        return flask.send_from_directory('templates/', filename)
    

    您所有的 HTML 文件将如下所示:

    <h1>Hello</h1>
    <img src="{{ url_for('serve_file', filename=file_name) }}" />
    

    此外,您的 show.html 将与上述代码相同。 在这里,我们使用这个 send_from_directory,因为烧瓶不提供 /static 文件夹以外的服务。因此,对于文件夹的外部使用,我们必须使用 send_from_directory

    【讨论】:

    • 感谢您的努力,但我在同一个目录中,文件和静态文件。类似:ls docs:1.html, 1-directory/1.jpg, 2.html, 2-directory/2.jpg 我可以创建指向目录的符号链接以拥有static 目录,但这很乏味!
    • 请检查EDIT 部分,我已经检查了代码,它对我来说工作正常。让我知道这是否适合您。
    • 我可以用&lt;img src="/templates/filename" /&gt;代替&lt;img src="{{ url_for('serve_file', filename=file_name) }}" /&gt;吗?
    【解决方案2】:

    我不知道有什么方法可以“在烧瓶中”完成。无论如何,我可以想到几种您希望手动执行此操作的方法(验证、授权、安全)。

    但要回答这个问题,有几种方法可以解决,具体取决于您希望解决方案有多“神奇”。 (我假设如果你想要烧瓶来处理它,那么你想要魔法)

    一种解决方案是装饰器,将加载的 sn-p 作为新参数注入到视图函数中。

    import functools
    
    def inject_snippet(func):
        @functools.wraps(func)
        def wrapper(i, *args, **kwargs):
            filepath = f"{i}-directory/{i}.html"
            with open(filepath) as f:
                snippet = f.read()
                return func(snippet, *args, **kwargs)
        return wrapper
    
    
    @app.route('/docs/show/<int:i>')
    @inject_snippet
    def show(snippet):
        return render_template('show.html', content=snippet)
    

    【讨论】:

    • 但是它是如何工作的呢?此代码如何显示图像i-directory/image.jpgf"{i}-directory/{i}.html" 真的是{i}.html
    • 错误:[Errno 2] No such file or directory: '{i}/{i}.html'。我的代码是here,我的文件是here
    猜你喜欢
    • 2022-01-23
    • 1970-01-01
    • 2017-09-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-11-22
    • 1970-01-01
    相关资源
    最近更新 更多