Общий объект между запросами в Django - PullRequest
2 голосов
/ 03 августа 2011

Я использую модуль Python ( PyCLIPS ) и Django 1.3.

Я хочу разработать класс безопасности потока, который реализует шаблоны Object Pool и Singleton, а также который долженбыть разделенным между запросами в Django.

Например, я хочу сделать следующее:

  • Запрос получает объект с некоторым идентификатором из пула, делает что-то с ним и нажимаетего обратно в пул, а затем отправить ответ с идентификатором объекта.
  • Другой запрос, имеющий идентификатор объекта, получает объект с заданным идентификатором из пула и повторяет шаги из вышеприведенного запроса.
  • Но состояние объекта должно бытьхранится, пока он будет в пуле, пока сервер работает.

Это должно быть похоже на Singleton Session Bean в Java EE

Как мне следуетсделай это?Есть что-то, что я должен прочитать?

Обновление: Я не могу хранить объекты из пула в базе данных, потому что эти объекты являются обертками в библиотеке, написанной на C-языке, котораяэто API для эксперт системного движка CLIPS .

Спасибо!

Ответы [ 3 ]

7 голосов
/ 03 августа 2011

Ну, я думаю, здесь нужен другой угол. Django не похож на Java, решение должно быть адаптировано для многопроцессорной среды, а не многопоточной.

У Django нет непосредственного эквивалента одноэлементного сессионного компонента.

Тем не менее, я не вижу причин, по которым ваше описание не соответствует классической модели базы данных. Вы хотите сохранить для каждого объекта данные, которые всегда должны идти в слое БД.

В противном случае вы всегда можете сохранить материал в сеансе, который Django предоставляет как зарегистрированным пользователям, так и анонимным - см. Документы по сеансам Django .

Использование любого другого шаблона, с которым вы, возможно, знакомы, из среды Java, в конечном итоге потерпит неудачу, учитывая огромную разницу между запуском веб-контейнера Java и многопроцессорной средой Python / Django.


Редактировать: хорошо, учитывая, что эти объекты не являются нативными для вашего приложения, а доступны через стороннюю библиотеку, это усложняет ситуацию. Мне кажется, что эти объекты должны обрабатываться не веб-слоем, а каким-то внешним сервисом, доступ к которому вы можете получить из многопроцессорной среды. Как упоминал Даниэль, вы всегда можете выбросить их в кэш (если указанные объекты могут быть засолены). Но создается впечатление, что эти объекты не принадлежат веб-уровню.

2 голосов
/ 03 августа 2011

Предполагая, что объект не может быть выбран, вам нужно будет создать приложение для управления объектом и всеми взаимодействиями, которые должны происходить с ним. Вероятно, самой простой реализацией было бы создание приложения wsgi с одним процессом (на другом порту), которое предоставляет API для выполнения всех необходимых вам операций. Используете ли вы RESTful API или формы сообщений, зависит от ваших личных предпочтений.

1 голос
/ 03 августа 2011

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

Редактировать после комментария Что ж, самая большая проблема заключается в том, что среда производственного веб-сервера, вероятно, будет многопроцессорной, поэтому любые глобальные переменные (например, пул) не являются общими для процессов. Вам нужно будет хранить их где-нибудь , который доступен по всему миру. Коротко в темноте, но сериализуются ли они с помощью Pickle? Если это так, то, возможно, memcache может сработать.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...