0

我创建了 Django File 对象的子类来处理远程文件。我还想通过创建一个 RemoteFileLazy 子类化 Lazyobject 类来制作一个惰性版本,但它并没有像我预期的那样工作。我得到一个错误。

import urllib2
from django.core.files.base import File
from django.utils.functional import LazyObject

class RemoteFile(File):

    def __init__(self, url):
        super(RemoteFile, self).__init__(urllib2.urlopen(urllib2.Request(url)))

    def __str__(self):
        return 'Remote content'

    def __nonzero__(self):
        return True

    def open(self, mode=None):
        self.seek(0)

    def close(self):
        pass

    def chunks(self, chunk_size=None):
    # CHUNKS taking care of no known size!
        if not chunk_size:
            chunk_size = self.DEFAULT_CHUNK_SIZE

        if hasattr(self, 'seek'):
            self.seek(0)
        # Assume the pointer is at zero...
        counter = self.size

        while True:
            data = self.read(chunk_size)
            if not data:
                break
            yield data

class RemoteFileLazy(LazyObject):

    def __init__(self, url):
        # # as said in the django code: For some reason, we have to inline LazyObject.__init__ here to avoid
        # recursion
        self._wrapped = None
        self.url = url

    def _setup(self):
        self._wrapped = RemoteFile(self.url)

当我运行此代码时:

rfl = filehelper.RemoteFileLazy(url="http://www.google.fr")

我收到了这个错误:

RuntimeError: maximum recursion depth exceeded

任何想法 ?我没有调用 LazyObject。尽管在 django 代码中提到了init ......我认为init方法中的“self.url = url”会触发这个错误,对吗?所以我不能使用带有属性的惰性对象?

谢谢。

追溯:

c:\Users\Michael\Dropbox\development\tools\Portable Python 2.7.2.1-django1.3.1\App\lib\site-packages\django\utils\functional.pyc in __getattr__(self, name)
    274     def __getattr__(self, name):
    275         if self._wrapped is None:
--> 276             self._setup()
    277         return getattr(self._wrapped, name)
    278

C:\Users\Michael\Dropbox\development\projects\django-socialdealing\socialdealing\apps\etl\utils\filehelper.py in _setup(self)
     58
     59     def _setup(self):
---> 60         self._wrapped = RemoteFile(self.url)
     61
     62

c:\Users\Michael\Dropbox\development\tools\Portable Python 2.7.2.1-django1.3.1\App\lib\site-packages\django\utils\functional.pyc in __getattr__(self, name)
    274     def __getattr__(self, name):
    275         if self._wrapped is None:
--> 276             self._setup()
    277         return getattr(self._wrapped, name)
    278
4

1 回答 1

1

您不能以正常方式在 LazyObject 包装器上分配属性,它应该被视为被包装的对象,因此尝试将访问权传递给尚未创建的包装对象分配给url.

要修复它,请更换

self.url = url # this tries to retrieve the wrapped object to set its 'url' attribute

self.__dict__['url'] = url # this actually stores an attribute on the LazyObject container.

顺便说一句,当像这样“借用” django 内部结构时,您每次升级 django 时都需要非常努力地进行测试。

于 2012-02-27T10:49:22.137 回答