Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Is it possible to dynamically update a rendered template in Flask, server-side?

Tags:

python

json

flask

I currently have a Flask web server that pulls data from a JSON API using the built-in requests object.

For example:

def get_data():
    response = requests.get("http://myhost/jsonapi")
    ...
    return response

@main.route("/", methods=["GET"])
def index():
    return render_template("index.html", response=response)

The issue here is that naturally the GET method is only run once, the first time get_data is called. In order to refresh the data, I have to stop and restart the Flask wsgi server. I've tried wrapping various parts of the code in a while True / sleep loop but this prevents werkzeug from loading the page.

What is the most Pythonic way to dynamically GET the data I want without having to reload the page or restart the server?

like image 267
damienstanton Avatar asked Oct 23 '14 19:10

damienstanton


People also ask

Does flask support Dynamic HTML?

Using Flask Templates for Dynamic data. We have already discussed using templates in flask for storing the non-changing data, but we can also use them dynamically to show data using Jinja. Jinja is used to write python-like syntax in HTML files, which helps in using variables like functionality.

What does Render_template do in flask?

render_template is a Flask function from the flask. templating package. render_template is used to generate output from a template file based on the Jinja2 engine that is found in the application's templates folder. Note that render_template is typically imported directly from the flask package instead of from flask.

Can I use Javascript in flask?

You're right about Flask being a good solution for this and there are examples and tutorials everywhere. If what you want is just to run a specific function on a button press and get something back in javascript, I've put a quick example is below. This can then be run with python app.py and make sure your index.


1 Answers

You're discussing what are perhaps two different issues.

  1. Let's assume the problem is you're calling the dynamic data source, get_data(), only once and keeping its (static) value in a global response. This one-time-call is not shown, but let's say it's somewhere in your code. Then, if you are willing to refresh the page (/) to get updates, you could then:

    @main.route("/", methods=['GET'])
    def index():
        return render_template("index.html", response=get_data())
    

    This would fetch fresh data on every page load.

  2. Then toward the end of your question, you ask how to "GET the data I want without having to reload the page or restart the server." That is an entirely different issue. You will have to use AJAX or WebSocket requests in your code. There are quite a few tutorials about how to do this (e.g. this one) that you can find through Googling "Flask AJAX." But this will require an JavaScript AJAX call. I recommend finding examples of how this is done through searching "Flask AJAX jQuery" as jQuery will abstract and simplify what you need to do on the client side. Or, if you wish to use WebSockets for lower-latency connection between your web page, that is also possible; search for examples (e.g. like this one).

like image 123
Jonathan Eunice Avatar answered Oct 13 '22 19:10

Jonathan Eunice