Search code examples
pythonflaskctypeslocals

Flask render_template() & **locals() arg not working... Won't display python variables in HTML text


so I am very new to flask and am tinkering around with the CTypes module aswell - playing around with C & C++ files compiled in .so files to utilize in Python... I have a simple function imported into python using CTypes and then display the return value of the function (A random number to the power of two; x^2) using Flask into an html file along with a little sample introduction in case I were to stumble on this file a year from now - I would clearly know why I made this random sample. Now, that's all fine and dandy but, I heard on the street of the internets I can import multiple(all) my python variables into my HTML template using **locals(). I have seen others get this to work, but alas - I cannot... I'll whip up a Python function to replace the C++ file so you all don't have to mess with it... That works fine and is simply a part of this file and not inherently apart of the problem. I am naive enough to were I am overlooking something completely and the CTypes module is the root of this dilemma possibly.

from flask import Flask, render_template
# disabled the CTypes module for your convenience...
# from ctypes import *
def c_plus_plus_replacement(x):
    return pow(x, 2)

# libpy = CDLL("./libpy.so")
# value = libpy.main(10)

value = c_plus_plus_replacement(5)
name = "Michael"

app = Flask(__name__)

@app.route("/")
def index():
    # ---- The problem is at this return statement to render the HTML template...
    # render_template("base.html", value=value, name=name) works fine, but I would like this statement to work...
    return render_template("base.html", value=value)

if __name__ == '__main__':
    app.run(debug=False)

Let me know if you can help! :)


Solution

  • As it appears in your code, name and value are defined globally, therefore are not local to the function index, so they wouldn't appear in locals() when you call locals from within the index function.

    This would work if you moved these inside the function...

    def index():
        value = c_plus_plus_replacement(5)
        name = "Michael"
        return render_template('base.html', **locals())
    

    This would make the names value and name available in the template being rendered.