Development #53403
erreur django-select2 (avec django 2.2 ?)
0%
Description
Internal Server Error: /visualization/warehouse/demarches_guichet_recette_grandlyon_com/formdata_voirie_et_signalisation/ NotImplementedError at /visualization/warehouse/demarches_guichet_recette_grandlyon_com/formdata_voirie_et_signalisation/ You need to overwrite "set_to_cache" or ensure that Select2ChoicesWidget is serialisable. Request Method: GET Request URL: https://statistiques.guichet-recette.grandlyon.com/visualization/warehouse/demarches_guichet_recette_grandlyon_com/formdata_voirie_et_signalisation/ Django Version: 2.2.20 Python Executable: /usr/bin/uwsgi-core Python Version: 3.7.3 Python Path: ['.', '', '/usr/lib/python37.zip', '/usr/lib/python3.7', '/usr/lib/python3.7/lib-dynload', '/usr/local/lib/python3.7/dist-packages', '/usr/lib/python3/dist-packages'] Server time: sam, 24 Avr 2021 11:39:17 +0200 Installed Applications: '' Installed Middleware: '' Traceback: File "/usr/lib/python3/dist-packages/django_select2/forms.py" in set_to_cache 261. cache.set(self._get_cache_key(), { File "/usr/lib/python3/dist-packages/django_select2/forms.py" in _get_cache_key 251. return "%s%s" % (settings.SELECT2_CACHE_PREFIX, id(self)) File "/usr/lib/python3/dist-packages/hobo/multitenant/apps.py" in <lambda> 22. conf.LazySettings.__getattr__ = lambda self, name: getattr(self._wrapped, name) File "/usr/lib/python3/dist-packages/hobo/multitenant/settings.py" in __getattr__ 97. return getattr(self.get_wrapped(), name) File "/usr/lib/python3/dist-packages/django/conf/__init__.py" in __getattr__ 222. return getattr(self.default_settings, name) During handling of the above exception ('Settings' object has no attribute 'SELECT2_CACHE_PREFIX'), another exception occurred: File "/usr/lib/python3/dist-packages/django/core/handlers/exception.py" in inner 34. response = get_response(request) File "/usr/lib/python3/dist-packages/django/core/handlers/base.py" in _get_response 145. response = self.process_exception_by_middleware(e, request) File "/usr/lib/python3/dist-packages/django/core/handlers/base.py" in _get_response 143. response = response.render() File "/usr/lib/python3/dist-packages/django/template/response.py" in render 106. self.content = self.rendered_content File "/usr/lib/python3/dist-packages/django/template/response.py" in rendered_content 83. content = template.render(context, self._request) File "/usr/lib/python3/dist-packages/django/template/backends/django.py" in render 61. return self.template.render(context) File "/usr/lib/python3/dist-packages/django/template/base.py" in render 171. return self._render(context) File "/usr/lib/python3/dist-packages/django/template/base.py" in _render 163. return self.nodelist.render(context) File "/usr/lib/python3/dist-packages/django/template/base.py" in render 937. bit = node.render_annotated(context) File "/usr/lib/python3/dist-packages/django/template/base.py" in render_annotated 904. return self.render(context) File "/usr/lib/python3/dist-packages/django/template/loader_tags.py" in render 150. return compiled_parent._render(context) File "/usr/lib/python3/dist-packages/django/template/base.py" in _render 163. return self.nodelist.render(context) File "/usr/lib/python3/dist-packages/django/template/base.py" in render 937. bit = node.render_annotated(context) File "/usr/lib/python3/dist-packages/django/template/base.py" in render_annotated 904. return self.render(context) File "/usr/lib/python3/dist-packages/django/template/loader_tags.py" in render 150. return compiled_parent._render(context) File "/usr/lib/python3/dist-packages/django/template/base.py" in _render 163. return self.nodelist.render(context) File "/usr/lib/python3/dist-packages/django/template/base.py" in render 937. bit = node.render_annotated(context) File "/usr/lib/python3/dist-packages/django/template/base.py" in render_annotated 904. return self.render(context) File "/usr/lib/python3/dist-packages/django/template/loader_tags.py" in render 150. return compiled_parent._render(context) File "/usr/lib/python3/dist-packages/django/template/base.py" in _render 163. return self.nodelist.render(context) File "/usr/lib/python3/dist-packages/django/template/base.py" in render 937. bit = node.render_annotated(context) File "/usr/lib/python3/dist-packages/django/template/base.py" in render_annotated 904. return self.render(context) File "/usr/lib/python3/dist-packages/django/template/loader_tags.py" in render 62. result = block.nodelist.render(context) File "/usr/lib/python3/dist-packages/django/template/base.py" in render 937. bit = node.render_annotated(context) File "/usr/lib/python3/dist-packages/django/template/base.py" in render_annotated 904. return self.render(context) File "/usr/lib/python3/dist-packages/django/template/loader_tags.py" in render 62. result = block.nodelist.render(context) File "/usr/lib/python3/dist-packages/django/template/base.py" in render 937. bit = node.render_annotated(context) File "/usr/lib/python3/dist-packages/django/template/base.py" in render_annotated 904. return self.render(context) File "/usr/lib/python3/dist-packages/django/template/defaulttags.py" in render 209. nodelist.append(node.render_annotated(context)) File "/usr/lib/python3/dist-packages/django/template/base.py" in render_annotated 904. return self.render(context) File "/usr/lib/python3/dist-packages/django/template/defaulttags.py" in render 309. return nodelist.render(context) File "/usr/lib/python3/dist-packages/django/template/base.py" in render 937. bit = node.render_annotated(context) File "/usr/lib/python3/dist-packages/django/template/base.py" in render_annotated 904. return self.render(context) File "/usr/lib/python3/dist-packages/django/template/loader_tags.py" in render 188. return template.render(context) File "/usr/lib/python3/dist-packages/django/template/base.py" in render 173. return self._render(context) File "/usr/lib/python3/dist-packages/django/template/base.py" in _render 163. return self.nodelist.render(context) File "/usr/lib/python3/dist-packages/django/template/base.py" in render 937. bit = node.render_annotated(context) File "/usr/lib/python3/dist-packages/django/template/base.py" in render_annotated 904. return self.render(context) File "/usr/lib/python3/dist-packages/django/template/base.py" in render 993. return render_value_in_context(output, context) File "/usr/lib/python3/dist-packages/django/template/base.py" in render_value_in_context 972. value = str(value) File "/usr/lib/python3/dist-packages/django/utils/html.py" in <lambda> 388. klass.__str__ = lambda self: mark_safe(klass_str(self)) File "/usr/lib/python3/dist-packages/django/forms/boundfield.py" in __str__ 33. return self.as_widget() File "/usr/lib/python3/dist-packages/django/forms/boundfield.py" in as_widget 93. renderer=self.form.renderer, File "/usr/lib/python3/dist-packages/django_select2/forms.py" in render 247. self.set_to_cache() File "/usr/lib/python3/dist-packages/django_select2/forms.py" in set_to_cache 267. raise NotImplementedError(msg % self.__class__.__name__) Exception Type: NotImplementedError at /visualization/warehouse/demarches_guichet_recette_grandlyon_com/formdata_voirie_et_signalisation/ Exception Value: You need to overwrite "set_to_cache" or ensure that Select2ChoicesWidget is serialisable. Request information: USER: cf6c572dee184210a3af6a0067fbfe GET: No GET data POST: No POST data FILES: No FILES data COOKIES: csrftoken-35eb5b = 'ZdCaJSVu6ipzMdX7ofLijYDBRxNQDxwQAw1UQKSyJjFw0Ja0gfN2RHEUaAp4YmVa' publik_portal_agent_url = 'https%3A%2F%2Fportail-agent.guichet-recette.grandlyon.com%2F' publik_portal_agent_title = 'Portail%20Agent' a2-opened-session-6cd604 = '1' sessionid-35eb5b = 'vhw2rpmq36v0q9vzwi7s572dfp5l0k9d' META: CSRF_COOKIE = 'ZdCaJSVu6ipzMdX7ofLijYDBRxNQDxwQAw1UQKSyJjFw0Ja0gfN2RHEUaAp4YmVa' CSRF_COOKIE_USED = True HTTP_ACCEPT = 'text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8' HTTP_ACCEPT_ENCODING = 'gzip, deflate, br' HTTP_ACCEPT_LANGUAGE = 'fr,en;q=0.7,es;q=0.3' HTTP_CONNECTION = 'close' HTTP_COOKIE = 'csrftoken-35eb5b=ZdCaJSVu6ipzMdX7ofLijYDBRxNQDxwQAw1UQKSyJjFw0Ja0gfN2RHEUaAp4YmVa; publik_portal_agent_url=https%3A%2F%2Fportail-agent.guichet-recette.grandlyon.com%2F; publik_portal_agent_title=Portail%20Agent; a2-opened-session-6cd604=1; sessionid-35eb5b=vhw2rpmq36v0q9vzwi7s572dfp5l0k9d' HTTP_DNT = '1' HTTP_HOST = 'statistiques.guichet-recette.grandlyon.com' HTTP_REFERER = 'https://statistiques.guichet-recette.grandlyon.com/' HTTP_SEC_GPC = '1' HTTP_UPGRADE_INSECURE_REQUESTS = '1' HTTP_USER_AGENT = 'Mozilla/5.0 (X11; Linux x86_64; rv:88.0) Gecko/20100101 Firefox/88.0' HTTP_X_FORWARDED_FOR = '77.109.96.212, 10.128.2.98' HTTP_X_FORWARDED_PORT = '443' HTTP_X_FORWARDED_PROTO = 'https' HTTP_X_FORWARDED_PROTOCOL = 'ssl' HTTP_X_FORWARDED_SSL = 'on' HTTP_X_REAL_IP = '10.128.2.98' PATH_INFO = '/visualization/warehouse/demarches_guichet_recette_grandlyon_com/formdata_voirie_et_signalisation/' QUERY_STRING = '' REMOTE_ADDR = '77.109.96.212' REQUEST_METHOD = 'GET' REQUEST_URI = '/visualization/warehouse/demarches_guichet_recette_grandlyon_com/formdata_voirie_et_signalisation/' SCRIPT_NAME = '' SERVER_NAME = 'pddv-gdlyon-gnm-front-2.synaaps.local' SERVER_PORT = '80' SERVER_PROTOCOL = 'HTTP/1.0' uwsgi.node = b'pddv-gdlyon-gnm-front-2.synaaps.local' uwsgi.version = b'2.0.18-debian' wsgi.errors = <_io.TextIOWrapper name=2 mode='w' encoding='UTF-8'> wsgi.file_wrapper = '' wsgi.input = <uwsgi._Input object at 0x7f8050c43f90> wsgi.multiprocess = True wsgi.multithread = False wsgi.run_once = False wsgi.url_scheme = 'https' wsgi.version = '(1, 0)' Settings: Using settings module
Fichiers
Révisions associées
Historique
Mis à jour par Valentin Deniaud il y a environ 3 ans
- Statut changé de Nouveau à En cours
Le gros de la trace c'est du bruit, l'important c'est au début 'Settings' object has no attribute 'SELECT2_CACHE_PREFIX')
.
Je ne reproduis ni en local ni sur le SaaS, il doit y avoir une conf particulière au CD31 et à GL...
Mis à jour par Frédéric Péters il y a environ 3 ans
Ça arrive où/comment settings.SELECT2_CACHE_PREFIX ?
Dans bijoe on l'utilis et on la définit uniquement dans les tests : (?)
bijoe/visualization/views.py: cache_key = '%s%s' % (settings.SELECT2_CACHE_PREFIX, key) tests/settings.py:SELECT2_CACHE_PREFIX = 'select2_'
Mis à jour par Frédéric Péters il y a environ 3 ans
Je me réponds, gros bazar django-appconf, qui fait qu'in fine ça vient de l'attribut CACHE_PREFIX de la classe dans le conf.py de django_select2.
Mis à jour par Valentin Deniaud il y a environ 3 ans
Oui et l'ajout dans les tests vient embrouiller le tout je crois qu'il ne sert à rien.
Mis à jour par Valentin Deniaud il y a environ 3 ans
Si je vais sur un shell des serveurs concernés et que je tape settings.SELECT2_CACHE_PREFIX
ça marche.
Comme ça m'a fait douter de mon analyse, je suis allé poser via hobo un SETTING_SELECT2_CACHE_PREFIX (sur GL) et hop ça remarche. Je l'enlève et hop ça replante.
Donc c'est bien ça, la pose des settings par défaut de django-select2 via django-appconf ne fonctionne plus sur ces serveurs en django 2.2.
Le fix simple sans comprendre ce serait de définir explicitement ça dans les settings de bijoe, ce que j'ai quand même bien envie de faire.
Mis à jour par Valentin Deniaud il y a environ 3 ans
- Fichier 0001-settings-explicitly-set-select2-cache-prefix-53403.patch 0001-settings-explicitly-set-select2-cache-prefix-53403.patch ajouté
- Tracker changé de Bug à Development
- Statut changé de En cours à Solution proposée
- Patch proposed changé de Non à Oui
Pas d'inspiration pour continuer l'analyse, patch sans comprendre donc.
Mis à jour par Emmanuel Cazenave il y a environ 3 ans
- Statut changé de Solution proposée à Solution validée
Mis à jour par Valentin Deniaud il y a environ 3 ans
- Statut changé de Solution validée à Résolu (à déployer)
commit aec477ddf36e7026e54e73461ab6af98121e0ba9 Author: Valentin Deniaud <vdeniaud@entrouvert.com> Date: Tue Apr 27 17:09:02 2021 +0200 settings: explicitly set select2 cache prefix (#53403)
Mis à jour par Frédéric Péters il y a environ 3 ans
- Statut changé de Résolu (à déployer) à Solution déployée
settings: explicitly set select2 cache prefix (#53403)