Flask app NameError: name 'Markup' is not defined

Question:

I have been really stumped on this, been out of this game of web dev/python for a bit. I had a previously working Azure app service running this website, we did a minor HTML spelling change and re deployed. I am assuming some dependency got updated and now its broken. I don’t know if this is a packaging version issue or if I have a missing import for my flask app.

I am getting a NameError: name 'Markup' is not defined error when trying to load a static html page. My app starts up just fine but I can’t load the actual web pages.

Full Traceback

Traceback (most recent call last):
  File "C:UsersSt**PythonProjects**Site-Portfoliolibsite-packagesflaskapp.py", line 2095, in __call__
    return self.wsgi_app(environ, start_response)
  File "C:UsersSt**PythonProjects**Site-Portfoliolibsite-packagesflaskapp.py", line 2080, in wsgi_app
    response = self.handle_exception(e)
  File "C:UsersSt**PythonProjects**Site-Portfoliolibsite-packagesflask_corsextension.py", line 165, in wrapped_function
    return cors_after_request(app.make_response(f(*args, **kwargs)))
  File "C:UsersSt**PythonProjects**Site-Portfoliolibsite-packagesflaskapp.py", line 2077, in wsgi_app
    response = self.full_dispatch_request()
  File "C:UsersSt**PythonProjects**Site-Portfoliolibsite-packagesflaskapp.py", line 1525, in full_dispatch_request
    rv = self.handle_user_exception(e)
  File "C:UsersSt**PythonProjects**Site-Portfoliolibsite-packagesflask_corsextension.py", line 165, in wrapped_function
    return cors_after_request(app.make_response(f(*args, **kwargs)))
  File "C:UsersSt**PythonProjects**Site-Portfoliolibsite-packagesflaskapp.py", line 1523, in full_dispatch_request
    rv = self.dispatch_request()
  File "C:UsersSt**PythonProjects**Site-Portfoliolibsite-packagesflaskapp.py", line 1509, in dispatch_request
    return self.ensure_sync(self.view_functions[rule.endpoint])(**req.view_args)
  File "C:UsersSt**PycharmProjects**Site-portfolioapplication.py", line 32, in index
    return render_template("//index.html")
  File "C:UsersSt**PythonProjects**Site-Portfoliolibsite-packagesflasktemplating.py", line 147, in render_template
    ctx.app.update_template_context(context)
  File "C:UsersSt**PythonProjects**Site-Portfoliolibsite-packagesflaskapp.py", line 756, in update_template_context
    context.update(func())
  File "C:UsersSt**PythonProjects**Site-Portfoliolibsite-packagesflask_recaptcha.py", line 59, in get_code
    return dict(recaptcha=Markup(self.get_code()))
NameError: name 'Markup' is not defined
127.0.0.1 - - [08/Apr/2022 17:02:51] "GET /?__debugger__=yes&cmd=resource&f=style.css HTTP/1.1" 304 -
127.0.0.1 - - [08/Apr/2022 17:02:51] "GET /?__debugger__=yes&cmd=resource&f=debugger.js HTTP/1.1" 304 -
127.0.0.1 - - [08/Apr/2022 17:02:51] "GET /?__debugger__=yes&cmd=resource&f=console.png HTTP/1.1" 304 -

Process finished with exit code 0

Here is my code:

from flask import Flask, request, render_template, flash
from flask_mail import Mail, Message
from flask_cors import CORS, cross_origin
from flask_recaptcha import ReCaptcha
import requests
import json
import os

app = Flask(__name__, static_folder='static', static_url_path='')
recaptcha = ReCaptcha(app=app)

app.config['RECAPTCHA_ENABLED'] = True
app.config['RECAPTCHA_PUBLIC_KEY'] = '***********************'
app.config['RECAPTCHA_PRIVATE_KEY'] = '****************************'

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

@app.route('/contact-us', methods=['GET'])
@app.route('/contact', methods=['GET', 'POST'])
def contact():
    if request.method == 'POST':
        r = requests.post('https://www.google.com/recaptcha/api/siteverify',
                          data={'secret': '***********',
                                'response': request.form['g-recaptcha-response']})
        google_response = json.loads(r.text)

        if google_response['success']:
            contact_form = {'name': request.form['name'],
                            'email': request.form['email'],
                            'message': request.form['message']}
            msg = Message(subject='Contact from website',
                          sender=contact_form['email'],
                          recipients=['*************'],
                          body=contact_form['message'])
            mail.send(msg)
            flash('Success, we will respond within at least 24 hours.')
            return render_template('contact.html')

        else:
            flash('failed to submit, please retry or contact us at ************')
            return render_template('contact.html')

    return render_template('contact.html')

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

My requirements.txt for package version

Flask>=1.0.2
jinja2>=2.11.3
Flask-Mail>=0.9.1
Flask-Cors>=3.0.9
Flask-Admin>=1.5.2
Flask-ReCaptcha>=0.4.2
Flask-SQLAlchemy>=2.3.2
Flask-WTF>=0.14.2
SQLAlchemy>=1.3.0
requests>=2.20.0
Flask-Login>=0.4.1
Werkzeug>=0.15.3
Asked By: Sterling Dunn

||

Answers:

Flask-ReCaptcha is a very old project. The last update of Flask-ReCaptcha is on 2016. You’d better not use it.

Back to the error log itself, Flask-ReCaptcha has code like from jinja2 import Markup. But, since jinja2==3.1.0, Markup's position has changed. Try pip install jinja2==3.0.0`.

You will probably meet other problems as Flask-ReCaptcha is really old.

Answered By: Kyle Anderson
  • Go to Python installation folder
  • Go to Lib > site-packages
  • Open flask_recaptcha.py

You’ll see something like this:

try:
    from flask import request
    from jinja2 import Markup
    import requests
except ImportError as ex:
    print("Missing dependencies")

Change it to:

try:
    from flask import request
    from markupsafe import Markup
    import requests
except ImportError as ex:
    print("Missing dependencies")
Answered By: Pritam
Categories: questions Tags: , ,
Answers are sorted by their score. The answer accepted by the question owner as the best is marked with
at the top-right corner.