我正在使用Django 1.6和Django REST Framework。
我有一个非常简单的观点。出于演示目的,我希望它在收到GET请求时返回所有用户的电子邮件地址,并在收到POST请求时返回相同的电子邮件地址。
这是我正在使用的代码:
from rest_framework.views import APIView
from rest_framework.response import Response
from rest_framework import authentication, permissions
from core import models
class ListUsers(APIView):
def get(self, request, format=None):
usernames = [user.email for user in models.User.objects.all()]
return Response(usernames)
def post(self, request):
usernames = [user.email for user in models.User.objects.all()]
return Response(usernames)
当我做GET它工作正常,但是当我做POST时我得到这个错误:
No exception message supplied
我无法弄清楚问题是什么,我已经尝试了所有我能想到的东西,我已经搜索过Django REST Framework文档但找不到任何东西。
非常感谢任何帮助。提前谢谢。
更新 按要求堆栈跟踪: 环境:
Request Method: POST
Request URL: http://localdev:1989/api/rest/v1/register
Django Version: 1.6
Python Version: 2.7.3
Installed Applications:
('django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
'rest_framework',
'core',
'apiv1')
Installed Middleware:
('django.contrib.sessions.middleware.SessionMiddleware',
'django.middleware.common.CommonMiddleware',
'django.middleware.csrf.CsrfViewMiddleware',
'django.contrib.auth.middleware.AuthenticationMiddleware',
'django.contrib.messages.middleware.MessageMiddleware',
'django.middleware.clickjacking.XFrameOptionsMiddleware')
Traceback:
File "/usr/local/virtualenvs/wedding/local/lib/python2.7/site-packages/django/core/handlers/base.py" in get_response
139. response = response.render()
File "/usr/local/virtualenvs/wedding/local/lib/python2.7/site-packages/django/template/response.py" in render
105. self.content = self.rendered_content
File "/usr/local/virtualenvs/wedding/local/lib/python2.7/site-packages/rest_framework/response.py" in rendered_content
59. ret = renderer.render(self.data, media_type, context)
File "/usr/local/virtualenvs/wedding/local/lib/python2.7/site-packages/rest_framework/renderers.py" in render
577. context = self.get_context(data, accepted_media_type, renderer_context)
File "/usr/local/virtualenvs/wedding/local/lib/python2.7/site-packages/rest_framework/renderers.py" in get_context
554. 'post_form': self.get_rendered_html_form(view, 'POST', request),
File "/usr/local/virtualenvs/wedding/local/lib/python2.7/site-packages/rest_framework/renderers.py" in get_rendered_html_form
423. data = request.DATA
File "/usr/local/virtualenvs/wedding/local/lib/python2.7/site-packages/rest_framework/request.py" in DATA
197. self._load_data_and_files()
File "/usr/local/virtualenvs/wedding/local/lib/python2.7/site-packages/rest_framework/request.py" in _load_data_and_files
267. self._data, self._files = self._parse()
File "/usr/local/virtualenvs/wedding/local/lib/python2.7/site-packages/rest_framework/request.py" in _parse
359. parsed = parser.parse(stream, media_type, self.parser_context)
File "/usr/local/virtualenvs/wedding/local/lib/python2.7/site-packages/rest_framework/parsers.py" in parse
63. raise ParseError('JSON parse error - %s' % six.text_type(exc))
Exception Type: ParseError at /api/rest/v1/register
Exception Value:
我发现它是由提交的错误JSON引起的。例如,如果我有一个额外的逗号。如何使此返回错误消息而不是此500错误?
更新2 POST数据:
{
"email": "my@email.com",
"full_name": "mark winterbottom",
"password": "2secure4u",
}
答案 0 :(得分:1)
如果您想要一般错误页面,则应该可以在 urls.py 中设置handler500 url handler。我还注意到你不接受post
方法的格式kwarg。你可能想在那里添加它。
另一种可能性是覆盖视图类的dispatch方法并在那里捕获异常,ála:
class ListUsers(APIView):
def dispatch(self, *args, **kwargs):
try:
return super(ListUsers, self).dispatch(*args, **kwargs)
except ParseError:
pass
# Show an error page
def get(self, request, format=None):
usernames = [user.email for user in models.User.objects.all()]
return Response(usernames)
def post(self, request):
usernames = [user.email for user in models.User.objects.all()]
return Response(usernames)