我按照How to serve static files in 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
方法后,我会发现正在发生的事情。基本上,我不应该使用abspath作为参数,烧瓶在send_static_file
中有判断力:
if os.path.isabs(filename) or \
filename == '..' or \
filename.startswith('../'):
raise NotFound()
因为我传入的filename
是一个绝对路径,所以烧瓶NotFound()
似乎它应该传入的是self.static_folder
(自我是<Flask 'main'>
)的相对路径,在我的项目中,它是Project_name/app/static
。但是,我自己没有设置static_folder
,这意味着烧瓶认为静态文件夹应该在那里。
我还在努力弄清楚要做什么。
答案 0 :(得分:41)
终于搞定了。使用 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
或我的main.py
放入子目录的人。 仅当您的静态文件夹是烧瓶认为的文件夹时才使用send_static_file
,即名称为static
的文件夹与app.py 在同一目录中。
答案 1 :(得分:10)
您需要做的就是将static_url_path
parameter传递给发起人:
static_url_path
- 可用于指定不同的路径 网络上的静态文件。默认为static_folder
的名称 文件夹中。
static_folder
- 包含应该提供的静态文件的文件夹 static_url_path。默认为&#39;静态&#39;根路径中的文件夹 申请。
app = Flask(__name__, static_folder=os.path.abspath('/foo/bar/zoo/'))
现在,flask将在static
中查找名为/foo/bar/zoo
的目录,从中提供静态文件。如果您正在提供可能与静态文件不在同一位置的 media 文件,则只能使用send_from_directory
。
答案 2 :(得分:1)
您忘了在'static'
条款的最后os.path.join
中添加return
。
答案 3 :(得分:1)
对我来说这个有用:
@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
答案 4 :(得分:0)
你需要删除 -
if __name__ == "__main__":
app.run()
然后从main.py
重新添加。那为我修好了!
或检查你的apache文件,有时目录在那里不正确!
答案 5 :(得分:0)
您刚刚添加的页面(即使编程正确)的404错误的一个可能原因是,如果脚本的先前版本(.py文件)仍在运行:请确保关闭并结束(终止)该过程。