django: augmenter BadRequest que l'exception?
Est-il possible d'augmenter BadRequest
comme exception dans django?
J'ai vu que vous pouvez soulever une 404 [1].
Cas d'utilisation: dans une méthode d'assistance que je charge un json à partir de la demande.OBTENIR. Si le json a été coupé depuis le navigateur (IE) couper l'url, je voudrais poser une correspondance d'exception.
Un BadRequest exception semble approprié, mais jusqu'à maintenant, il semble y aucune exception dans django.
En 1.6 il y a un SuspiciousOperation exception. Mais cela ne correspond pas à dans mon cas, puisqu'il n'est pas lié à la sécurité.
Bien sûr, je pourrais faire un essai..sauf autour de mon helper dans la méthode de vue, mais ce n'est pas SÈCHE.
Quelqu'un a une solution où je n'ai pas besoin d'essayer..exception autour de chaque appel de ma méthode d'aide?
[1] https://docs.djangoproject.com/en/1.6/ref/exceptions/#django.core.urlresolvers.Resolver404
Mise à jour
Exemple de Code:
def my_view(request):
data=load_data_from_request(request) # I don't want a try..except here: DRY
process_data(data)
return django.http.HttpResponse('Thank you')
def load_data_from_request(request):
try:
data_raw=json.loads(...)
except ValueError, exc:
raise BadRequest(exc)
...
return data
django.http.HttpResponseBadRequest
?Si vous voulez être à SEC, laissez votre méthode d'aide de retour à l'appropriées
HttpResponse
classe, ou d'en créer un autre raccourci autour d'elle, comme load_json_or_bad_request()
.Je ne veux pas rentrer
django.http.HttpResponseBadRequest
depuis ma méthode retourne l'analyse des données, à l'exception de l'entrée de données est interrompue.Après votre mise à jour, je pense que vous devez soulever une exception personnalisée et de les traiter dans un middleware comme suggéré par coldmind. C'est le même mécanisme utilisé par
get_object_or_404
OriginalL'auteur guettli | 2014-08-21
Vous devez vous connecter pour publier un commentaire.
Vous avez besoin personnalisé middleware pour gérer exception de ce que vous vous levez.
Vous avez besoin pour des exceptions à vérifier dans le middleware.
bon point, il suffit de garder à l'esprit que la ligne de commentaire est erronée, puisque vous revenez réponse (de la même façon dans tous les cas, pas seulement dans votre "exception". Ce pourrait être parfait ou mauvais selon le cas, je suis juste une clarification de la ligne de commentaire
Aussi cela fonctionne pour les versions < 1.10 voir: docs.djangoproject.com/en/1.10/releases/1.10/... et github.com/wagtail/wagtail/issues/2924 et
Je pense que le principal motif est grand ici, mais je suis vraiment pas satisfait de l'idée que le rendu de l'erreur est la chose qui décide de ce code HTTP revient. J'ai une réponse en bas de cette page qui n'a qu'une chose semblable, mais à l'aide d'un décorateur sur la vue au lieu de middleware. Peut-être mon préféré réponse est à l'aide de coldmind middleware ci-dessus, mais avec quelque chose comme mon "gestionnaire d'exception à l'adresse HTTP de la valeur de retour" code inséré.
OriginalL'auteur coldmind
Autres réponses sont en vous expliquant comment retourner une réponse HTTP avec 400 statut.
Si vous voulez brancher dans Django 400 erreur de manipulation, vous pouvez élever un
SuspiciousOperation
exception ou une sous-classe.Voir les docs ici et ici.
Dans votre exemple, il devrait ressembler à:
Ensuite, vous pouvez sous-classe il et de l'appeler quelque chose d'autre. Je pense que la "praticité beats pureté" s'applique ici...
C'est une manière objective mauvaise idée. Toute personne essayant d'attraper SuspiciousOperation pour des raisons de sécurité sera également attirer votre exception.
Comment dites-vous entre des raisons de sécurité et de mauvais commentaires? Si il y a un champ manquant il devrait évidemment être un "bad request". Mais que faire si le mal formé json est quelqu'un qui essaie de briser votre système? (c'est à dire l'écriture d'un gestionnaire personnalisé semble exagéré pour moi, mais je peux être convaincu du contraire :))
Juste assez, je peux voir que votre solution nécessite un beaucoup moins de code que mon "gestionnaire personnalisé' solution, qui est un gros plus, et a également entraîné dans ma réponse apparaissant beaucoup plus bas sur cette page. 🙂 Il y a quelques applications qui ont besoin de la fine de souplesse que gestionnaire personnalisé fournit, mais je suis d'accord ça ne s'applique pas à la plupart des projets.
OriginalL'auteur yprez
Comme une alternative à @coldmind réponse (conversion des exceptions dans une couche logicielle), vous pourriez mettre un décorateur sur votre point de vue de la fonction qui fait la même chose. Personnellement, je préfère cela, car c'est tout simplement le-vieux-Python, et ne pas exiger de moi de dépoussiérer ma connaissance de la façon dont Django middleware œuvres.
Vous ne souhaitez pas diffuser-de-la conscience inline toutes les fonctionnalités de votre point de vue fonctions (ce qui fait votre point de vue module dépendent tous de votre projet à d'autres modules, conduisant à "tout dépend de tout le reste' de l'architecture) au Lieu de cela, c'est mieux si la vue juste sait sur http. Il extrait ce dont vous avez besoin à partir de la demande, les délégués à certains autres "logique d'entreprise". La logique d'entreprise peut déléguer à d'autres modules (par exemple, code de base de données ou les interfaces avec d'autres systèmes externes.) Puis, finalement, la valeur de retour de votre logique métier est convertie en un http de la réponse par le point de vue de la fonction.
Mais comment communiquer les erreurs de retour à l'affichage de la fonction de la logique d'entreprise (ou de ce qu'il délègue à d')? En utilisant les valeurs de retour est gênant pour de nombreuses raisons. Par exemple, ces erreurs valeurs de retour devra être propogated retour à la vue de tous à travers l'ensemble de votre base de code. C'est souvent cripplingly malpropre parce que vous serez déjà en utilisant les valeurs de retour des fonctions à d'autres fins.
La façon naturelle de traiter cette question est d'utiliser des exceptions, mais la Django vue n'est pas, par elle-même, de convertir les exceptions non traitées dans HTTP renvoyé codes d'état (à l'exception de quelques cas particuliers, comme l'OP dit.)
. J'écris un décorateur d'appliquer à mon avis. Le décorateur convertit divers ont soulevé l'exception des types dans différents retourné django.http.HttpResponseXXX valeurs. e.g:
Selon les circonstances, vous pourriez trouver le même décorateur pourrait travailler à plusieurs, ou la totalité, de votre point de vue fonctions.
OriginalL'auteur Jonathan Hartley
HttpResponseBadRequest est prêt à l'emploi. Il est mis en œuvre :
Édité en raison de l'OP à jour question.
Vous pouvez créer votre propre helper et encapsuler bloc try-catch.
HttpResponseBadRequest exceptions sont grands, mais hors de la zone de Django ne pas généraliser à gérer d'autres de statut HTTP valeurs de cette façon. (Il serait peut-être très difficile pour eux de le faire - cartographie des types d'exception pour les codes d'état http est sans doute pas spécifique à l'application, à moins que vous vouliez juste de créer explicitement un type d'exception par le code d'état http, ce qui signifie que votre logique métier et le code qu'il délègue à serait criblé de connaissances sur les codes d'état http.) J'ai une réponse quelque part en bas sur cette page qui tente de remédier à cela, mais c'est un tas de code.
HttpResponseBadRequest n'est pas une exception, il ne peut pas être soulevé.
Je ne peux pas croire que cette réponse est une seule voix derrière ma propre réponse.
OriginalL'auteur dani herrera
Je ne suis pas sûr de ce que tu veux dire par le relèvement de BadRequest comme une exception.
Vous pouvez renvoyer une réponse avec n'importe quel code d'état que vous souhaitez, soit en utilisant explicitement le sous-classe pertinente de HttpResponse, ou par l'ajout d'un
status
paramètre de la réponse normale.au lieu de relancer Http404 élever Http400, la raison en est, je ne veux pas à vérifier en fonction de type de retour et puis, sur la base que le retour Reponse
OriginalL'auteur Daniel Roseman