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',
]