Django 1.11.7 - Django Compressor - 参数 5:<class 'TypeError'>:预期 LP_OVERLAPPED 实例而不是指向 OVERLAPPED 的指针

Django 1.11.7 - Django Compressor - argument 5: <class 'TypeError'>: expected LP_OVERLAPPED instance instead of pointer to OVERLAPPED

我正在尝试将现有的 Django 1.11.7 (Python 3.5) 项目启动并 运行 在我的 Windows 10 盒子上。设置环境后,我现在在 运行 应用程序后看到主页,但我访问的任何内部页面都会出现以下错误:

argument 5: <class 'TypeError'>: expected LP_OVERLAPPED instance instead of pointer to OVERLAPPED

我已将其追溯到 compress.py(Django 压缩器)对一些压缩的 CSS 文件的调用,以及 django.core 内部的一些 win32 文件锁定代码,特别是这个行:https://github.com/django/django/blob/master/django/core/files/locks.py#L86(下面片段中的 UnlockFileEx)。

class OVERLAPPED(Structure):
    _anonymous_ = ['_offset_union']
    _fields_ = [
        ('Internal', ULONG_PTR),
        ('InternalHigh', ULONG_PTR),
        ('_offset_union', _OFFSET_UNION),
        ('hEvent', HANDLE)]

LPOVERLAPPED = POINTER(OVERLAPPED)
....
def lock(f, flags):
    hfile = msvcrt.get_osfhandle(_fd(f))
    overlapped = OVERLAPPED()
    ret = LockFileEx(hfile, flags, 0, 0, 0xFFFF0000, byref(overlapped))
    return bool(ret)

def unlock(f):
    hfile = msvcrt.get_osfhandle(_fd(f))
    overlapped = OVERLAPPED()
    ret = UnlockFileEx(hfile, 0, 0, 0xFFFF0000, byref(overlapped))
    return bool(ret)

奇怪的是在首页调用LockFileEx和UnlockFileEx方法都没有报错。在成功和不成功的调用中检查本地人都没有发现任何结果。

堆栈跟踪以防有帮助(编辑了更高的堆栈):

  File "C:\x\env\lib\site-packages\compressor\templatetags\compress.py", line 127, in render
    return self.render_compressed(context, self.kind, self.mode, forced=forced)
  File "C:\x\env\lib\site-packages\compressor\templatetags\compress.py", line 103, in render_compressed
    rendered_output = compressor.output(mode, forced=forced)
  File "C:\x\env\lib\site-packages\compressor\css.py", line 49, in output
    ret.append(subnode.output(*args, **kwargs))
  File "C:\x\env\lib\site-packages\compressor\css.py", line 51, in output
    return super(CssCompressor, self).output(*args, **kwargs)
  File "C:\x\env\lib\site-packages\compressor\base.py", line 292, in output
    output = '\n'.join(self.filter_input(forced))
  File "C:\x\env\lib\site-packages\compressor\base.py", line 232, in filter_input
    for hunk in self.hunks(forced):
  File "C:\x\env\lib\site-packages\compressor\base.py", line 215, in hunks
    basename=basename)
  File "C:\x\env\lib\site-packages\compressor\base.py", line 307, in handle_output
    return output_func(mode, content, forced, basename)
  File "C:\x\env\lib\site-packages\compressor\base.py", line 319, in output_file
    self.storage.save(new_filepath, ContentFile(content.encode(self.charset)))
  File "C:\x\env\lib\site-packages\django\core\files\storage.py", line 54, in save
    return self._save(name, content)
  File "C:\x\env\lib\site-packages\django\core\files\storage.py", line 357, in _save
    locks.unlock(fd)
  File "C:\x\env\lib\site-packages\django\core\files\locks.py", line 86, in unlock
    ret = UnlockFileEx(hfile, 0, 0, 0xFFFF0000, byref(overlapped))

似乎与 locking/unlocking 一起工作的文件是静态 CSS 文件。 JS和LESS都是抛出上述异常的。看来该项目正在对 CSS 和 JS 过滤器使用 yuglify,如果有帮助的话。

在我的例子中,这是由于与具有与 django-compressor 包同名的 类、变量和方法的 youtube-dl 包发生冲突。我能够通过 "hacking" 两个实例中各种令牌的名称来确认这一点,从而导致错误 argument 5: <class 'TypeError'>: expected LP_OVERLAPPED2 instance instead of pointer to OVERLAPPED3

我暂时从我的环境中删除了 youtube-dl 包,作为在我的本地开发环境中获取此 运行 的临时解决方案。