我有一个经常使用的try
和except
,所以我想把它拿出来并把它变成其他文件中的function
,但我似乎无法制作它有效。
有人可以帮我一把吗?
这是我经常使用的代码
try:
user = get_object_or_404(User, email=data['email'])
except Exception as e:
print(e)
return JSONresponse(False, e.message)
我尝试将其制作成另一个文件并以此方式执行
def auth_token(data):
try:
return get_object_or_404(User, email=data['email'])
except Exception as e:
return JSONresponse({'status': False})
然后当我打电话给auth_token
时,我以另一种方式这样做,当然我确实导入了它
user = auth_token(data)
我可以理解这会返回给我JSONresponse({'status': False})
并尝试使用raise
,它会告诉我我无法使用JSONresponse
有人能告诉我这是怎么做到的吗?
答案 0 :(得分:1)
最佳做法是使用尽可能简单的参数(这使您的功能更容易测试)。
您在异常情况下寻找的内容可以从auth_token
通过您的观点发送:
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}))
然后用法:
def myview(request, ...):
token = auth_token(data['email'])
...
任何ImmediateHttpResponse
异常都将逃避视图,必须由中间件类获取。
不幸的是,Django没有ImmediateHttpResponse
类,但TastyPie有一个我们可以偷的。首先是异常类:
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._response
然后是中间件:
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
此类必须添加到MIDDLEWARE_CLASSES
文件中的settings.py
'mymiddleware.ImmediateHttpResponseMiddleware'
。