Я хотел бы кэшировать представление 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
, но это не часть моего приложения, поэтому я не могу его изменить.