Reputation: 401
My question is similar to several others on this site, but the answers I find there aren't working for me.
I'm learning Flask. I'm running Flask 0.10.1 and Python 2.7, on an Ubuntu 10.04 machine using a Vagrant VM.
I've tried countless suggestions from SO, the Flask docs, and Miguel Grinberg, without success.
So I'm showing the simplest version that I thought could work (but doesn't) for your perusal.
The commented-out substitute lines (in page_a.html and page_b.html) do work but are hideous.
First, here's the output of 'tree' on my project root:
And here are the files (minus a bit of boilerplate in the .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>
init.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;
}
This version does work when, in page_a.html and page_b.html, I use the commented-out lines (instead of the lines above them).
Here's the output of runserver.py when I access page_a.html:
"GET /page_a HTTP/1.1" 200 -
"GET /styles.css HTTP/1.1" 404 -
"GET /an_image.png HTTP/1.1" 404 -
and page_b.html.
"GET /pages/page_b/ HTTP/1.1" 200 -
"GET /pages/page_b/styles.css HTTP/1.1" 404 -
(this last shows 'an_image.png' from my 'styles' directory)
My questions: What am I missing? Can this setup be made to work without a major refactoring?
I of course don't want to hard-code the full path to every static file.
Also, in the real application, the URLs run several levels deep -- e.g.,
http://localhost:5000/book/<id_1>/chapter/<id_2>/page
Many thanks to anyone who might reply!
Upvotes: 3
Views: 3175
Reputation: 1815
You could use url_for to serve the static files. An example can be found here.
PS: Unless you are making something really large, serving them by using '/static/file.css' should work fine. In production environments it's better to get Apache or nginx to serve static files.
Upvotes: 1
Reputation: 20709
You aren't telling Flask that the files are in your static folder. The easiest way to do that is with url_for
.
<link rel="stylesheet" href="{{ url_for('static', filename='styles.css') }}">
Upvotes: 3