Почему я получаю этот PicklingError?

Pablo Viacheslav спросил: 12 мая 2018 в 04:21 в: python

Я работаю над проектом Python / Django / Wagtail, и у меня есть api, чтобы возвращать некоторые разбитые на страницы статьи. Это выглядит так:

В URL-адресах:

url(r'^morearticles/', views.get_live_articles),

В просмотрах:

def get_live_articles(request):
  context = {'articles': getLiveArticles(request) }
  return render(request, 'app/components/articles-live.html', context, content_type="text/html; charset=utf-8")

getLiveArticles выглядит так:

def getLiveArticles(request): # Articles
 a = get_articles() #this is getting the articles correctly
 p = Paginator(a, 4)
 page_n = request.GET.get('page') try:
     articles = p.page(page_n)
 except Exception, e:
     articles = [] return articles

Однако, когда я нахожусь в конечной точке api, я получаю следующее:

    Traceback (most recent call last):
  File "/Users/john/.virtualenvs/upgrade/lib/python2.7/site-packages/django/core/handlers/exception.py", line 41, in inner
    response = get_response(request)
  File "/Users/john/.virtualenvs/upgrade/lib/python2.7/site-packages/django/core/handlers/base.py", line 249, in _legacy_get_response
    response = self._get_response(request)
  File "/Users/john/.virtualenvs/upgrade/lib/python2.7/site-packages/django/core/handlers/base.py", line 187, in _get_response
    response = self.process_exception_by_middleware(e, request)
  File "/Users/john/.virtualenvs/upgrade/lib/python2.7/site-packages/django/core/handlers/base.py", line 185, in _get_response
    response = wrapped_callback(request, *callback_args, **callback_kwargs)
  File "/Users/john/app/app/views.py", line 90, in get_live_articles
    context = {'articles': getLiveArticles(request) }
  File "/Users/john/.virtualenvs/upgrade/lib/python2.7/site-packages/cache_utils/decorators.py", line 48, in wrapper
    cache.set(key, value, timeout, **backend_kwargs)
  File "/Users/john/.virtualenvs/upgrade/lib/python2.7/site-packages/django/core/cache/backends/locmem.py", line 75, in set
    pickled = pickle.dumps(value, pickle.HIGHEST_PROTOCOL)
PicklingError: Can't pickle <class 'wagtail.wagtailcore.blocks.base.RichTextBlockMeta'>: attribute lookup wagtail.wagtailcore.blocks.base.RichTextBlockMeta failed

Я раньше сталкивался с ошибкой Pickling, но никогда не понимал, о чем идет речь. Любая идея о том, что может быть причиной этого?

Сообщите мне, если я должен предоставить дополнительную информацию. После отладки я думаю, что проблема должна содержаться в этих кусках кода, но я могу ошибаться.

EDIT: одно из полей объектов было превращено в объект StreamField, содержащий основное содержимое в последнее время , Может быть, что-то делать?


1 ответ

Есть решение
Giorgi Jambazishvili ответил: 12 мая 2018 в 04:43

Я думаю, что это связано с кешем (с той же проблемой в последнее время), где некоторые объекты нельзя травить для кеширования, и, как вы уже подтвердили, вы используете кеш. Поэтому отключение кэша решит проблему.

Я предлагаю использовать типы объектов, совместимых с разборкой. С другой стороны, в документации Python есть некоторые рекомендации по реализации / настройке логики травления / распиловки.