error-handling - Django Rest Framework 3.10.3未运行异常处理程序

标签 error-handling django-rest-framework

我正在尝试我的第一个django rest框架应用程序,我正在使用djangorestframework == 3.10.3

我创建了一个简单的项目:

./mysite
./mysite/__init__.py
./mysite/settings.py
./mysite/urls.py
./mysite/wsgi.py
./db.sqlite3
./polls
./polls/migrations
./polls/migrations/__init__.py
./polls/models.py
./polls/__init__.py
./polls/apps.py
./polls/admin.py
./polls/exceptions.py
./polls/tests.py
./polls/urls.py
./polls/views.py
./manage.py

我在民意调查应用程序中有一个 View ,该 View 仅引发一个ParseError,这是一个ApiException(根据由自定义异常https://www.django-rest-framework.org/api-guide/exceptions/#custom-exception-handling处理的文档)
from django.views.decorators.csrf import csrf_exempt
from rest_framework.exceptions import ParseError

# Create your views here.
@csrf_exempt
def test_view(request):
    raise ParseError("test!", 409)

这是我的自定义异常(exception),位于polls/exceptions.py

从rest_framework.views导入exception_handler
def base_exception_handler(exc, context):
    print('DEBUUUUUUUUUG!!!!!!!')
    return JsonResponse({"message": "base exception", "status": 404}, status=404)

最后是mysite/settings.py-注册自定义异常处理程序(文件的所有其余部分均为默认值):
...
INSTALLED_APPS = [
    'polls.apps.PollsConfig',
    'rest_framework',
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
]
...
REST_FRAMEWORK = {
    'EXCEPTION_HANDLER': 'polls.exceptions.base_exception_handler',
}

当运行服务器并导航到http://localhost:8000/test定义的 View 时,我得到:
  • (如果我将debug设置为True)-我得到异常页面,并抛出了
  • (如果我将debug设置为False)-我得到一个带有服务器错误(500)的HTML页面

  • 我试图通过在rest_framework.views.exception_handler上设置断点来检查是否执行了默认异常处理程序(我没有对其进行任何更改,因此应按照文档中的描述使用默认值),但是未调用它。我得到一个HTML页面作为响应。

    这是我正在使用的软件包(requirements.txt):
    Django==2.2.7
    djangorestframework==3.10.3
    pytz==2019.3
    sqlparse==0.3.0
    

    您的帮助将不胜感激。

    最佳答案

    如果有人遇到同样的问题,这是解决方案。问题在于函数 View 缺少@api_view()装饰器,从而解决了该问题:

    from django.views.decorators.csrf import csrf_exempt
    from rest_framework.exceptions import ParseError
    from rest_framework.decorators import api_view
    
    # Create your views here.
    @csrf_exempt
    @api_view()
    def test_view(request):
            raise ParseError("test!", 409)
    

    如果文档对此进行更详细的介绍,那将是很好的。

    关于error-handling - Django Rest Framework 3.10.3未运行异常处理程序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58785136/

    相关文章:

    python - 使用带有前缀 View 名称的 Django HyperlinkedModelSerializer

    python - 有没有办法允许 Django 休息框架的空白数据

    python - 如何获取 request.user 和特定用户的(特定模型的)记录?

    python - djangorestframework user_id 违反非空约束

    php - #2003 - 无法连接到 'localhost' 上的 MySQL 服务器 (10061)

    php - 在上传文件时显示 undefined index

    php - 无法将类型Illuminate\\Http\\JsonResponse的对象用作Laravel中的数组

    ruby-on-rails - Heroku上的Rails 4中的自定义错误页面

    python - 代码设计和错误处理 : exit program with an error in python

    python - 使用序列化程序从 URL 保存图像