【问题标题】:More than one static path in local Flask instance本地 Flask 实例中有多个静态路径
【发布时间】:2012-03-19 18:17:55
【问题描述】:

是否可以为我的本地开发 Flask 实例添加更多静态路径? 我希望有默认的static 文件夹来存储站点的 js/css/images 文件和另一个文件夹,例如designs 保留我的特定资产。如果有更好的解决方案,我不想将designs 文件夹放在static 中。

【问题讨论】:

    标签: python html flask


    【解决方案1】:

    我一直在使用以下方法:

    # Custom static data
    @app.route('/cdn/<path:filename>')
    def custom_static(filename):
        return send_from_directory(app.config['CUSTOM_STATIC_PATH'], filename)
    

    CUSTOM_STATIC_PATH 变量在我的配置中定义。

    在模板中:

    {{ url_for('custom_static', filename='foo') }}
    

    买者自保 - 我不确定它是否安全 ;)

    【讨论】:

    • 在我看来这是最自定义的版本,但您应该使用werkzeug.utils.secure_filename 来检查文件名。
    • 澄清任何人来'CUSTOM_STATIC_PATH'是我相信实际的文件夹名称路径。这不是一些特殊的键/变量....出于某种原因,我认为它是。
    • 实际上,@Eiyrioü,我采取了另一种方式,也让它工作。我按原样使用代码,并在我的配置文件中添加了一个CUSTOM_STATIC_PATH 变量。
    • 这里的cdn 是什么? &lt;path:filename&gt; 也应该按原样使用还是应该将filename 替换为实际的文件名?
    • @Jarus: flask.send_from_directory 已经检查文件名没有指向目录之外。 werkzeug.utils.secure_filename 用于安全命名新文件,与此处无关。我实际上认为它可以通过例如删除目录、空格和变音符号来破坏事物。
    【解决方案2】:

    您可以使用带有自己的静态目录的蓝图 http://flask.pocoo.org/docs/blueprints/

    蓝图

    blueprint = Blueprint('site', __name__, static_url_path='/static/site', static_folder='path/to/files')
    app.register_blueprint(blueprint)
    

    模板

    {{ url_for('site.static', filename='filename') }}
    

    【讨论】:

      【解决方案3】:

      如果我将图像存储在图像目录中,如下所示

      images/
        dir1/
          image1.jpg
        dir2/
          image2.jpg
      

      然后我们可以使用以下 url 访问这些图像: http://localhost:5000/images/dir1/image1.jpg 在以下代码的帮助下

      from flask import Flask, send_from_directory
      
      
      app = Flask(__name__, static_folder='main_static_dir')
      
      
      @app.route('/images/<path:filename>')
      def base_static(filename):
          return send_from_directory(app.root_path + '/images/', filename)
      
      
      if __name__ == '__main__':
          app.run(debug=True)
      

      【讨论】:

        【解决方案4】:

        对于任何想知道app.config['CUSTOM_STATIC_PATH'] 被设置为什么的人,我想扩展上面已接受的答案。

        在我的情况下,我需要一个 /.well-known 目录,所以这是我使用的:

        我在我的应用根目录中放置了一个名为 well-known 的新目录。
        我像这样设置了一个配置变量:

        CUSTOM_STATIC_PATH=app.root_path + '/well-known/'
        

        然后我就这样使用了这个变量:

        @app.route('/.well-known/<path:filename>')
        def wellKnownRoute(filename):
            return send_from_directory(app.config['CUSTOM_STATIC_PATH'], filename, conditional=True)
        
        

        设置conditional=True 是聪明的,这将对文件不存在的任何请求进行404。

        当然,如果您想知道为什么需要为 dir 路径设置配置值,那么您不需要。你总是可以只使用配置的值,而不是给你这个:

        @app.route('/.well-known/<path:filename>')
        def wellKnownRoute(filename):
            return send_from_directory(app.root_path + '/well-known/', filename, conditional=True)
        

        我的/.well-known URL 路径文件总是来自应用程序根目录/well-known 目录,因此没有必要让它变得更复杂。

        请注意,您最好通过设置额外的服务器块并从应用程序外部提供文件来从 nginx 或您正在使用的任何服务器处理这种特殊情况,我只需要为开发环境设置此设置用于测试。

        【讨论】:

          猜你喜欢
          • 2016-02-19
          • 1970-01-01
          • 1970-01-01
          • 2012-10-04
          • 1970-01-01
          • 1970-01-01
          • 2014-02-03
          • 1970-01-01
          • 2020-11-24
          相关资源
          最近更新 更多