Python Flask,使用 send_static_file 继续获取 404 服务静态文件
声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow
原文地址: http://stackoverflow.com/questions/27596297/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me):
StackOverFlow
Flask, Keep getting 404 serving static files using send_static_file
提问by laike9m
I followed the instructions from How to serve static files in Flask, but still couldn't get it working.
我按照如何在 Flask 中提供静态文件的说明进行操作,但仍然无法正常工作。
Here's my project structure:
这是我的项目结构:
Project_path
|
+--app
| |
| +--main.py
+--static
|
+--js
|
+--jquery-1.11.2.min.js
Here's main.py
:
这是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))
Here's index.html
:
这是index.html
:
...
<script type="text/javascript" src="/js/jquery-1.11.2.min.js"></script>
...
And when I visit /
, I could see the correct path of javascript file printed on the screen
which is Project_path/static/js/jquery-1.11.2.min.js
.
当我访问时/
,我可以看到屏幕上打印的 javascript 文件的正确路径
是Project_path/static/js/jquery-1.11.2.min.js
.
But still, I got
但是,我还是得到了
127.0.0.1 - - [22/Dec/2014 11:26:30] "GET /js/jquery-1.11.2.min.js HTTP/1.1" 404 -
Any help is appreciated.
任何帮助表示赞赏。
EDIT
After stepping through the send_static_file
method, I find out what's going on. Basically, I shouldn't use abspath as argument, flask has a judgement in send_static_file
:
编辑
在逐步完成该send_static_file
方法后,我发现了发生了什么。基本上,我不应该使用 abspath 作为参数,flask 有一个判断send_static_file
:
if os.path.isabs(filename) or \
filename == '..' or \
filename.startswith('../'):
raise NotFound()
And since the filename
I passed into is a abspath, flask raise NotFound()
.
It seems that what it supposed to be passed in is a relative path to self.static_folder
(self is <Flask 'main'>
), which, in my project, is Project_name/app/static
. However, I didn't set static_folder
myself which means flask thinks the static folder should be there.
由于filename
I 传入的是一个 abspath,因此 flask raise NotFound()
。
似乎它应该传入的是self.static_folder
(self is <Flask 'main'>
)的相对路径,在我的项目中,它是Project_name/app/static
. 但是,我没有设置static_folder
自己,这意味着 Flask 认为静态文件夹应该在那里。
I'm still trying to figure out what to do.
我仍在努力弄清楚该怎么做。
采纳答案by laike9m
Finally got it working. use flask.send_from_directory
终于让它工作了。用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)
It is now clear to me that flask really hate people putting app.py
or in my case main.py
into a subdirectory. Use send_static_file
only if your static folder is what flask thinks to be, i.e. a folder with name static
in the same directory with app.py.
现在我很清楚,flask 真的很讨厌人们将app.py
或在我的情况下main.py
放入子目录。仅当您的静态文件夹是flask 认为的文件夹时才使用send_static_file
,即名称static
与 app.py 位于同一目录中的文件夹。
回答by Antoine Catton
You forgot to add 'static'
in the last os.path.join
in the return
clause.
您忘记在子句'static'
的最后添加。os.path.join
return
回答by Burhan Khalid
All you need to do is, pass the static_folder
parameterto the initiator:
您需要做的就是将static_folder
参数传递给启动器:
static_url_path
– can be used to specify a different path for the static files on the web. Defaults to the name of thestatic_folder
folder.
static_folder
– the folder with static files that should be served at static_url_path. Defaults to the 'static' folder in the root path of the application.
static_url_path
– 可用于为网络上的静态文件指定不同的路径。默认为static_folder
文件夹的名称。
static_folder
– 包含应该在 static_url_path 提供的静态文件的文件夹。默认为应用程序根路径中的“静态”文件夹。
app = Flask(__name__, static_folder=os.path.abspath('/foo/bar/zoo/'))
Now, flask will look for a directory named static
in /foo/bar/zoo
from where to serve static files. You only use send_from_directory
if you are serving mediafiles which may not be in the same location as static files.
现在,flask 将寻找一个名为static
in的目录,/foo/bar/zoo
从哪里提供静态文件。仅send_from_directory
当您提供的媒体文件可能与静态文件不在同一位置时才使用。
回答by alone
for me this one worked :
对我来说,这个有效:
@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)
beside adding this script into init
除了将此脚本添加到init
app._static_folder = os.path.abspath("static/")
app = Flask(__name__)
into __init__.py
进入 __init__.py
回答by bob
One possible cause of 404 error for pages you just added (even if programmed correctly), is if you have previous versions of the script (.py file) still running: make sure to close out and end (terminate) the process.
您刚刚添加的页面(即使编程正确)出现 404 错误的一个可能原因是,如果您的脚本(.py 文件)的先前版本仍在运行:确保关闭并结束(终止)进程。