zestedesavoir / zds-site

Cœur du projet technique de Zeste de Savoir
https://zestedesavoir.com
Other
268 stars 161 forks source link

Erreur 500 lors d'une requête HEAD sur /api/membres/ #6580

Open philippemilink opened 9 months ago

philippemilink commented 9 months ago

Description du bug

Sentry nous rapporte qu'en faisant une requête HEAD sur la route /api/membres/, on obtient une erreur 500 :

TypeError: 'NoneType' object is not callable
[...]
  File "zds/member/api/views.py", line 115, in get
    return self.list(request, *args, **kwargs)
  File "rest_framework/mixins.py", line 42, in list
    serializer = self.get_serializer(page, many=True)
  File "rest_framework/generics.py", line 110, in get_serializer
    return serializer_class(*args, **kwargs)

De ce que j'ai compris, ça vient du fait que la méthode get_serializer_class() ne renvoie rien (donc None) si la requête n'est pas GET ou POST : https://github.com/zestedesavoir/zds-site/blob/738f5772ced7d18be8e29a9f05180c3ccaea272c/zds/member/api/views.py#L138-L142

Comment reproduire ?

curl --head http://127.0.0.1:8000/api/membres/

Comportement attendu

Pas une erreur 500.

Je ne sais pas comment traiter ce problème. Est-ce qu'il faut interdire toutes les requêtes HEAD ? Dans ce cas y a-t-il quelque part un paramètre qui permet de faire ça pour toute l'API ? (je ne suis même pas sûr que ce soit souhaitable...) Est-ce qu'il faut simplement traiter le cas si la requête est de type HEAD dans get_serializer_class() ? Dans ce cas quelle donnée on renvoie ?

Si on fait une requête HEAD sur la route qui donne les infos d'un membre en particulier, on n'obtient pas une 500, mais une belle 200 OK...