在Flask中找不到“静态”文件的正确路径

时间:2019-12-21 20:57:55

标签: python flask

运行Flask应用程序的时间非常长,在该应用程序中,我已将ProxyPass与Gunicorn和Apache一起使用,将站点的“根”更改为“子目录” URL。

我最终在https://example.com/flaskapp加载了网站,但是我所有的静态文件都返回404。网址结构的任何组合都不允许我在浏览器中查看文件(例如,.css文件)。

我有:

* flaskapp (project folder)
    * app (main folder)
        * __init__.py
        * views.py
        * controllers.py
        * static
        * templates
    * venv
    * requirements.txt

我用gunicorn app:app -b 0.0.0.0:8000

发射金枪鱼

我的 init .py文件包含:

from flask import Flask

import logging
from logging.config import dictConfig

dictConfig({
    'version': 1,
    'formatters': {'default': {
        'format': '[%(asctime)s] %(levelname)s in %(module)s: %(message)s',
    }},
    'handlers': {'wsgi': {
        'class': 'logging.StreamHandler',
        'stream': 'ext://flask.logging.wsgi_errors_stream',
        'formatter': 'default'
    }},
    'root': {
        'level': 'DEBUG',
        'handlers': ['wsgi']
    }
})

logger = logging.getLogger(__name__)

if __name__ == '__main__':
    gunicorn_logger = logging.getLogger('gunicorn.debug')
    logger.handlers = gunicorn_logger.handlers
    logger.setLevel(gunicorn_logger.level)

# Initialize the app
app = Flask(__name__, instance_relative_config=True, static_url_path='', static_folder='static')

# Load the config file
app.config.from_pyfile('app.cfg')

from app import controllers
from app import views

if __name__ == '__main__':
    app.run(host='0.0.0.0', port=8000, debug=app.config['DEBUG'])

在我的一个html文件中,这是我尝试包含.css文件的方式:

<link href="{{ url_for('static', filename='lib/font-awesome/css/font-awesome.css') }}" rel="stylesheet">

因为该网站以root用户身份在“ / flaskapp”运行,所以我认为URL出了点问题,或者我没有为静态路由正确设置。

编辑:这是我在Apache中设置.conf以进行代理的方式

ProxyPreserveHost On
ProxyPass /flaskapp http://localhost:8000/
ProxyPassReverse /flaskapp http://localhost:8000/
Timeout 2400
ProxyTimeout 240

正确设置该怎么办?

2 个答案:

答案 0 :(得分:2)

这是我的代码,用于加载静态文件并将其缓存到内存中

STATIC_FILE = {}
def load_file(file_name):
    ext = file_name.split(".")[-1]
    if file_name not in STATIC_FILE:
        with open("./public{}".format(file_name), 'rb') as file:
            STATIC_FILE[file_name] = file.read()
    return STATIC_FILE[file_name]

MIME_TYPE = {"js": "text/javascript", "css": "text/css", "png": "image/png", "woff": "font/woff", "woff2": "font/woff2"}
@app.route('/assets/<path:path>')
def assets(path):
    ext = path.split("/")[-1].split(".")[-1]
    return Response(load_file(path), mimetype=MIME_TYPE[ext])

// access via /assets/css/style.css if your file in ./public/assets/css/style.css

答案 1 :(得分:0)

我似乎已经从我的主应用程序初始化行中删除了多余的参数来解决了这个问题:

app = Flask(__name__, instance_relative_config=True)

然后,当在html中引用时,我只是使用了:

<link href="static/lib/font-awesome/css/font-awesome.css" rel="stylesheet">

这似乎可以解决问题。我不确定为什么“从子域运行”会把我甩得那么多。