Python Flask,继续使用send_static_file获取404服务静态文件

Python Flask,继续使用send_static_file获取404服务静态文件,python,flask,Python,Flask,我按照他的指示去做,但还是没能让它工作 @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) 以下是我的项目结构: Project_path

我按照他的指示去做,但还是没能让它工作

@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)       
以下是我的项目结构:

Project_path  
 |
 +--app
 |  |
 |  +--main.py
 +--static
    |
    +--js
       |
       +--jquery-1.11.2.min.js
@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)       
下面是
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))
@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)       
当我访问
/
时,我可以看到屏幕上打印的javascript文件的正确路径
这是
Project\u path/static/js/jquery-1.11.2.min.js

@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)       
但是,我还是

127.0.0.1 - - [22/Dec/2014 11:26:30] "GET /js/jquery-1.11.2.min.js HTTP/1.1" 404 -
@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)       
感谢您的帮助

@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)       
编辑
在逐步执行
send\u static\u file
方法之后,我发现了发生了什么。基本上,我不应该使用abspath作为参数,flask在
send\u static\u file
中有一个判断:

if os.path.isabs(filename) or \
   filename == '..' or \
   filename.startswith('../'):
    raise NotFound()
@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)       
由于传入的
filename
是一个abspath,因此
NotFound()

似乎应该传入的是到
self.static\u文件夹的相对路径(self是
),在我的项目中,它是
project\u name/app/static
。但是,我自己没有设置
static\u folder
,这意味着flask认为静态文件夹应该在那里

@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)       

我还在想办法。

你忘了在最后一个
os.path中添加
'static'
。在
return
子句中加入

终于让它工作了。使用

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.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)       
从flask导入从\u目录发送\u
@app.route(“/js/”)
def SERVER_静态(文件名):
root\u dir=os.path.dirname(os.getcwd())
从_目录返回send_(os.path.join(root_dir,'static','js'),文件名)

现在我很清楚,flask真的很讨厌人们把
app.py
或者在我的例子中把
main.py
放到子目录中仅当您的静态文件夹是flask认为的文件夹,即与app.py位于同一目录中的名为
static
的文件夹时,才使用
send\u static\u file
,您只需将文件传递给启动器:

@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)       
静态url\u路径
–可用于为 web上的静态文件。默认为
static\u文件夹的名称
文件夹

@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)       
static\u文件夹
–包含静态文件的文件夹,应在 静态url路径。默认为的根路径中的“静态”文件夹 应用程序

@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)       

现在,flask将在
/foo/bar/zoo
中查找一个名为
static
的目录,从中提供静态文件。只有当您提供的媒体文件可能与静态文件不在同一位置时,才可以使用
send\u from\u directory

对我来说,这一点很有效:

@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)       

\uuuu init\uuuuu.py

中,您刚才添加的页面出现404错误的一个可能原因是您的脚本(.py文件)的早期版本仍在运行:确保关闭并结束(终止)进程

我原以为你是对的,但在添加了
静态
之后,它仍然给我404错误。你为什么要经历这些?Flask将自动提供静态文件。您不需要为它编写视图。@BurhanKhalid不太正确。如果为1,flask将自动提供静态文件。set src=“/static/js/xxx.js”;2.静态文件夹与
app.py
直接位于同一个文件夹中。对我来说,这个文件夹起作用了:@app.route('/static/')def serve_static(文件名):root_dir=os.path.dirname(os.getcwd())return send_from_目录(os.path.join(root_dir,'static',js'),文件名)我的项目的正确路径是什么?html中的
src
属性应该是什么?它是指向
static
父目录的完全限定路径,您不需要对src属性进行任何更改,它将与中的完全相同。因此它是
static\u url\u path=Project\u path/static/
src=“/js/jquery-1.11.2.min.js”
,对吗?不,删除
静态
部分,请阅读文档,文档中的解释比我在这些评论中的解释要好得多。经过多次测试,我确信如果我想将静态文件放在单独的文件夹(css、js等)中,仅通过修改
静态url路径
静态文件夹
是不可能的。在jinja2中为
使用
url\u会起作用,但那是另一回事。我在HTML代码中也以这种方式调用静态文件:您可以将root\u dir替换为“.”-
return send\u from\u directory(os.path.join(“.”、'static、'js')、filename)
这个答案不完全正确。对于蓝图,您可以设置另一个静态文件夹,该静态文件夹可以是任何名称。
@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)