Pet*_*Tao 9 python django postgresql
在尝试使用 Django Rest Framework 在 Django 中编写对象级权限时,我遇到了这个错误(底部的完整错误日志)
django.core.exceptions.ValidationError: ["'' is not a valid UUID."]
Run Code Online (Sandbox Code Playgroud)
错误来自获取查询,ship = Ship.objects.get(id=shipID)。见文件:
from rest_framework.permissions import BasePermission
from Ships.models import Ship
import logging
logging.basicConfig(format='%(levelname)s:%(message)s', level=logging.DEBUG)
class HasObjectLevelPermissions(BasePermission):
def has_permission(self, request, view):
if request.method == "GET":
return True
else:
logging.debug("not a GET request")
shipID = request.POST.get('id',None)
try:
ship = Ship.objects.get(id=shipID) # This line is the issue
return request.user.userprofile.ship.id == ship.id
except:
logging.debug("Error in finding ship when checking permissions")
return False
Run Code Online (Sandbox Code Playgroud)
下面是声明 UUID 的 Ship 模型。
class Ship(models.Model):
id = models.UUIDField(primary_key=True, default=uuid.uuid4, editable=False)
regNum = models.CharField(max_length=100, blank=False, db_index=True)
year = models.IntegerField(blank=True)
make = models.CharField(max_length=255)
length = models.IntegerField(blank=True)
beam = models.IntegerField(blank=True)
fleet = models.ForeignKey(Fleet)
created = models.DateTimeField(auto_now_add=True, db_index=True)
def getRegNum(self):
return self.regNum
Run Code Online (Sandbox Code Playgroud)
调试尝试
ship = Ship.objects.get(id=shipID)为ship = Ship.objects.get(id="some string")使验证错误消失。ship = Ship.objects.get(id=shipID)为ship = Ship.objects.get(id="")使验证错误消失。这个很有趣,因为一个空字符串通过了验证。shipID = request.POST.get('id',None)为shipID = request.GET.get('id',None)使验证错误消失。class UUIDField(Field):。从 POST 正文记录 id。
System check identified no issues (0 silenced).
June 21, 2017 - 00:44:24
Django version 1.11.1, using settings 'First_REST_API.settings'
Starting development server at http://127.0.0.1:8000/
Quit the server with CTRL-BREAK.
DEBUG:CHECKING PERMISSIONS
DEBUG:not a GET request
DEBUG:6b25b0be-610a-49f5-ad60-6df9564185a0
Internal Server Error: /ships
Traceback (most recent call last):
'''Same error as below'''
本质上,我正在尝试检索与 ID 匹配的 Ship 对象。这种类型的查询过去一直使用字符串,不确定为什么验证错误不断出现。有任何想法吗?
完整的错误日志
Internal Server Error: /ships
Traceback (most recent call last):
File "C:\Users\ptao\Desktop\ViaFleet\VirtualEnvironment\lib\site-packages\django\db\models\fields\__init__.py", line 2392, in to_python
return uuid.UUID(value)
File "C:\Users\ptao\AppData\Local\Programs\Python\Python36-32\lib\uuid.py", line 140, in __init__
raise ValueError('badly formed hexadecimal UUID string')
ValueError: badly formed hexadecimal UUID string
During handling of the above exception, another exception occurred:
Traceback (most recent call last):
File "C:\Users\ptao\Desktop\ViaFleet\VirtualEnvironment\lib\site-packages\django\core\handlers\exception.py", line 41, in inner
response = get_response(request)
File "C:\Users\ptao\Desktop\ViaFleet\VirtualEnvironment\lib\site-packages\django\core\handlers\base.py", line 187, in _get_response
response = self.process_exception_by_middleware(e, request)
File "C:\Users\ptao\Desktop\ViaFleet\VirtualEnvironment\lib\site-packages\django\core\handlers\base.py", line 185, in _get_response
response = wrapped_callback(request, *callback_args, **callback_kwargs)
File "C:\Users\ptao\Desktop\ViaFleet\VirtualEnvironment\lib\site-packages\django\views\decorators\csrf.py", line 58, in wrapped_view
return view_func(*args, **kwargs)
File "C:\Users\ptao\Desktop\ViaFleet\VirtualEnvironment\lib\site-packages\django\views\generic\base.py", line 68, in view
return self.dispatch(request, *args, **kwargs)
File "C:\Users\ptao\Desktop\ViaFleet\VirtualEnvironment\lib\site-packages\rest_framework\views.py", line 489, in dispatch
response = self.handle_exception(exc)
File "C:\Users\ptao\Desktop\ViaFleet\VirtualEnvironment\lib\site-packages\rest_framework\views.py", line 449, in handle_exception
self.raise_uncaught_exception(exc)
File "C:\Users\ptao\Desktop\ViaFleet\VirtualEnvironment\lib\site-packages\rest_framework\views.py", line 486, in dispatch
response = handler(request, *args, **kwargs)
File "C:\Users\ptao\Desktop\ViaFleet\ViaDjango\First_REST_API\Ships\views.py", line 110, in delete
ship = Ship.objects.get(id=id)
File "C:\Users\ptao\Desktop\ViaFleet\VirtualEnvironment\lib\site-packages\django\db\models\manager.py", line 85, in manager_method
return getattr(self.get_queryset(), name)(*args, **kwargs)
File "C:\Users\ptao\Desktop\ViaFleet\VirtualEnvironment\lib\site-packages\django\db\models\query.py", line 374, in get
num = len(clone)
File "C:\Users\ptao\Desktop\ViaFleet\VirtualEnvironment\lib\site-packages\django\db\models\query.py", line 232, in __len__
self._fetch_all()
File "C:\Users\ptao\Desktop\ViaFleet\VirtualEnvironment\lib\site-packages\django\db\models\query.py", line 1103, in _fetch_all
self._result_cache = list(self._iterable_class(self))
File "C:\Users\ptao\Desktop\ViaFleet\VirtualEnvironment\lib\site-packages\django\db\models\query.py", line 53, in __iter__
results = compiler.execute_sql(chunked_fetch=self.chunked_fetch)
File "C:\Users\ptao\Desktop\ViaFleet\VirtualEnvironment\lib\site-packages\django\db\models\sql\compiler.py", line 863, in execute_sql
sql, params = self.as_sql()
File "C:\Users\ptao\Desktop\ViaFleet\VirtualEnvironment\lib\site-packages\django\db\models\sql\compiler.py", line 420, in as_sql
where, w_params = self.compile(self.where) if self.where is not None else ("", [])
File "C:\Users\ptao\Desktop\ViaFleet\VirtualEnvironment\lib\site-packages\django\db\models\sql\compiler.py", line 373, in compile
sql, params = node.as_sql(self, self.connection)
File "C:\Users\ptao\Desktop\ViaFleet\VirtualEnvironment\lib\site-packages\django\db\models\sql\where.py", line 79, in as_sql
sql, params = compiler.compile(child)
File "C:\Users\ptao\Desktop\ViaFleet\VirtualEnvironment\lib\site-packages\django\db\models\sql\compiler.py", line 373, in compile
sql, params = node.as_sql(self, self.connection)
File "C:\Users\ptao\Desktop\ViaFleet\VirtualEnvironment\lib\site-packages\django\db\models\lookups.py", line 170, in as_sql
rhs_sql, rhs_params = self.process_rhs(compiler, connection)
File "C:\Users\ptao\Desktop\ViaFleet\VirtualEnvironment\lib\site-packages\django\db\models\lookups.py", line 103, in process_rhs
return self.get_db_prep_lookup(value, connection)
File "C:\Users\ptao\Desktop\ViaFleet\VirtualEnvironment\lib\site-packages\django\db\models\lookups.py", line 196, in get_db_prep_lookup
[get_db_prep_value(value, connection, prepared=True)]
File "C:\Users\ptao\Desktop\ViaFleet\VirtualEnvironment\lib\site-packages\django\db\models\fields\__init__.py", line 2383, in get_db_prep_value
value = self.to_python(value)
File "C:\Users\ptao\Desktop\ViaFleet\VirtualEnvironment\lib\site-packages\django\db\models\fields\__init__.py", line 2397, in to_python
params={'value': value},
django.core.exceptions.ValidationError: ["'' is not a valid UUID."]
ERROR:Internal Server Error: /ships
Traceback (most recent call last):
File "C:\Users\ptao\Desktop\ViaFleet\VirtualEnvironment\lib\site-packages\django\db\models\fields\__init__.py", line 2392, in to_python
return uuid.UUID(value)
File "C:\Users\ptao\AppData\Local\Programs\Python\Python36-32\lib\uuid.py", line 140, in __init__
raise ValueError('badly formed hexadecimal UUID string')
ValueError: badly formed hexadecimal UUID string
During handling of the above exception, another exception occurred:
Traceback (most recent call last):
File "C:\Users\ptao\Desktop\ViaFleet\VirtualEnvironment\lib\site-packages\django\core\handlers\exception.py", line 41, in inner
response = get_response(request)
File "C:\Users\ptao\Desktop\ViaFleet\VirtualEnvironment\lib\site-packages\django\core\handlers\base.py", line 187, in _get_response
response = self.process_exception_by_middleware(e, request)
File "C:\Users\ptao\Desktop\ViaFleet\VirtualEnvironment\lib\site-packages\django\core\handlers\base.py", line 185, in _get_response
response = wrapped_callback(request, *callback_args, **callback_kwargs)
File "C:\Users\ptao\Desktop\ViaFleet\VirtualEnvironment\lib\site-packages\django\views\decorators\csrf.py", line 58, in wrapped_view
return view_func(*args, **kwargs)
File "C:\Users\ptao\Desktop\ViaFleet\VirtualEnvironment\lib\site-packages\django\views\generic\base.py", line 68, in view
return self.dispatch(request, *args, **kwargs)
File "C:\Users\ptao\Desktop\ViaFleet\VirtualEnvironment\lib\site-packages\rest_framework\views.py", line 489, in dispatch
response = self.handle_exception(exc)
File "C:\Users\ptao\Desktop\ViaFleet\VirtualEnvironment\lib\site-packages\rest_framework\views.py", line 449, in handle_exception
self.raise_uncaught_exception(exc)
File "C:\Users\ptao\Desktop\ViaFleet\VirtualEnvironment\lib\site-packages\rest_framework\views.py", line 486, in dispatch
response = handler(request, *args, **kwargs)
File "C:\Users\ptao\Desktop\ViaFleet\ViaDjango\First_REST_API\Ships\views.py", line 110, in delete
ship = Ship.objects.get(id=id)
File "C:\Users\ptao\Desktop\ViaFleet\VirtualEnvironment\lib\site-packages\django\db\models\manager.py", line 85, in manager_method
return getattr(self.get_queryset(), name)(*args, **kwargs)
File "C:\Users\ptao\Desktop\ViaFleet\VirtualEnvironment\lib\site-packages\django\db\models\query.py", line 374, in get
num = len(clone)
File "C:\Users\ptao\Desktop\ViaFleet\VirtualEnvironment\lib\site-packages\django\db\models\query.py", line 232, in __len__
self._fetch_all()
File "C:\Users\ptao\Desktop\ViaFleet\VirtualEnvironment\lib\site-packages\django\db\models\query.py", line 1103, in _fetch_all
self._result_cache = list(self._iterable_class(self))
File "C:\Users\ptao\Desktop\ViaFleet\VirtualEnvironment\lib\site-packages\django\db\models\query.py", line 53, in __iter__
results = compiler.execute_sql(chunked_fetch=self.chunked_fetch)
File "C:\Users\ptao\Desktop\ViaFleet\VirtualEnvironment\lib\site-packages\django\db\models\sql\compiler.py", line 863, in execute_sql
sql, params = self.as_sql()
File "C:\Users\ptao\Desktop\ViaFleet\VirtualEnvironment\lib\site-packages\django\db\models\sql\compiler.py", line 420, in as_sql
where, w_params = self.compile(self.where) if self.where is not None else ("", [])
File "C:\Users\ptao\Desktop\ViaFleet\VirtualEnvironment\lib\site-packages\django\db\models\sql\compiler.py", line 373, in compile
sql, params = node.as_sql(self, self.connection)
File "C:\Users\ptao\Desktop\ViaFleet\VirtualEnvironment\lib\site-packages\django\db\models\sql\where.py", line 79, in as_sql
sql, params = compiler.compile(child)
File "C:\Users\ptao\Desktop\ViaFleet\VirtualEnvironment\lib\site-packages\django\db\models\sql\compiler.py", line 373, in compile
sql, params = node.as_sql(self, self.connection)
File "C:\Users\ptao\Desktop\ViaFleet\VirtualEnvironment\lib\site-packages\django\db\models\lookups.py", line 170, in as_sql
rhs_sql, rhs_params = self.process_rhs(compiler, connection)
File "C:\Users\ptao\Desktop\ViaFleet\VirtualEnvironment\lib\site-packages\django\db\models\lookups.py", line 103, in process_rhs
return self.get_db_prep_lookup(value, connection)
File "C:\Users\ptao\Desktop\ViaFleet\VirtualEnvironment\lib\site-packages\django\db\models\lookups.py", line 196, in get_db_prep_lookup
[get_db_prep_value(value, connection, prepared=True)]
File "C:\Users\ptao\Desktop\ViaFleet\VirtualEnvironment\lib\site-packages\django\db\models\fields\__init__.py", line 2383, in get_db_prep_value
value = self.to_python(value)
File "C:\Users\ptao\Desktop\ViaFleet\VirtualEnvironment\lib\site-packages\django\db\models\fields\__init__.py", line 2397, in to_python
params={'value': value},
django.core.exceptions.ValidationError: ["'' is not a valid UUID."]
[21/Jun/2017 00:08:53] "DELETE /ships HTTP/1.1" 500 20510
Run Code Online (Sandbox Code Playgroud)
编辑
该问题是由于 views.py 中的错误造成的。感谢@Sardorbek Imomaliev 指出这一点。id = request.GET.get('id', '')应该是id = request.POST.get('id', '')。请注意 request.POST 将包含 DELETE 请求正文。有关更多信息,请参阅此帖子下的评论。感谢所有帮助过的人。
class ShipEndpoint(generics.ListAPIView):
permission_classes = (IsAuthenticated,HasObjectLevelPermissions)
''' get, post not shown'''
def delete(self, request, format=None):
id = request.GET.get('id', '') #GET should have been DELETE
ship = Ship.objects.get(id=id)
# ship.fleet.numberOfShips = ship.fleet.numberOfShips - 1
ship.fleet.save()
return Response("success")
# ship.delete()
Run Code Online (Sandbox Code Playgroud)
您的问题是您正在尝试访问request.POST
shipID = request.POST.get('id',None)
Run Code Online (Sandbox Code Playgroud)
根据DELETE要求
[2017年6月21日00:08:53]“删除/ships HTTP/1.1”500 20510
您正在检查对象的权限,那么为什么不使用has_object_permission?http://www.django-rest-framework.org/api-guide/permissions/#examples
另外,在您的回溯中,它清楚地表明问题是您的views.py
文件“C:\Users\ptao\Desktop\ViaFleet\ViaDjango\First_REST_API\Ships\views.py”,第 110 行,删除
ship = Ship.objects.get(id=id)
我们需要查看您的实际视图代码
| 归档时间: |
|
| 查看次数: |
13310 次 |
| 最近记录: |