代码之家  ›  专栏  ›  技术社区  ›  dweeb

如何在有蓝图的烧瓶中提供静态文件

  •  0
  • dweeb  · 技术社区  · 6 年前

    我有一个Flask应用程序,运行良好,直到,由于增长,我决定模块化。新结构如下:

    ├── Dockerfile
    ├── README.md
    ├── app
    │   ├── __init__.py
    │   ├── config.py
    │   ├── cron.py
    │   ├── database.ini
    │   ├── db.py
    │   ├── db.sqlite3
    │   └── webapp
    │       ├── __init__.py
    │       └── routes.py
    ├── db.sqlite3
    ├── docker-compose.yml
    ├── error.log
    ├── gunicorn_config.py
    ├── rd.py
    ├── requirements.txt
    ├── static
    │   ├── css
    │   │   └── bootstrap.min.css
    │   ├── data.html
    │   ├── fonts
    │   │   ├── glyphicons-halflings-regular.eot
    │   │   ├── glyphicons-halflings-regular.svg
    │   │   ├── glyphicons-halflings-regular.ttf
    │   │   ├── glyphicons-halflings-regular.woff
    │   │   └── glyphicons-halflings-regular.woff2
    │   ├── images
    │   │   ├── ajax-loader.gif
    │   │   ├── gear.png
    │   │   ├── gear_small.png
    │   │   └── logo.png
    │   ├── index.html
    │   ├── js
    │   │   ├── app.js
    │   │   ├── bootbox.min.js
    │   │   ├── bootstrap.js
    │   │   ├── bootstrap.min.js
    │   │   └── npm.js
    │   ├── login.html
    │   ├── manage_users.html
    │   ├── register.html
    │   ├── reset_password.html
    │   ├── settings.html
    │   └── upload.html
    └── templates
        └── base.html
    

    __init__.py 对于webapp:

    from flask import Flask
    from app.config import DebugConfig
    from flask_sqlalchemy import SQLAlchemy
    from importlib import import_module
    from logging import basicConfig, DEBUG, getLogger, StreamHandler
    import os
    
    import uuid
    
    def register_blueprints(app):
        for module_name in (app.config['MODULES']):
            module = import_module('app.{}.routes'.format(module_name))
            app.register_blueprint(module.blueprint)
    
    def configure_logs(app):
        basicConfig(filename='error.log', level=DEBUG)
        logger = getLogger()
        logger.addHandler(StreamHandler())
    
    def create_app():
        file = (__file__)
        app = Flask(__name__)
        app.secret_key = str(uuid.uuid4())
        app.config.from_object(DebugConfig)
        register_blueprints(app)
        configure_logs(app)
    
        return app
    

    以下是登录页路由代码:

    @blueprint.route("/login", methods=["GET", "POST"])
    def login():
    
        if request.method == 'GET':
            return render_template(url_for('static', filename='login.html')
    

    很遗憾,当我尝试为应用程序提供服务时,此新结构会导致此错误:

    builtins.FileNotFoundError FileNotFoundError:[Errno 2]没有这样的文件

    我已经处理这个问题有一段时间了,只是不知道如何让应用程序工作并设法找到文件。我试着设置 static_url_path 在实例化flask应用程序时的值,但是,尽管这样可以找到HTML文件,但我无法加载CSS和图像等其他静态文件,因为我在HTML中定义了相对于静态文件夹的路径,如下所示:

    <link href="css/bootstrap.min.css?version=24" > <link rel="icon" href="/static/images/gear.png">

    1 回复  |  直到 6 年前
        1
  •  0
  •   TonyMoutaux    6 年前

    你要找的是 Flask jinja_loader .

    模板文件夹 使用呈现模板方法搜索文件的目录。

    def create_app():
        file = (__file__)
        app = Flask(__name__)
        app.secret_key = str(uuid.uuid4())
        app.config.from_object(DebugConfig)
        register_blueprints(app)
        configure_logs(app)
    
        # Overwrite Flask jinja_loader, using ChoiceLoader
        template_loader = jinja2.ChoiceLoader([
            app.jinja_loader,
            jinja2.FileSystemLoader('/path/to/static'),
        ])
        app.jinja_loader = template_loader
    
        return app
    

    所以首先进入app.jinja_loader:template_文件夹目录。 请注意,如果模板和静态目录中都有template something.html,则将返回第一个模板。

    但是Jinja2的装载机比CoiceLoader要多,你应该试着找到一个能满足你需求的装载机。例如 DictLoader