Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

python flask - serving static files

Tags:

python

flask

I'm trying to serve a static file using flask. I don't know how to use the url_for function. All my routes generating dynamic content are working fine, I've imported url_for, but when I have this code:

@app.route('/')
def home():
    return url_for('static', filename='hi.html')

Along with my 'hi.html' file (which has some basic html in it) sitting in directory static, what I get when I load the page is literally this:

/static/hi.html

Am I just using url_for incorrectly?

like image 409
user1276273 Avatar asked Apr 08 '13 16:04

user1276273


People also ask

How do you serve static files in Flask?

To reference the static files using the url_for() function, pass in the name of the directory – static in this case – and the keyword argument of filename= followed by your static file name. Flask automatically creates a static view that serves static files from a folder named static in your application's directory.

Does Flask cache static files?

The end result is it will allow you to cache your static files forever with a web server such as nginx. It also gzips your files at maximum compression. When you combine both things together it will save you money on hosting and make a very noticeable improvement on page load speeds for your users.


2 Answers

url_for just returns, precisely, the URL for that file. It sounds like you want to redirect to the URL for that file. Instead, you are just sending the text of the URL to the client as a response.

from flask import url_for, redirect

@app.route('/')
def home():
    return redirect(url_for('static', filename='hi.html'))
like image 153
Michael Greene Avatar answered Oct 01 '22 10:10

Michael Greene


You are getting the correct output for what you are doing. url_for generates the url for the arguments you give it. In your case, you are generating the url for the hi.html file in the static directory. If you want to actually output the file, you would want to

from flask import render_template, url_for

...

    return render_template(url_for("static", filename="hi.html"))

But at this point, your static directory would need to be under the templates directory (where ever that is configured to live).

If you are going to be serving static html files like this, then my suggestion would be to serve them outside of the flask application by routing traffic to /static/.* directly from your web server. There are plenty of examples on the web for doing this using nginx or apache.

like image 35
sberry Avatar answered Oct 01 '22 12:10

sberry