Проблема с представлением кэширования с использованием Python кеша, связанного с депо, у объекта UploadedFile нет атрибута _frozen - PullRequest
0 голосов
/ 09 октября 2019

Я хотел бы кэшировать представление VerificationView с помощью with_cache, но я получаю AttributeError: объект 'UploadedFile' не имеет атрибута '_frozen'. Я думаю, что это, вероятно, связано с depotfile, потому что ошибка показывает на этом. Модель верификации имеет столбец с

pdf_file = Column(UploadedFileField(upload_storage='storage_carrier_invoice_pdf'))

, который создается с помощью менеджера депо и получает файл pdf из хранилища, когда это необходимо.

DepotManager.configure('storage_carrier_invoice_pdf', {
    'depot.storage_path': Paths.CARRIER_INVOICES_STORAGE_PDF
})

Я использую pyramid_dogpile_cache и dogpile для кэширования моегоПросмотры. В этом случае я добавил все в порядке: cache.py:

def includeme(config):

config.add_settings({'dogpile_cache.regions': 'verificationview'})

config.include('pyramid_dogpile_cache')

VerificationView.py:

@with_cache(region_name='verificationview')
@view_config(route_name='admin_show_verification',
             renderer='admin/verification/verification.jinja2',
             permission='admin')
def show_verification(self):
    verification = Verification.get(self.request.matchdict['id'])
    if verification is not None:

        rows = verification.verification_file_rows
        verification_files = []
        verification_pdfs = []
        for row in rows:
            verification_files.append({
                'id': row.verification_file.id,
                'filename': row.verification_file.filename
            })
            if row.verification_file.pdf_file:
                verification_pdfs.append({
                    'id': row.verification_file.id,
                    'pdf_file': row.verification_file.pdf_file,
                })

        return {
            'title': 'Weryfikacja ' + str(verification.id),
            'verification': verification,
            'verification_services': verification_services_details(verification.shipment.quotation_product_schema,
                                                                   verification.get_product(schema=True),
                                                                   verification.get_differences_services_schema()),
            'section': 'carrier-invoice__verifications',
            'verification_files': verification_files,
            'verification_pdfs': verification_pdfs,
        }

    raise HTTPNotFound

admin / BaseView.py:

def with_cache(region_name='verification', **settings):
    def real_with_cache(func):
        def wrapper(self, *args, **kwargs):

            separator = ':'
            path = self.request.path_qs[1:]
            path = path.replace('/', separator).replace('?', separator)
            path = ':'.join(map(str, [region_name, path]))

            if self.request.customer:
                if self.request.customer.group_id:
                    group_name = self.request.customer.group.name
                    path = ':'.join(map(str, [path, self.request.customer.id, group_name]))
                else:
                    path = ':'.join(map(str, [path, self.request.customer.id]))

            setting = {}
            for attr, value in settings.items():
                setting['arguments.' + attr] = value

            region = get_region(region_name, **setting)
            result = region.get(path)  # HERE IS THE PROBLEM

            if isinstance(result, NoValue) or result == ':invalidate:':
                result = func(self, *args, **kwargs)
                region.set(path, result)

            return result

        return wrapper

    return real_with_cache

Когда я впервые открываю это представление, создается область кеша, а значением кеша является NoValue, поэтому он показывает вид без каких-либо проблем. Но во второй раз у меня возникла такая проблема:

  File "/home/daniel/views/admin/BaseView.py", line 79, in wrapper
    result = region.get(path)
  File "/home/daniel/.virtualenvs/test2/lib/python3.6/site-packages/dogpile/cache/region.py", line 665, in get
    value = self.backend.get(key)
  File "/home/daniel/.virtualenvs/test2/lib/python3.6/site-packages/dogpile/cache/backends/redis.py", line 148, in get
    return pickle.loads(value)
  File "/home/daniel/.virtualenvs/test2/lib/python3.6/site-packages/depot/fields/interfaces.py", line 78, in __setitem__
    if object.__getattribute__(self, '_frozen'):
AttributeError: 'UploadedFile' object has no attribute '_frozen'

Я понятия не имею, как депо-файл связан с представлением и почему его нельзя открыть, как другие значения из столбцов. Есть идеи, что я могу сделать? Я пытался изменить класс: depot.fields.upload.UploadedFile, но это не часть моего приложения, поэтому я не могу его изменить.

...