флеш-кеш TypeError: невозможно выбрать объекты CompiledFFI - PullRequest
0 голосов
/ 06 октября 2019

Я использую библиотеку pysaml2 в Python. у которого есть метод , определенный следующим образом: :

def _store_request(self, saml_msg):
    key = sha1(saml_msg["SAMLRequest"]).hexdigest()
    IDP.ticket[key] = saml_msg
    return key

, где IDP.ticket = {} - это простое сопоставление значения ключа для всего приложения (в необработанном WSGI-приложении ). здесь IDP.ticket сохраняется между несколькими запросами. некоторый контекст ниже.

Маршрут, который вызывается, SSO (). redirect ,

  • Первоначально self.user равен False, поэтому ключ устанавливается self._store_request (saml_msg)
  • Затем пользователю возвращается форма с ключом, заданным в форме, чтобы можно было идентифицировать запрос. При отправке формы SSO (). Редирект вызывается снова, и значение, установленное в IDP.ticket во время предыдущего запроса, было получено.

Я хочу перенести этот метод в приложение для колб, но при использовании колбы с Flask-Cache когда я делаю cache.set(key,saml_msg), я получаю ошибку:

TypeError: can't pickle CompiledFFI objects

Я догадываюсь, потому что saml_msg содержит ключ

req_info': <saml2.request.AuthnRequest object at 0x1072302d0>

Как сохранить состояние между несколькими запросами в колбе, кроме использования FLask-Cache?

РЕДАКТИРОВАТЬ: .

этот вопрос похож на этот вопрос , но я уже пробовал это решение. Мне нужно сохранить object не простой тип данных, поэтому, когда я сохраняю его с помощью Flask-Cache iget `не может выбрать объекты CompiledFFI (возможно, это что-то с AuthnRequest объектом, его невозможно засечь)

Используя flask.session для хранения ключа между запросами, это дает TypeError: Object of type AuthnRequest is not JSON serializable.

полная трассировка стека.

Traceback (most recent call last):
  File "/usr/local/lib/python3.7/site-packages/flask/app.py", line 2463, in __call__
    return self.wsgi_app(environ, start_response)
  File "/usr/local/lib/python3.7/site-packages/flask/app.py", line 2449, in wsgi_app
    response = self.handle_exception(e)
  File "/usr/local/lib/python3.7/site-packages/flask/app.py", line 1866, in handle_exception
    reraise(exc_type, exc_value, tb)
  File "/usr/local/lib/python3.7/site-packages/flask/_compat.py", line 39, in reraise
    raise value
  File "/usr/local/lib/python3.7/site-packages/flask/app.py", line 2446, in wsgi_app
    response = self.full_dispatch_request()
  File "/usr/local/lib/python3.7/site-packages/flask/app.py", line 1952, in full_dispatch_request
    return self.finalize_request(rv)
  File "/usr/local/lib/python3.7/site-packages/flask/app.py", line 1969, in finalize_request
    response = self.process_response(response)
  File "/usr/local/lib/python3.7/site-packages/flask/app.py", line 2268, in process_response
    self.session_interface.save_session(self, ctx.session, response)
  File "/usr/local/lib/python3.7/site-packages/flask/sessions.py", line 378, in save_session
    val = self.get_signing_serializer(app).dumps(dict(session))
  File "/usr/local/lib/python3.7/site-packages/itsdangerous/serializer.py", line 166, in dumps
    payload = want_bytes(self.dump_payload(obj))
  File "/usr/local/lib/python3.7/site-packages/itsdangerous/url_safe.py", line 42, in dump_payload
    json = super(URLSafeSerializerMixin, self).dump_payload(obj)
  File "/usr/local/lib/python3.7/site-packages/itsdangerous/serializer.py", line 133, in dump_payload
    return want_bytes(self.serializer.dumps(obj, **self.serializer_kwargs))
  File "/usr/local/lib/python3.7/site-packages/flask/json/tag.py", line 305, in dumps
    return dumps(self.tag(value), separators=(",", ":"))
  File "/usr/local/lib/python3.7/site-packages/flask/json/__init__.py", line 211, in dumps
    rv = _json.dumps(obj, **kwargs)
  File "/usr/local/Cellar/python/3.7.4_1/Frameworks/Python.framework/Versions/3.7/lib/python3.7/json/__init__.py", line 238, in dumps
    **kw).encode(obj)
  File "/usr/local/Cellar/python/3.7.4_1/Frameworks/Python.framework/Versions/3.7/lib/python3.7/json/encoder.py", line 199, in encode
    chunks = self.iterencode(o, _one_shot=True)
  File "/usr/local/Cellar/python/3.7.4_1/Frameworks/Python.framework/Versions/3.7/lib/python3.7/json/encoder.py", line 257, in iterencode
    return _iterencode(o, 0)
  File "/usr/local/lib/python3.7/site-packages/flask/json/__init__.py", line 100, in default
    return _json.JSONEncoder.default(self, o)
  File "/usr/local/Cellar/python/3.7.4_1/Frameworks/Python.framework/Versions/3.7/lib/python3.7/json/encoder.py", line 179, in default
    raise TypeError(f'Object of type {o.__class__.__name__} '
TypeError: Object of type AuthnRequest is not JSON serializable
...