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, иногда каталог там неправильный!