Bug #19106
crash sur autosave (token = None)
Statut:
Fermé
Priorité:
Normal
Assigné à:
-
Version cible:
-
Début:
29 septembre 2017
Echéance:
% réalisé:
0%
Temps estimé:
Patch proposed:
Non
Planning:
Non
Description
Exception: type = '<type 'exceptions.AttributeError'>', value = ''NoneType' object has no attribute 'startswith'' Stack trace (most recent call first): File "/usr/lib/python2.7/posixpath.py", line 75, in join 73 path = a 74 for b in p: > 75 if b.startswith('/'): 76 path = b 77 elif path == '' or path.endswith('/'): locals: a = '/var/lib/wcs/wcs.ville.fr/form_tokens' path = '/var/lib/wcs/wcs.ville.fr/form_tokens' b = None p = (None,) File "/usr/lib/python2.7/dist-packages/wcs/qommon/sessions.py", line 134, in get_form_token_filepath 132 133 def get_form_token_filepath(self, token): > 134 return os.path.join(get_publisher().form_tokens_dir, token) 135 136 def create_form_token(self): locals: token = None self = <BasicSession at 7f45204bdf50: None> File "/usr/lib/python2.7/dist-packages/wcs/qommon/sessions.py", line 143, in has_form_token 141 def has_form_token(self, token): 142 has_form_token = super(Session, self).has_form_token(token) > 143 if not os.path.exists(self.get_form_token_filepath(token)): 144 has_form_token = False 145 return has_form_token locals: has_form_token = False token = None self = <BasicSession at 7f45204bdf50: None> File "/usr/lib/python2.7/dist-packages/wcs/forms/root.py", line 915, in autosave 913 return json.dumps({'result': 'error', 'reason': reason}) 914 > 915 if not get_session().has_form_token(get_request().form.get('_ajax_form_token')): 916 return result_error('obsolete ajax form token') 917 locals: result_error = <function result_error at 0x7f452e1b09b0> self = <auquotidien.modules.formpage.AlternateFormPage object at 0x7f452052c110> File "/usr/lib/pymodules/python2.7/quixote/directory.py", line 67, in _q_traverse 65 raise TraversalError 66 elif hasattr(obj, '__call__'): > 67 return obj() 68 else: 69 return obj locals: component = 'autosave' self = <auquotidien.modules.formpage.AlternateFormPage object at 0x7f452052c110> obj = <bound method AlternateFormPage.autosave of <auquotidien.modules.formpage.AlternateFormPage object at 0x7f452052c110>> name = 'autosave' path = [] File "/usr/lib/pymodules/python2.7/quixote/directory.py", line 63, in _q_traverse 61 if path: 62 if hasattr(obj, '_q_traverse'): > 63 return obj._q_traverse(path) 64 else: 65 raise TraversalError locals: component = 'copie-d-acte-de-naissance' self = <auquotidien.modules.root.FormsRootDirectory object at 0x7f452052c510> obj = <auquotidien.modules.formpage.AlternateFormPage object at 0x7f452052c110> name = None path = ['autosave'] File "/usr/lib/pymodules/python2.7/quixote/directory.py", line 91, in _q_traverse 89 def _q_traverse(self, path): 90 self._q_access() > 91 return super(AccessControlled, self)._q_traverse(path) 92 93 locals: path = ['copie-d-acte-de-naissance', 'autosave'] self = <auquotidien.modules.root.FormsRootDirectory object at 0x7f452052c510> File "/usr/lib/pymodules/python2.7/quixote/directory.py", line 63, in _q_traverse 61 if path: 62 if hasattr(obj, '_q_traverse'): > 63 return obj._q_traverse(path) 64 else: 65 raise TraversalError locals: component = 'etat-civil' self = <auquotidien.modules.root.AlternateRootDirectory object at 0x7f4523516610> obj = <auquotidien.modules.root.FormsRootDirectory object at 0x7f452052c510> name = None path = ['copie-d-acte-de-naissance', 'autosave'] File "/usr/lib/python2.7/dist-packages/auquotidien/modules/root.py", line 847, in _q_traverse 845 return redirect('%s%s/%s' % (base_url, f.category.url_name, uri_rest)) 846 > 847 raise e 848 849 locals: path = ['etat-civil', 'copie-d-acte-de-naissance', 'autosave'] self = <auquotidien.modules.root.AlternateRootDirectory object at 0x7f4523516610> response = <wcs.qommon.http_response.HTTPResponse instance at 0x7f4520101638> File "/usr/lib/pymodules/python2.7/quixote/publish.py", line 253, in try_publish 251 permanent=True) 252 components = path[1:].split('/') > 253 output = self.root_directory._q_traverse(components) 254 # The callable ran OK, commit any changes to the session 255 self.finish_successful_request() locals: path = '/etat-civil/copie-d-acte-de-naissance/autosave' self = <wcs.compat.CompatWcsPublisher object at 0x7f45235165d0> request = <wcs.compat.CompatHTTPRequest instance at 0x7f4520101f38> components = ['etat-civil', 'copie-d-acte-de-naissance', 'autosave'] File "/usr/lib/python2.7/dist-packages/wcs/compat.py", line 184, in process_request 182 output = self.finish_interrupted_request(exc) 183 except Exception, exc: > 184 output = self.finish_failed_request() 185 response = request.response 186 locals: self = <wcs.compat.CompatWcsPublisher object at 0x7f45235165d0> request = <wcs.compat.CompatHTTPRequest instance at 0x7f4520101f38> exc = AttributeError("'NoneType' object has no attribute 'startswith'",) File "/usr/lib/python2.7/dist-packages/wcs/compat.py", line 216, in quixote 214 def quixote(request): 215 pub = get_publisher() > 216 return pub.process_request(pub.get_request()) 217 218 locals: request = <WSGIRequest: POST '/etat-civil/copie-d-acte-de-naissance/autosave'> pub = <wcs.compat.CompatWcsPublisher object at 0x7f45235165d0> File "/usr/lib/python2.7/dist-packages/django/core/handlers/base.py", line 132, in get_response 130 wrapped_callback = self.make_view_atomic(callback) 131 try: > 132 response = wrapped_callback(request, *callback_args, **callback_kwargs) 133 except Exception as e: 134 # If the view raised an exception, run it through exception locals: callback_args = () resolver_match = ResolverMatch(func=wcs.compat.quixote, args=(), kwargs={}, url_name=quixote, app_name=None, namespaces=[]) middleware_method = <bound method PublisherInitialisationMiddleware.process_request of <wcs.middleware.PublisherInitialisationMiddleware object at 0x7f4523542a90>> self = <django.core.handlers.wsgi.WSGIHandler object at 0x7f4526611c50> request = <WSGIRequest: POST '/etat-civil/copie-d-acte-de-naissance/autosave'> callback = <function quixote at 0x7f4524acb410> wrapped_callback = <function quixote at 0x7f4524acb410> resolver = <RegexURLResolver 'wcs.urls' (None:None) ^/> callback_kwargs = {} response = None urlconf = 'wcs.urls' File "/usr/lib/python2.7/dist-packages/django/core/handlers/wsgi.py", line 189, in __call__ 187 response = http.HttpResponseBadRequest() 188 else: > 189 response = self.get_response(request) 190 191 response._handler_class = self.__class__ locals: start_response = <built-in function uwsgi_spit> environ = {...} self = <django.core.handlers.wsgi.WSGIHandler object at 0x7f4526611c50> request = <WSGIRequest: POST '/etat-civil/copie-d-acte-de-naissance/autosave'> Cookies: wcs-5b70c2 '366c842009d9af6b' Environment: CONTENT_LENGTH '0' HTTP_ACCEPT '*/*' HTTP_ACCEPT_ENCODING 'gzip, deflate, br' HTTP_ACCEPT_LANGUAGE 'fr,fr-FR;q=0.8,en-US;q=0.5,en;q=0.3' HTTP_CONNECTION 'close' HTTP_COOKIE 'wcs-5b70c2="xxxxx"' HTTP_HOST 'wcs.ville.fr' HTTP_REFERER 'https://wcs.ville.fr/etat-civil/copie-d-acte-de-naissance/' HTTP_X_FORWARDED_PROTO 'https' HTTP_X_FORWARDED_PROTOCOL 'ssl' HTTP_X_FORWARDED_SSL 'on' HTTP_X_REQUESTED_WITH 'XMLHttpRequest' PATH_INFO '/etat-civil/copie-d-acte-de-naissance/autosave' QUERY_STRING '' REQUEST_METHOD 'POST' REQUEST_URI '/etat-civil/copie-d-acte-de-naissance/autosave' SCRIPT_NAME '' SERVER_NAME 'auquo' SERVER_PORT '80' SERVER_PROTOCOL 'HTTP/1.0'
Demandes liées
Historique
Mis à jour par Thomas Noël il y a plus de 6 ans
Trace jamais vue selon moi...
Donc « get_request().form.get('_ajax_form_token') » n'existe pas sur la requête, et à partir de là, boum. Je n'arrive pas à savoir si cette absence du champ caché _ajax_form_token est normale.
Mis à jour par Frédéric Péters il y a plus d'un an
- Statut changé de Nouveau à Fermé
- Planning mis à Non
Même trace, et corrigée, dans #19892.
Mis à jour par Frédéric Péters il y a plus d'un an
- Duplique Bug #19892: crash dans has_form_token parce que token vide, lors d'un autosave ajouté