Flask没有在我的软件包中查找文件'静态'目录

时间:2016-02-24 04:29:00

标签: python html css flask

我的问题与本网站上的其他几个问题类似,但我找到的答案并不适用于我。

我正在学习烧瓶。我在使用Vagrant VM的Ubuntu 10.04计算机上运行Flask 0.10.1和Python 2.7。

我已经尝试了SO,Flask博士和Miguel Grinberg的无数建议,但没有成功。

所以我展示了我认为 可以工作的最简单版本(但是没有)供您阅读。

已注释掉的替代行(在page_a.html和page_b.html中)执行工作但是很可怕。

首先,这是'树的输出。在我的项目根目录:

output_of_tree

以下是文件(减去.html中的一些样板文件)

page_a.html:

<head>
    <link rel="stylesheet" href="styles.css">
    <!-- <link rel="stylesheet" href="static/styles.css"> -->
</head>
<body>
    <h1>page_a</h1>
    <img src="an_image.png">
    <!-- <img src="static/an_image.png"> -->
    <a href="{{ url_for('page_b') }}">to page b</a>
</body>

page_b.html:

<head>
    <link rel="stylesheet" href="styles.css">
    <!-- <link rel="stylesheet" href="../../static/styles.css"> -->
</head>
<body>
    <h1>page_b</h1>
    <img src="../../static/an_image.png">
    <!-- <img src="../../static/an_image.png"> -->
    <a href="{{ url_for('page_a') }}">to page a</a>
</body>

初始化的.py:

from flask import Flask
app = Flask('my_pages')
import my_pages.views

runserver.py:

from my_pages import app 
app.run(host='0.0.0.0', port=5000, debug=True)

views.py:

from my_pages import app 
from flask import render_template

@app.route('/')
@app.route('/page_a')
def page_a():
    return render_template('page_a.html')

@app.route('/pages/page_b/')
def page_b():
    return render_template('page_b.html')

styles.css的:

body {
    background-color: green;
}

当在page_a.html和page_b.html中使用已注释掉的行(而不是上面的行)时,此版本 有效。

当我访问page_a.html时,这里是runserver.py的输出:

"GET /page_a HTTP/1.1" 200 -
"GET /styles.css HTTP/1.1" 404 -
"GET /an_image.png HTTP/1.1" 404 -

和page_b.html。

"GET /pages/page_b/ HTTP/1.1" 200 -
"GET /pages/page_b/styles.css HTTP/1.1" 404 -

(这最后显示&#39; an_image.png&#39;来自我的&#39; styles&#39;目录)

我的问题:我错过了什么?这种设置可以在没有重大重构的情况下工作吗?

我当然不想硬编码每个静态文件的完整路径。

此外,在实际应用程序中,URL会运行多个级别 - 例如

http://localhost:5000/book/<id_1>/chapter/<id_2>/page

非常感谢任何可能回复的人!

2 个答案:

答案 0 :(得分:3)

您不会告诉Flask这些文件位于您的静态文件夹中。最简单的方法是使用url_for

<link rel="stylesheet" href="{{ url_for('static', filename='styles.css') }}">

答案 1 :(得分:1)

您可以使用url_for来提供静态文件。可以找到一个示例here

PS:除非你制作的东西非常大,否则请使用&#39; /static/file.css'应该工作正常。在生产环境中,让Apache或nginx提供静态文件会更好。