我目前有一些基于Django REST Framework的视图代码.我一直在使用客户异常类,但理想情况下我想使用内置的Django REST异常.
从下面的代码中我觉得这可能不是最好或最干净的方式来利用REST Framework异常.
有没有人有任何好的例子,他们正在捕捉问题并使用REST内置异常干净地返回它们?
class JSONResponse(HttpResponse):
def __init__(self, data, **kwargs):
content = JSONRenderer().render(data)
kwargs['content_type'] = 'application/json'
super(JSONResponse, self).__init__(content, **kwargs)
def queryInput(request):
try:
auth_token = session_id = getAuthHeader(request)
if not auth_token:
return JSONResponse({'detail' : "fail", "error" : "No X-Auth-Token Found", "data" : None}, status=500)
if request.method:
data = JSONParser().parse(request)
serializer = queryInputSerializer(data=data)
if request.method == 'POST':
if serializer.is_valid():
input= serializer.data["input"]
fetchData = MainRunner(input=input,auth_token=auth_token)
main_data = fetchData.main()
if main_data:
return JSONResponse({'detail' : "success", "error" : None, "data" : main_data}, …Run Code Online (Sandbox Code Playgroud) 我正在开发一个REST API,它接受来自一些真正脑死亡的软件的POST请求,这些软件无法补丁或其他任何东西.POST用于更新数据库中已存在的Model对象.
具体来说,我正在为具有相关字段的对象发布数据(SlugRelatedField,因为POSTer知道'name'属性但不知道'pk').但是,如果POSTer发送数据,其中'name'在SlugRelatedField上没有返回任何内容(例如,相关对象不存在),我需要返回404.我已经通过调试器进行了这项工作,但看起来DRF使用了一些Django信号魔法来实现它DRF Does It™,这将返回400 BAD REQUEST.我不知道如何修改这个 - 只有当它是上述条件而不是真正值得400的POST 时才进入404.
顺便说一句,pre_save()在我看来,在执行失败测试期间不执行.
这是序列化器:
class CharacterizationSerializer(serializers.ModelSerializer):
"""
Work-in-progress for django-rest-framework use. This handles (de)serialization
of data into a Characterization object and vice versa.
See: http://www.django-rest-framework.org/tutorial/1-serialization
"""
creator = serializers.Field(source='owner.user.username')
sample = serializers.SlugRelatedField(slug_field='name',
required=True,
many=False,
read_only=False)
class Meta:
model = Characterization
# leaving 'request' out because it's been decided to deprecate it. (...maybe?)
fields = ('sample', 'date', 'creator', 'comments', 'star_volume', 'solvent_volume',
'solution_center', 'solution_var', 'solution_minimum', 'solution_min_stddev',
'solution_test_len',)
Run Code Online (Sandbox Code Playgroud)
这里pre_save是在给定测试中没有运行的视图(但是在其他一些测试中运行): …