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

lai*_*e9m 28 python flask

我按照如何在Flask中提供静态文件的说明,但仍然无法使其工作.

这是我的项目结构:

Project_path  
 |
 +--app
 |  |
 |  +--main.py
 +--static
    |
    +--js
       |
       +--jquery-1.11.2.min.js
Run Code Online (Sandbox Code Playgroud)

这是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))
Run Code Online (Sandbox Code Playgroud)

这是index.html:

  ...
  <script type="text/javascript" src="/js/jquery-1.11.2.min.js"></script>
  ...
Run Code Online (Sandbox Code Playgroud)

而当我访问/,我可以看到在屏幕上打印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 -
Run Code Online (Sandbox Code Playgroud)

任何帮助表示赞赏.

编辑
在逐步完成该send_static_file方法之后,我会发现发生了什么.基本上,我不应该使用abspath作为参数,烧瓶有一个判断send_static_file:

if os.path.isabs(filename) or \
   filename == '..' or \
   filename.startswith('../'):
    raise NotFound()
Run Code Online (Sandbox Code Playgroud)

因为filename我进入是一个abspath,烧瓶加注NotFound().
似乎它应该传递的是self.static_folder(self is <Flask 'main'>)的相对路径,在我的项目中,它是Project_name/app/static.但是,我没有设置static_folder自己,这意味着烧瓶认为静态文件夹应该在那里.

我还在试图弄清楚要做什么.

lai*_*e9m 45

终于搞定了.使用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)
Run Code Online (Sandbox Code Playgroud)

我现在很清楚,烧瓶真的很讨厌人们把app.py我或者我的情况main.py放到一个子目录中.仅当您的静态文件夹是flask认为的文件夹时才使用send_static_file,即名称static与app.py在同一目录中的文件夹.


Bur*_*lid 11

您需要做的就是将static_folder参数传递给启动器:

static_url_path - 可用于为Web上的静态文件指定不同的路径.默认为static_folder 文件夹的名称.

static_folder - 包含静态文件的文件夹,应该在static_url_path中提供.默认为应用程序根路径中的"static"文件夹.

app = Flask(__name__, static_folder=os.path.abspath('/foo/bar/zoo/'))
Run Code Online (Sandbox Code Playgroud)

现在,烧瓶会寻找一个新的目录static/foo/bar/zoo从那里为静态文件.仅send_from_directory在提供可能与静态文件不在同一位置的媒体文件时才使用.