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

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

我在尝试提交表单时遇到此错误。我不太确定什么没有定义 value/isn,并且正在寻找指导,因为回溯至少没有为我提供太多见解。我之前第一次尝试 运行 页面时遇到过这个错误,通过将 form=form 放入 render_template 的参数中解决了这个错误。我认为问题出在 views.py,但如果我遗漏了代码或其他任何内容,请告诉我。谢谢

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 (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

您没有将 media_types 传入 register 路由中的任何 render_template() 调用。你给出的具体traceback,罪魁祸首在这里:

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

但他的也适用于其他 render_template() 调用。您可以在回溯中看到这一点:

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 将 Undefined 用于尚未为模板设置的任何变量。来自 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.

您需要将 media_types 的值传递给 所有 调用,或者 set a default 如果缺少该值,例如空字符串:

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