django.core.exceptions.ValidationError:["''不是有效的UUID。"]

时间:2017-06-21 04:32:01

标签: python django postgresql

尝试使用Django Rest Framework在Django中编写对象级权限时,我遇到了这个错误(底部的完整错误日志)

django.core.exceptions.ValidationError: ["'' is not a valid UUID."]

错误来自获取查询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

以下是声明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

调试尝试次数

  1. ship = Ship.objects.get(id=shipID)更改为ship = Ship.objects.get(id="some string")会使验证错误消失。
  2. ship = Ship.objects.get(id=shipID)更改为ship = Ship.objects.get(id="")会使验证错误消失。这个很有趣,因为空字符串通过了验证。
  3. shipID = request.POST.get('id',None)更改为shipID = request.GET.get('id',None)会使验证错误消失。
  4. 我已经记录了从POST请求传入的uuid,它确实是一个格式正确的uuid(见下文)
  5. enter image description here

    1. 我尝试按照建议here删除整个Postgres数据库以及迁移。
    2. 我已经运行了一个" SELECT * FROM"在每个表上以确保没有表具有空的uuid
    3. 我咨询了class UUIDField(Field):下的official docs
    4. 从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'''

    5. 基本上我正在尝试检索与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
      

      修改 问题是由于views.py中的错误。感谢@Sardorbek Imomaliev指出这一点。 id = request.GET.get('id', '')应该是id = request.POST.get('id', '')。请注意,request.POST将包含DELETE请求正文。有关详情,请参阅此post下的评论。感谢所有有帮助的人。

      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()
      

2 个答案:

答案 0 :(得分:2)

您的问题是您正在尝试访问request.POST

shipID = request.POST.get('id',None)

on DELETE请求

  

[21 / Jun / 2017 00:08:53]“DELETE / shipping 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)

我们需要查看您的实际视图代码

答案 1 :(得分:0)

你写

  

我已经记录了从POST请求传入的uuid,它确实是一个格式正确的uuid(见下文)

并且您的uuid图片具有所需的32位数字。但是,当剥离的字符串不是32位数时,uuid.py中引用的行会抛出该异常。

所以id的类型有问题。

来自https://docs.djangoproject.com/en/1.11/ref/models/fields/

  

UUIDField¶

     

class UUIDField(** options)[source]¶

     

用于存储通用唯一标识符的字段。使用Python的UUID类。在PostgreSQL上使用时,它以uuid数据类型存储,否则存储在char(32)中。

错误行是

  

ship = Ship.objects.get(id = shipID)

其中shipID是一个字符串。你的行应该

var _account = _Iaccount.GetAccountById(id);
if (_account.Password != password)
{
    ModelState.AddModelError("Password", "Invalid Password!");
}