Django-oscar-api конфликтует с Django's UpdateCacheMiddleware: {TypeError}cannot pickle '_io.BufferedReader' object

Я реализовал django per site cache в проекте django-oscar с помощью django-oscar-api. Я использую LocMemCache в качестве бэкенда кэша.

До добавления django.middleware.cache.UpdateCacheMiddleware к моим промежуточным компонентам все работало нормально, и я мог сделать запрос к конечной точке "basket" следующим образом, и он возвращал ответ 200:

import requests

session = session.Session()
r_basket = session.get("http://127.0.0.1:8000/api/basket/")

После добавления кэширования на сайте ответ имеет код состояния 500. Я отладил его, и он не работает в UpdateCacheMiddleware со следующей ошибкой: {TypeError}cannot pickle '_io.BufferedReader' object.

Другие конечные точки, похоже, работают нормально, но я еще не проверил их все. Ошибка также может быть воспроизведена на свежеустановленном django-oscar sandbox . Я установил django-oscar-api через pip и добавил его в установленные приложения, а настройка MIDDLEWARE выглядит следующим образом:

MIDDLEWARE = [
    'debug_toolbar.middleware.DebugToolbarMiddleware',

    'django.middleware.security.SecurityMiddleware',
    'whitenoise.middleware.WhiteNoiseMiddleware',

    'django.contrib.sessions.middleware.SessionMiddleware',
    'django.middleware.csrf.CsrfViewMiddleware',
    'django.middleware.clickjacking.XFrameOptionsMiddleware',
    'django.contrib.auth.middleware.AuthenticationMiddleware',
    'django.contrib.messages.middleware.MessageMiddleware',
    'django.contrib.flatpages.middleware.FlatpageFallbackMiddleware',

    # Allow languages to be selected
    'django.middleware.locale.LocaleMiddleware',
    'django.middleware.http.ConditionalGetMiddleware',
    'django.middleware.common.CommonMiddleware',

    # per site caching
    'django.middleware.cache.UpdateCacheMiddleware',
    'django.middleware.common.CommonMiddleware',
    'django.middleware.cache.FetchFromCacheMiddleware',

    # Ensure a valid basket is added to the request instance for every request
    'oscar.apps.basket.middleware.BasketMiddleware',
]

Мои версии пакетов: Django v.3.2.9, django-oscar v.2.2 или 3.0, django-oscar-api v.2.1.1.

Какой объект не может быть замаринован? Или, возможно, порядок промежуточных элементов неправильный?

Вам необходимо убедиться, что UpdateCacheMiddleware находится перед SessionMiddleware и LocaleMiddleware в ваших настройках. DOCS

FetchFromCacheMiddleware должен быть после этих промежуточных программ, можно оставить как есть

MIDDLEWARE = [
    'debug_toolbar.middleware.DebugToolbarMiddleware',

    'django.middleware.security.SecurityMiddleware',
    'whitenoise.middleware.WhiteNoiseMiddleware',

    # Moved UpdateCacheMiddleware to here
    'django.middleware.cache.UpdateCacheMiddleware',

    'django.contrib.sessions.middleware.SessionMiddleware',
    'django.middleware.csrf.CsrfViewMiddleware',
    'django.middleware.clickjacking.XFrameOptionsMiddleware',
    'django.contrib.auth.middleware.AuthenticationMiddleware',
    'django.contrib.messages.middleware.MessageMiddleware',
    'django.contrib.flatpages.middleware.FlatpageFallbackMiddleware',

    # Allow languages to be selected
    'django.middleware.locale.LocaleMiddleware',
    'django.middleware.http.ConditionalGetMiddleware',
    'django.middleware.common.CommonMiddleware',

    # per site caching
    'django.middleware.cache.FetchFromCacheMiddleware',

    # Ensure a valid basket is added to the request instance for every request
    'oscar.apps.basket.middleware.BasketMiddleware',
]
Вернуться на верх