Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

how to render template in flask without using request context

So there's this flask app that I'm working on for this project and I need it to run in a loop at timed variables to check for the status of certain variables and then give a output accordingly. However, the problem I have is I need to render a template in Flask before the loop restarts. In the changelog on http://flask.pocoo.org/ it's indicated that it's possible to render templates without using the request context but I haven't seen any real examples of this. So is there a way to render templates in Flask without having to use the request context without getting any errors? Any help that can be given is appreciated.

UPDATE: Here's the code I'm working with

from flask import Flask, render_template, request, flash, redirect, url_for
import flask
import time
from flask.ext.assets import Environment, Bundle
from flask_wtf import Form 
from wtforms import TextField, TextAreaField, SubmitField
from wtforms.validators import InputRequired

CSRF_ENABLED = True
app = Flask(__name__)
app.secret_key = 'development key'
app = flask.Flask('my app')
assets = Environment(app)
assets.url = app.static_url_path
scss = Bundle('scss/app.scss', filters='scss', output='css/app.css')
assets.register('app_scss', scss)

@app.route('/')
def server_1():
    r=1
    g=2
    b=3
    i=g
    if i == g:
        with app.app_context():
            print "Loading Template..."
            rendered = flask.render_template('server_1.html', green=True)
            print "Success! Template was loaded with green server status..."
            time.sleep(5)


if __name__ == '__main__':
    app.run(port=5000, debug=True)
like image 803
VEDA0095 Avatar asked Aug 05 '15 11:08

VEDA0095


People also ask

How do I create a render template in Flask?

In this code block, you import the Flask class and the render_template() function from the flask package. You use the Flask class to create your Flask application instance named app . Then you define a view function (which is a Python function that returns an HTTP response) called hello() using the app.

How do you pass data into a template in Flask?

Flask sends form data to template Flask to send form data to the template we have seen that http method can be specified in the URL rule. Form data received by the trigger function can be collected in the form of a dictionary object and forwarded to the template to render it on the corresponding web page.

What is the difference between render template and redirect in Flask?

redirect returns a 302 header to the browser, with its Location header as the URL for the index function. render_template returns a 200, with the index. html template returned as the content at that URL.

How do I render a Python template?

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.


1 Answers

You can do it by binding your application as the current application. Then you can use render_template() to render a template from your template directory, or render_template_string() to render directly from a template stored in a string:

import flask
app = flask.Flask('my app')

with app.app_context():
    context = {'name': 'bob', 'age': 22}
    rendered = flask.render_template('index.html', **context)

with app.app_context():
    template = '{{ name }} is {{ age }} years old.'
    context = {'name': 'bob', 'age': 22}
    rendered = flask.render_template_string(template, **context)

Alternatively you could bypass Flask and go directly to Jinja2:

import jinja2
template = jinja2.Template('{{ name }} is {{ age }} years old.')
rendered = template.render(name='Ginger', age=10)

Update

It appears that you might be wanting to stream content back to the requesting client. If so you could write a generator. Something like this might work:

import time
from flask import Flask, Response, render_template_string
from flask import stream_with_context

app = Flask(__name__)

@app.route("/")
def server_1():
    def generate_output():
        age = 0
        template = '<p>{{ name }} is {{ age }} seconds old.</p>'
        context = {'name': 'bob'}
        while True:
            context['age'] = age
            yield render_template_string(template, **context)
            time.sleep(5)
            age += 5

    return Response(stream_with_context(generate_output()))

app.run()

Here is some documentation on streaming with Flask.

like image 170
mhawke Avatar answered Oct 05 '22 23:10

mhawke