django:当 debug = False 时显示数据库错误

标签 django exception error-handling django-rest-framework

我正在使用 Django Rest Framework 在现有数据库上执行 get() post() 。在模型中,我没有定义任何主键或外键关系,因为这些约束是在数据库级别处理的。当我有 debug = True在 settings.py 文件中,会显示带有回溯的数据库级错误。但是,当 debug = False 时,我希望在响应中显示错误。

例如:错误信息:

IntegrityError at /dqf_api/ReceiptLog/
(1062, "Duplicate entry 'ede pivot-dummy-ede_case_76-ede pivot command 76' for key 'PRIMARY'")

当 debug = True 时,会显示。当 debug = False 时,如何捕获并显示此错误?

编辑 : 包括代码模块

模型.py
class TestCaseCommandRun(models.Model):
   # fields ..Doesn't have id field as the database doesn't have it
   class Meta:
      managed = False
      db_table = 'test_case_command_run'
      unique_together = (('team_name', 'suite_name', 'suite_run_id', 'case_name', 'command_name'),)


class TestCaseCommandRunResults(models.Model):
    # fields ..Doesn't have id field as the database doesn't have it
    class Meta:
        managed = False
        db_table = 'test_case_command_run_results'
        unique_together = (('suite_run_id', 'command_run_id', 'rule_name', 'result_id'),)

View .py
class TestCaseCommandRunViewSet(viewsets.ModelViewSet):
    queryset = models.TestCaseCommandRunViewSet.objects.values('team_name','suite_name','suite_run_id', 'case_name','command_name','command_run_id','run_start','run_end','result','run_status')
    serializer_class = serializers.TestCaseCommandRunViewSet

class TestCaseCommandRunResultsViewSet(viewsets.ModelViewSet):
    queryset = models.TestCaseCommandRunResultsViewSet.objects.values('suite_run_id','command_run_id','rule_name', 'result_id',
                                                           'result','expected_values','actual_values','report_values','extended_values')
    serializer_class = serializers.TestCaseCommandRunResultsViewSet

class ReceiptLogViewSet(CreateAPIView):
    serializer_class = serializers.ReceiptLogSerializer.ReceiptLogSerializerClass

序列化程序.py
class TestCaseCommandRunResultsViewSet(serializers.ModelSerializer):
    class Meta:
        model = models.TestCaseCommandRunResultsViewSet
        fields = ['suite_run_id','command_run_id','rule_name', 'result_id','result','expected_values','actual_values','report_values','extended_values']

class TestCaseCommandRunSerializer(serializers.ModelSerializer):
    class Meta:
        model = models.TestCaseCommandRunSerializer
        fields = ['team_name','suite_name','suite_run_id', 'case_name','command_name','command_run_id','run_start','run_end','result','run_status']

class ReceiptLogSerializerClass(serializers.Serializer):
    team_name = serializers.CharField(max_length=30)
    suite_name = serializers.CharField(max_length=100)
    suite_run_id = serializers.CharField(max_length=50,required=False, allow_blank=True, default=datetime.now().strftime('%Y%m%d%H%M%S'))
    case_name = serializers.CharField(max_length=50)
    command_name = serializers.CharField(max_length=50)
    command_run_id = serializers.CharField(max_length=50,required=False, allow_blank=True, default='Not Applicable')
    run_start = serializers.DateTimeField(default=datetime.now, required=False)
    run_end = serializers.DateTimeField(default=datetime.now, required=False)
    result = serializers.CharField(max_length=10, default='Not Applicable')
    run_status = serializers.CharField(max_length=10)
    rule_name = serializers.CharField( max_length=50, required=False, allow_blank=True,  default='Not Applicable')
    expected_values = serializers.CharField(max_length=200, allow_blank=True)
    actual_values = serializers.CharField(max_length=200, allow_blank=True)
    report_values = serializers.CharField(max_length=200, allow_blank=True)
    extended_values = serializers.CharField(max_length=200, allow_blank=True)

    def create(self, validated_data):
    team_name = validated_data.get('team_name', None)
    suite_name = validated_data.get('suite_name', None)
    suite_run_id = validated_data.get('suite_run_id', None)
    case_name = validated_data.get('case_name', None)
    command_name = validated_data.get('command_name', None)
    command_run_id = validated_data.get('command_run_id', None)
    run_start = validated_data.get('run_start', None)
    run_end = validated_data.get('run_end', None)
    result = validated_data.get('result', None)
    run_status = validated_data.get('run_status', None)
    rule_name = validated_data.get('rule_name', None)
    expected_values = validated_data.get('expected_values', None)
    actual_values = validated_data.get('actual_values', None)
    report_values = validated_data.get('report_values', None)
    extended_values = validated_data.get('extended_values', None)

    test_case_command_run_data = {
        'team_name': team_name,
        'suite_name': suite_name,
        'suite_run_id': suite_run_id,
        'case_name': case_name,
        'command_name': command_name,
        'command_run_id': command_run_id,
        'run_start': run_start,
        'run_end': run_end,
        'result': result,
        'run_status': run_status
    }
    TestCaseCommandRunSerializer.create(TestCaseCommandRunSerializer(), validated_data=test_case_command_run_data)

    test_case_command_run_result_data = {
        'suite_run_id': suite_run_id,
        'command_run_id': command_run_id,
        'rule_name': rule_name,
        'result_id':  self.result_id,
        'result': result,
        'expected_values': expected_values,
        'actual_values': actual_values,
        'report_values': report_values,
        'extended_values': extended_values,
    }
    TestCaseCommandRunResultsSerializer.create(TestCaseCommandRunResultsSerializer(), validated_data=test_case_command_run_result_data)

    self.result_id += 1
    return validated_data

网址.py
router = routers.DefaultRouter()
router.register(r'test_case_command_runs', views.TestCaseCommandRunViewSet)
router.register(r'test_case_command_run_results', views.TestCaseCommandRunResultsViewSet)
urlpatterns = [
    url(r'^dqf_api/', include(router.urls)),
    url(r'^dqf_api/ReceiptLog/', views.ReceiptLogView.ReceiptLogViewSet.as_view(), name='ReceiptLog')]

编辑:代码修复

将此添加到 serializers.py
def create(self, validated_data):
    try:
        return super().create(validated_data)
    except IntegrityError as e:
        error_msg = "IntegrityError occurred while creating entry in test_case_command_run_result model. Detailed Error: %s" %e
        raise serializers.ValidationError(error_msg)

最佳答案

也许尝试这样的事情:

if serializer.is_valid():
    serializer.save()
    return Response("success")
else:
    return Response(serialzier.errors)

关于django:当 debug = False 时显示数据库错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55252093/

相关文章:

oracle - 如何从 RAISED 异常中获取 oracle PL/SQL 中原始异常的堆栈跟踪?

debugging - 调试器/异常如何在已编译的程序上工作?

error-handling - iOS9 Storyboard 什么是未处理的 Action (handleNonLaunchSpecificActions)?

swift - “ fatal error :在展开可选值时意外发现nil”是什么意思?

python - ModuleNotFoundError : No module named 'bootstrap4'

python - 在 Django 中创建模型实例时如何获取模型的长度

python - 为什么 select_for_update 对于不支持它的数据库会被忽略?

python - 使用 Django 选择不在另一个表中的值

PHP PDOException -- 无效参数编号 : Columns/Parameters are 1-based

php - 捕获php中无效输入的最快方法