Tengo un try y except que se usa muy a menudo, así que estoy pensando en sacarlo y convertirlo en una function en otro archivo, pero parece que no puedo hacer que funcione.
¿Puede alguien por favor darme una mano?
este es el código que uso muy, muy a menudo
try: user = get_object_or_404(User, email=data['email']) except Exception as e: print(e) return JSONresponse(False, e.message)Intenté convertirlo en otro archivo y lo hice de esta manera.
def auth_token(data): try: return get_object_or_404(User, email=data['email']) except Exception as e: return JSONresponse({'status': False}) luego, cuando llamo a auth_token , lo hice de esta manera de otra manera y, por supuesto, lo importé
user = auth_token(data) Puedo entender que esto me devolvería JSONresponse({'status': False}) e intenté usar raise y me diría que no puedo usar JSONresponse
¿Alguien puede darme una idea de cómo se puede hacer esto?
La mejor práctica es usar parámetros tan simples como sea posible (esto hace que su función sea más fácil de probar).
Lo que está buscando en el caso de excepción es algo que se puede enviar desde auth_token a través de su vista:
def auth_token(email): # this returns a User not a token..? try: return User.objects.get(email=email) except User.DoesNotExist: raise ImmediateHttpResponse(JSONresponse({'status': False}))El uso sería entonces:
def myview(request, ...): token = auth_token(data['email']) ... Cualquier excepción ImmediateHttpResponse escapará de la vista y debe ser recogida por una clase de middleware.
Desafortunadamente, Django no viene con una clase ImmediateHttpResponse , pero TastyPie tiene una que podemos robar. Primero la clase de excepción:
class ImmediateHttpResponse(Exception): """This exception is used to interrupt the flow of processing to immediately return a custom HttpResponse. Common uses include:: * for authentication (like digest/OAuth) * for throttling (from TastyPie). """ _response = http.HttpResponse("Nothing provided.") def __init__(self, response): self._response = response @property def response(self): return self._responseentonces el software intermedio:
from myexceptions import ImmediateHttpResponse class ImmediateHttpResponseMiddleware(object): """Middleware that handles ImmediateHttpResponse exceptions, allowing us to return a response from deep in form handling code. """ def process_exception(self, request, exception): if isinstance(exception, ImmediateHttpResponse): return exception.response return None Esta clase debe agregarse a su MIDDLEWARE_CLASSES en su archivo settings.py como 'mymiddleware.ImmediateHttpResponseMiddleware' .