简体   繁体   中英

TypeError: Object of type 'Undefined' is not JSON serializable

I'm getting this error when I attempt to submit the form. I'm not exactly sure what doesn't have a value/isn't defined, and was looking for guidance as the traceback didn't offer much insight for me at least. I had this error before when I attempted to run the page for the first time, and it was resolved by putting form=form into render_template's parameter. I believe the issue is in views.py, but let me know if I'm missing code or anything else. Thanks

views.py

@blueprint.route("register/")
def register_page():
    """Renders register site landing page."""
    form = RegisterForm()
    return render_template('main/register.html', page_title="Register", form=form, media_types=current_app.config["ACCEPTED_"
                                                          "MEDIA_TYPE"])


@blueprint.route("register/", methods=['GET', 'POST'])
def register():
    """Renders register page."""
    form = RegisterForm()
    if request.method == 'POST':
        if not form.validate_on_submit():
            return render_template('main/register.html', page_title="Service Registration",
                                   form=form, form_success=False)
        # If company does not exist, create it
        if err:
            company, err = create_company(form.organization.data)
            if err:
                return render_template('main/register.html', page_title="Service Registration",
                                       form=form, form_success=False, message=err)
        if err:
            return render_template('main/register.html', page_title="Service Registration",
                                   form=form, form_success=False, message=err)
        if err:
            return render_template('main/register.html', page_title="Service Registration",
                                   form=form, form_success=False, message=err)
        else:
            success_msg = "Your ticket id is {}. You should receive an email with a link to your ticket."
                .format(ticket.get('id'))
            return render_template('main/register.html', page_title="Service Registration",
                                   form=form, form_success=True, message=success_msg)
    return render_template('main/register.html', page_title="Service Registration",
                           form=form)

javascript

var validateContentType = function() {
            var contentType = $('#upload').prop('files')[0].type;

            console.log(contentType, contentType2, contentType3, contentType4, contentType5, contentType6, contentType7);
            var contentTypes = contentType.split('/');

            var MIMEType = contentTypes[0];

            var mediaType = contentTypes[1];

            switch(MIMEType) {
                case 'video':
                    return true;
                case 'image':
                    return true;
                case 'application':
                    if ({{ media_types|tojson }}.indexOf(mediaType) != -1) {
                        return true;
                    } else {
                        return false;
                    }
                default:
                    return false;
            }
        };

traceback

