Flask, продолжайте получать 404 статических файлов, используя send_static_file

Я выполнил инструкции из " Как обслуживать статические файлы в Flask", но все равно не мог заставить его работать.

Здесь моя структура проекта:

Project_path  
 |
 +--app
 |  |
 |  +--main.py
 +--static
    |
    +--js
       |
       +--jquery-1.11.2.min.js

Здесь main.py:

@app.route('/js/<path:path>')
def serve_static(path):
    root_dir = os.path.dirname(os.getcwd())
    print(os.path.join(root_dir, 'static', 'js', path))
    return app.send_static_file(os.path.join(root_dir, 'static', 'js', path))

Здесь index.html:

  ...
  <script type="text/javascript" src="/js/jquery-1.11.2.min.js"></script>
  ...

И когда я нахожусь в /, я вижу правильный путь к файлу javascript, напечатанному на экране
который является Project_path/static/js/jquery-1.11.2.min.js.

Но все же я получил

127.0.0.1 - - [22/Dec/2014 11:26:30] "GET /js/jquery-1.11.2.min.js HTTP/1.1" 404 -

Любая помощь приветствуется.

РЕДАКТИРОВАТЬ
После send_static_file метода send_static_file я узнаю, что происходит. В принципе, я не должен использовать abspath как аргумент, флэшка имеет суждение в send_static_file:

if os.path.isabs(filename) or \
   filename == '..' or \
   filename.startswith('../'):
    raise NotFound()

И так как filename я перешел, является абспутом, фляжка поднимает NotFound().
Кажется, что он должен быть передан в относительный путь к self.static_folder (self <Flask 'main'>), который в моем проекте является Project_name/app/static. Тем не менее, я не ставил static_folder сам, что означает, что static_folder считает, что статическая папка должна быть там.

Я все еще пытаюсь понять, что делать.

Ответы

Ответ 1

Наконец, он работал. использовать flask.send_from_directory

from flask import send_from_directory

@app.route('/js/<path:filename>')
def serve_static(filename):
    root_dir = os.path.dirname(os.getcwd())
    return send_from_directory(os.path.join(root_dir, 'static', 'js'), filename)

Теперь мне ясно, что app.py действительно ненавидят, что люди кладут app.py или в моем случае main.py в подкаталог. Используйте send_static_file только если ваша статическая папка - это то, что, по-видимому, представляет собой фляжка, то есть папка с именем static в том же каталоге с app.py.

Ответ 2

Все, что вам нужно сделать, это static_url_path параметр static_url_path инициатору:

static_url_path - может использоваться для указания другого пути для статических файлов в сети. По умолчанию используется имя папки static_folder.

static_folder - папка со статическими файлами, которая должна обслуживаться в static_url_path. По умолчанию используется папка "static" в корневом каталоге приложения.

app = Flask(__name__, static_folder=os.path.abspath('/foo/bar/zoo/'))

Теперь, flask будет искать каталог с именем static в /foo/bar/zoo где будут храниться статические файлы. Вы используете send_from_directory только в send_from_directory случае, если вы обслуживаете мультимедийные файлы, которые могут находиться не в том же месте, что и статические файлы.

Ответ 3

Вы забыли добавить 'static' в последнем os.path.join в предложение return.

Ответ 4

для меня это работало:

@app.route('/static/<path:filename>')
def serve_static(filename):
    root_dir = os.path.dirname(os.getcwd())
    return send_from_directory(os.path.join(root_dir, 'static', 'js'),   filename)       

рядом с добавлением этого скрипта в init

app._static_folder = os.path.abspath("static/")
app = Flask(__name__)

в __init__.py

Ответ 5

вам нужно удалить -

if __name__ == "__main__":
    app.run()

затем добавьте его из main.py Это исправило это для меня!

или проверьте свой файл apache, иногда каталог там неправильный!