Python / Flask - объект типа "TypeError" не сериализуем в формате JSON - PullRequest
0 голосов
/ 18 февраля 2019

Я использую python / flask для создания простой страницы входа в систему для своего веб-сайта, и у меня возникают проблемы с проверкой хэша, извлеченного из моей БД.Когда я отправляю форму, я получаю внутреннюю ошибку сервера.В журналах apache показано, что «объект типа« TypeError »не поддерживает сериализацию в формате JSON.« Я создал несколько пользователей, поэтому он не связан ни с одним хешем. Любая помощь приветствуется

app.route("/login/",methods=['GET','POST'])
def loginpage():
    error=''
    try:
        c,conn= connectorConnection()
        if request.method == 'POST':
            c.execute("select * from users where username = ('%s')" % 
                      request.form['username'])
            data = c.fetchone()
            if sha256_crypt.verify(request.form['password'], data):
                session['logged_in'] = True
                session['username'] = request.form['username']
                flash(' you are now logged in')
                return redirect(url_for('home'))
            else:
                error = 'Invalid Credentials'

        gc.collect()

        return render_template('login.html',error=error)

Stracktrace:

Traceback (most recent call last):
  File "C:\Users\Tank\AppData\Local\Programs\Python\Python36\lib\site-packages\flask\app.py", line 2292, in wsgi_app
    response = self.full_dispatch_request()
  File "C:\Users\Tank\AppData\Local\Programs\Python\Python36\lib\site-packages\flask\app.py", line 1816, in full_dispatch_request
    return self.finalize_request(rv)
  File "C:\Users\Tank\AppData\Local\Programs\Python\Python36\lib\site-packages\flask\app.py", line 1833, in finalize_request
    response = self.process_response(response)
  File "C:\Users\Tank\AppData\Local\Programs\Python\Python36\lib\site-packages\flask\app.py", line 2114, in process_response
    self.session_interface.save_session(self, ctx.session, response)
  File "C:\Users\Tank\AppData\Local\Programs\Python\Python36\lib\site-packages\flask\sessions.py", line 375, in save_session
    val = self.get_signing_serializer(app).dumps(dict(session))
  File "C:\Users\Tank\AppData\Local\Programs\Python\Python36\lib\site-packages\itsdangerous\serializer.py", line 166, in dumps
    payload = want_bytes(self.dump_payload(obj))
  File "C:\Users\Tank\AppData\Local\Programs\Python\Python36\lib\site-packages\itsdangerous\url_safe.py", line 42, in dump_payload
    json = super(URLSafeSerializerMixin, self).dump_payload(obj)
  File "C:\Users\Tank\AppData\Local\Programs\Python\Python36\lib\site-packages\itsdangerous\serializer.py", line 133, in dump_payload
    return want_bytes(self.serializer.dumps(obj, **self.serializer_kwargs))
  File "C:\Users\Tank\AppData\Local\Programs\Python\Python36\lib\site-packages\flask\json\tag.py", line 296, in dumps
    return dumps(self.tag(value), separators=(',', ':'))
  File "C:\Users\Tank\AppData\Local\Programs\Python\Python36\lib\site-packages\flask\json\__init__.py", line 179, in dumps
    rv = _json.dumps(obj, **kwargs)
  File "C:\Users\Tank\AppData\Local\Programs\Python\Python36\lib\json\__init__.py", line 238, in dumps
    **kw).encode(obj)
  File "C:\Users\Tank\AppData\Local\Programs\Python\Python36\lib\json\encoder.py", line 199, in encode
    chunks = self.iterencode(o, _one_shot=True)
  File "C:\Users\Tank\AppData\Local\Programs\Python\Python36\lib\json\encoder.py", line 257, in iterencode
    return _iterencode(o, 0)
  File "C:\Users\Tank\AppData\Local\Programs\Python\Python36\lib\site-packages\flask\json\__init__.py", line 81, in default
    return _json.JSONEncoder.default(self, o)
  File "C:\Users\Tank\AppData\Local\Programs\Python\Python36\lib\json\encoder.py", line 180, in default
    o.__class__.__name__)
TypeError: Object of type 'TypeError' is not JSON serializable
127.0.0.1 - - [18/Feb/2019 20:23:40] "[1m[35mPOST /login/ HTTP/1.1[0m" 500 -

Ответы [ 2 ]

0 голосов
/ 19 февраля 2019

После добавления попытки / за исключением предложения Balderman, ошибка показала, что «хэш должен быть в юникоде или байтах, а не в кортеже».Оказывается, моя таблица паролей в моей базе данных была слишком короткой (45 символов).Изменение таблицы, чтобы разрешить 200 символов, позволило вставить полный хэш.Спасибо за помощь

0 голосов
/ 19 февраля 2019
app.route("/login/",methods=['GET','POST'])
def loginpage():
    try:
        your code here
    except Exception as e:
        print(e)  
        # Now you can see what the real issue is...
        return json.dumps({'success':True}), 200, 
                          {'ContentType':'application/json'}) 
...