升级我的python环境时,“字节"类型的对象不可JSON序列化 [英] Object of type 'bytes' is not JSON serializable when upgrading my python environment

查看:57
本文介绍了升级我的python环境时,“字节"类型的对象不可JSON序列化的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我已经在Flask中开发了一个有效的应用程序.我尝试将我的环境从2.7版升级到3.6版.当我遇到一个正在调用表单的端点时,它会产生以下错误:

I have developed an application in Flask that worked. I try to upgrade my environment from version 2.7 to 3.6. When I am hitting an endpoint that is calling a form It generated the following error:

Traceback (most recent call last):
  File "/Users/Melvyn/Documents/personnel/python/TheSwitchWebApp/venv/lib/python3.6/site-packages/flask/app.py", line 1997, in __call__
    return self.wsgi_app(environ, start_response)
  File "/Users/Melvyn/Documents/personnel/python/TheSwitchWebApp/venv/lib/python3.6/site-packages/flask/app.py", line 1985, in wsgi_app
    response = self.handle_exception(e)
  File "/Users/Melvyn/Documents/personnel/python/TheSwitchWebApp/venv/lib/python3.6/site-packages/flask/app.py", line 1540, in handle_exception
    reraise(exc_type, exc_value, tb)
  File "/Users/Melvyn/Documents/personnel/python/TheSwitchWebApp/venv/lib/python3.6/site-packages/flask/_compat.py", line 33, in reraise
    raise value
  File "/Users/Melvyn/Documents/personnel/python/TheSwitchWebApp/venv/lib/python3.6/site-packages/flask/app.py", line 1982, in wsgi_app
    response = self.full_dispatch_request()
  File "/Users/Melvyn/Documents/personnel/python/TheSwitchWebApp/venv/lib/python3.6/site-packages/flask/app.py", line 1614, in full_dispatch_request
    rv = self.handle_user_exception(e)
  File "/Users/Melvyn/Documents/personnel/python/TheSwitchWebApp/venv/lib/python3.6/site-packages/flask/app.py", line 1517, in handle_user_exception
    reraise(exc_type, exc_value, tb)
  File "/Users/Melvyn/Documents/personnel/python/TheSwitchWebApp/venv/lib/python3.6/site-packages/flask/_compat.py", line 33, in reraise
    raise value
  File "/Users/Melvyn/Documents/personnel/python/TheSwitchWebApp/venv/lib/python3.6/site-packages/flask/app.py", line 1612, in full_dispatch_request
    rv = self.dispatch_request()
  File "/Users/Melvyn/Documents/personnel/python/TheSwitchWebApp/venv/lib/python3.6/site-packages/flask/app.py", line 1598, in dispatch_request
    return self.view_functions[rule.endpoint](**req.view_args)
  File "/Users/Melvyn/Documents/personnel/python/TheSwitchWebApp/TheSwitchWebApp/controllers/account/register.py", line 15, in display_signup_form
    form = RegisterForm(request.form)
  File "/Users/Melvyn/Documents/personnel/python/TheSwitchWebApp/venv/lib/python3.6/site-packages/wtforms/form.py", line 212, in __call__
    return type.__call__(cls, *args, **kwargs)
  File "/Users/Melvyn/Documents/personnel/python/TheSwitchWebApp/venv/lib/python3.6/site-packages/flask_wtf/form.py", line 88, in __init__
    super(FlaskForm, self).__init__(formdata=formdata, **kwargs)
  File "/Users/Melvyn/Documents/personnel/python/TheSwitchWebApp/venv/lib/python3.6/site-packages/wtforms/form.py", line 278, in __init__
    self.process(formdata, obj, data=data, **kwargs)
  File "/Users/Melvyn/Documents/personnel/python/TheSwitchWebApp/venv/lib/python3.6/site-packages/wtforms/form.py", line 132, in process
    field.process(formdata)
  File "/Users/Melvyn/Documents/personnel/python/TheSwitchWebApp/venv/lib/python3.6/site-packages/wtforms/csrf/core.py", line 43, in process
    self.current_token = self.csrf_impl.generate_csrf_token(self)
  File "/Users/Melvyn/Documents/personnel/python/TheSwitchWebApp/venv/lib/python3.6/site-packages/flask_wtf/csrf.py", line 134, in generate_csrf_token
    token_key=self.meta.csrf_field_name
  File "/Users/Melvyn/Documents/personnel/python/TheSwitchWebApp/venv/lib/python3.6/site-packages/flask_wtf/csrf.py", line 47, in generate_csrf
    setattr(g, field_name, s.dumps(session[field_name]))
  File "/Users/Melvyn/Documents/personnel/python/TheSwitchWebApp/venv/lib/python3.6/site-packages/itsdangerous.py", line 565, in dumps
    payload = want_bytes(self.dump_payload(obj))
  File "/Users/Melvyn/Documents/personnel/python/TheSwitchWebApp/venv/lib/python3.6/site-packages/itsdangerous.py", line 847, in dump_payload
    json = super(URLSafeSerializerMixin, self).dump_payload(obj)
  File "/Users/Melvyn/Documents/personnel/python/TheSwitchWebApp/venv/lib/python3.6/site-packages/itsdangerous.py", line 550, in dump_payload
    return want_bytes(self.serializer.dumps(obj))
  File "/Users/Melvyn/Documents/personnel/python/TheSwitchWebApp/venv/lib/python3.6/site-packages/itsdangerous.py", line 51, in dumps
    return json.dumps(obj, separators=(',', ':'))
  File "/usr/local/Cellar/python3/3.6.1/Frameworks/Python.framework/Versions/3.6/lib/python3.6/json/__init__.py", line 238, in dumps
    **kw).encode(obj)
  File "/usr/local/Cellar/python3/3.6.1/Frameworks/Python.framework/Versions/3.6/lib/python3.6/json/encoder.py", line 199, in encode
    chunks = self.iterencode(o, _one_shot=True)
  File "/usr/local/Cellar/python3/3.6.1/Frameworks/Python.framework/Versions/3.6/lib/python3.6/json/encoder.py", line 257, in iterencode
    return _iterencode(o, 0)
  File "/usr/local/Cellar/python3/3.6.1/Frameworks/Python.framework/Versions/3.6/lib/python3.6/json/encoder.py", line 180, in default
    o.__class__.__name__)
TypeError: Object of type 'bytes' is not JSON serializable

当我到达以下端点时,它将生成此错误:

It generate this error when I'm hitting the following endpoint:

@register_endpoint.route('/', methods=['GET'])
def display_signup_form():
    error = None
    form = RegisterForm(request.form)
    return render_template("auth/register.html", form=form, error=error)

错误似乎来自以下形式:

The error seem to come from the form:

class RegisterForm(Form):
    first_name = StringField('First name', [InputRequired(message='First name is mandatory')])
    email = StringField('Email Address', [Email(), InputRequired(message='Forgot your email address?')])

我没有得到错误的根源.在这段代码中,我不会尝试在JSON中进行任何序列化.错误是从哪里来的?

I don't get the source of the error. In this piece of code I do not try to serialise in JSON anything. Where does the error come from?

推荐答案

正如@Arpit Solanki所述, py2.x py3.x 在编码.您最好在浏览器中清除cookie,可能浏览器中的cookie由 python2 代码设置,但是新的 python3 将cookie内容解释为字节字符串.请清除您的cookie即可解决问题.

As @Arpit Solanki mentioned, py2.x and py3.x are very different in case of encoding. You'd better clear your cookies in your browser, probably the browser had cookies set by python2 code, but your new python3 interpreted the cookie content as byte strings. Please clear your cookie will solve the issue.

您还可以选择性地仅擦除违规行为Cookie.

You can also selectively wipe just the offending cookie.

这篇关于升级我的python环境时,“字节"类型的对象不可JSON序列化的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