Traceback (most recent call last):
  File "C:\Users\snguyen\Documents\Nevco_Support\venv\lib\site-packages\flask\app.py", line 1997, in __call__
    return self.wsgi_app(environ, start_response)
  File "C:\Users\snguyen\Documents\Nevco_Support\venv\lib\site-packages\flask\app.py", line 1985, in wsgi_app
    response = self.handle_exception(e)
  File "C:\Users\snguyen\Documents\Nevco_Support\venv\lib\site-packages\flask\app.py", line 1540, in handle_exception
    reraise(exc_type, exc_value, tb)
  File "C:\Users\snguyen\Documents\Nevco_Support\venv\lib\site-packages\flask\_compat.py", line 33, in reraise
    raise value
  File "C:\Users\snguyen\Documents\Nevco_Support\venv\lib\site-packages\flask\app.py", line 1982, in wsgi_app
    response = self.full_dispatch_request()
  File "C:\Users\snguyen\Documents\Nevco_Support\venv\lib\site-packages\flask\app.py", line 1614, in full_dispatch_request
    rv = self.handle_user_exception(e)
  File "C:\Users\snguyen\Documents\Nevco_Support\venv\lib\site-packages\flask\app.py", line 1517, in handle_user_exception
    reraise(exc_type, exc_value, tb)
  File "C:\Users\snguyen\Documents\Nevco_Support\venv\lib\site-packages\flask\_compat.py", line 33, in reraise
    raise value
  File "C:\Users\snguyen\Documents\Nevco_Support\venv\lib\site-packages\flask\app.py", line 1612, in full_dispatch_request
    rv = self.dispatch_request()
  File "C:\Users\snguyen\Documents\Nevco_Support\venv\lib\site-packages\flask\app.py", line 1598, in dispatch_request
    return self.view_functions[rule.endpoint](**req.view_args)
  File "C:\Users\snguyen\Documents\Nevco_Support\nevco-support\nevco_support\main\views.py", line 151, in register
    form=form, form_success=False)
  File "C:\Users\snguyen\Documents\Nevco_Support\venv\lib\site-packages\flask\templating.py", line 134, in render_template
    context, ctx.app)
  File "C:\Users\snguyen\Documents\Nevco_Support\venv\lib\site-packages\flask\templating.py", line 116, in _render
    rv = template.render(context)
  File "C:\Users\snguyen\Documents\Nevco_Support\venv\lib\site-packages\jinja2\asyncsupport.py", line 76, in render
    return original_render(self, *args, **kwargs)
  File "C:\Users\snguyen\Documents\Nevco_Support\venv\lib\site-packages\jinja2\environment.py", line 1008, in render
    return self.environment.handle_exception(exc_info, True)
  File "C:\Users\snguyen\Documents\Nevco_Support\venv\lib\site-packages\jinja2\environment.py", line 780, in handle_exception
    reraise(exc_type, exc_value, tb)
  File "C:\Users\snguyen\Documents\Nevco_Support\venv\lib\site-packages\jinja2\_compat.py", line 37, in reraise
    raise value.with_traceback(tb)
  File "C:\Users\snguyen\Documents\Nevco_Support\nevco-support\nevco_support\templates\main\register.html", line 2, in top-level template code
    {% from 'content/helpers.html' import render_field %}
  File "C:\Users\snguyen\Documents\Nevco_Support\nevco-support\nevco_support\templates\layout.html", line 36, in top-level template code
    {% block body %}
  File "C:\Users\snguyen\Documents\Nevco_Support\nevco-support\nevco_support\templates\layout.html", line 81, in block "body"
    {% block js %}
  File "C:\Users\snguyen\Documents\Nevco_Support\nevco-support\nevco_support\templates\main\register.html", line 848, in block "js"
    if ({{ media_types|tojson }}.indexOf(mediaType) != -1) {
  File "C:\Users\snguyen\Documents\Nevco_Support\venv\lib\site-packages\flask\json.py", line 269, in tojson_filter
    return Markup(htmlsafe_dumps(obj, **kwargs))
  File "C:\Users\snguyen\Documents\Nevco_Support\venv\lib\site-packages\flask\json.py", line 183, in htmlsafe_dumps
    rv = dumps(obj, **kwargs) \
  File "C:\Users\snguyen\Documents\Nevco_Support\venv\lib\site-packages\flask\json.py", line 123, in dumps
    rv = _json.dumps(obj, **kwargs)
  File "C:\Users\snguyen\AppData\Local\Programs\Python\Python36-32\lib\json\__init__.py", line 238, in dumps
    **kw).encode(obj)
  File "C:\Users\snguyen\AppData\Local\Programs\Python\Python36-32\lib\json\encoder.py", line 199, in encode
    chunks = self.iterencode(o, _one_shot=True)
  File "C:\Users\snguyen\AppData\Local\Programs\Python\Python36-32\lib\json\encoder.py", line 257, in iterencode
    return _iterencode(o, 0)
  File "C:\Users\snguyen\Documents\Nevco_Support\venv\lib\site-packages\flask\json.py", line 80, in default
    return _json.JSONEncoder.default(self, o)
  File "C:\Users\snguyen\AppData\Local\Programs\Python\Python36-32\lib\json\encoder.py", line 180, in default
    o.__class__.__name__)
TypeError: Object of type 'Undefined' is not JSON serializable

You didn't pass in media_types into any of your render_template() calls in the register route. For the specific traceback you gave, the culprit is here:

return render_template('main/register.html', page_title="Service Registration",
                       form=form, form_success=False)

but his also applies to the other render_template() calls. You can see this in the traceback:

Traceback (most recent call last):
  # [...]
  # line pointing to the register() function, where the above render_template()
  # call is made
  File "C:\Users\snguyen\Documents\Nevco_Support\nevco-support\nevco_support\main\views.py", line 151, in register
    form=form, form_success=False)
  # [...]
  # which leads to this template line, where media_types|tojson is output
  File "C:\Users\snguyen\Documents\Nevco_Support\nevco-support\nevco_support\templates\main\register.html", line 848, in block "js"
    if ({{ media_types|tojson }}.indexOf(mediaType) != -1) {
  # The next line is tojson filter being called
  File "C:\Users\snguyen\Documents\Nevco_Support\venv\lib\site-packages\flask\json.py", line 269, in tojson_filter
    return Markup(htmlsafe_dumps(obj, **kwargs))
  # [...]
  # and the exception tells us something is not serializable, the Undefined object.
TypeError: Object of type 'Undefined' is not JSON serializable

Jinja2 uses Undefined for any variable that has not been set for the template. From the template documentation :

If a variable or attribute does not exist, you will get back an undefined value. What you can do with that kind of value depends on the application configuration: the default behavior is to evaluate to an empty string if printed or iterated over, and to fail for every other operation.

You need to either pass in a value for media_types to all calls, or set a default if the value is missing, like an empty string:

if ({{ media_types|default("")|tojson }}.indexOf(mediaType) != -1) {

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM