Мариновать объекты запроса Django - PullRequest
10 голосов
/ 23 июня 2010

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

Can't pickle 'lock' object: <thread.lock object at 0x93ad240>

Я просмотрел объект запроса, но нигде не смог найти объект thread.lock. Кто-нибудь знает где это? Есть ли лучший способ сделать это?

Ответы [ 2 ]

6 голосов
/ 03 ноября 2012

Хорошо, для тех, кому это интересно, мне удалось засечь HttpRequest и WSGIRequest объекты.Во-первых, вам понадобится обезопасить как минимум один класс WSGIRequest (и, вероятно, HttpRequest), чтобы он предоставил метод __reduce__(self).Вы бы хотели что-то вроде:

WSGIRequest.__reduce__= __reduce__

Метод reduce может выглядеть следующим образом:

def __reduce__(self):
    meta = dict([(k,self.META[k]) for k in METACOPY if k in self.META and isinstance(self.META[k], str)])
    return (HttpRequest, (), {'META':meta, 'POST':self.POST, 'GET':self.GET, 'user':self.user, 'path':self.path})

, где METACOPY - это список ключей, которые вы хотите сохранить, например.['REMOTE_ADDR']

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

6 голосов
/ 28 апреля 2011

Как правило, вы не можете выбрать объекты HTTP-запросов для любого веб-сервера. Процесс травления не травит сам объект, но все его ссылки.

Обычный шаблон проектирования веб-сервера - каждый HTTP-запрос выполняет свой собственный поток. Между потоком и HTTP-запросом должно быть соединение. Таким образом, объект HTTP привязан к жизненному циклу веб-сервера и не может быть извлечен из контекста веб-сервера.

Что вы, вероятно, хотите сделать, это выбрать содержимое объекта HTTP-запроса и заново создать запросы, используя это содержимое в качестве полезной нагрузки.

...