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

时间:2014-12-22 03:40:51

标签: python flask

我按照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,这意味着烧瓶认为静态文件夹应该在那里。

我还在努力弄清楚要做什么。

6 个答案:

答案 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文件)仍在运行:请确保关闭并结束(终止)该过程。