как использовать сессию/куки в Twisted.web?

Я реализую http-сервер с twisted.web. Здесь возникает проблема: есть операция входа в систему; после этого я хочу, чтобы http-сервер помнил каждого клиента, использующего acookie/session, до тех пор, пока пользователь не закроет браузер.

Я прочитал документ twisted.web, но не могу понять, как это сделать. Я знаю, что объект запроса имеет функцию с именем getSession(), тогда будет возвращен объект сеанса. Что дальше? Как сохранить информацию во время нескольких запросов?

Я также просмотрел искаженный список рассылки; там нет ничего очень полезного, и я все еще в замешательстве. Если кто-то использовал это раньше, пожалуйста, объясните мне это или даже поместите здесь какой-нибудь код, чтобы я мог понять это сам. Большое спасибо!


person Community    schedule 08.06.2009    source источник


Ответы (3)


Вы можете использовать "request.getSession()" для получения компонентного объекта.

Вы можете больше узнать о компонентах в http://twistedmatrix.com/documents/current/api/twisted.python.components.Componentized.html — основной способ его использования — определение интерфейса и реализации, а также отправка ваших on-объектов в сеанс.

person moshez    schedule 14.06.2009
comment
twistedmatrix.com/documents/current/api/ это обновленная ссылка - person Peter Gibson; 24.05.2012

Вызов getSession() создаст сеанс и добавит файл cookie к запросу:

исходный код getSession()

Если у клиентов уже есть файл cookie сеанса, то вызов getSession() прочитает его и вернет сеанс с исходным содержимым сеанса. Таким образом, для вашего кода прозрачно, создает ли он файл cookie сеанса или просто читает его.

Файлы cookie сеанса имеют определенные свойства... если вы хотите больше контролировать содержимое файла cookie, посмотрите Request.addCookie(), который getSession() вызывает за кулисами.

person matburt    schedule 19.08.2009

См. этот связанный вопрос а>. Ответ содержит ссылку на этот пост в блоге http://jcalderone.livejournal.com/53680.html, где показан пример хранения счетчика количества посещений за сессию (спасибо jcalderone за пример):

# in a .rpy file launched with `twistd -n web --path .`
cache()

from zope.interface import Interface, Attribute, implements
from twisted.python.components import registerAdapter
from twisted.web.server import Session
from twisted.web.resource import Resource

class ICounter(Interface):
    value = Attribute("An int value which counts up once per page view.")

class Counter(object):
    implements(ICounter)
    def __init__(self, session):
        self.value = 0

registerAdapter(Counter, Session, ICounter)

class CounterResource(Resource):
    def render_GET(self, request):
        session = request.getSession()
        counter = ICounter(session)   
        counter.value += 1
        return "Visit #%d for you!" % (counter.value,)

resource = CounterResource()

Не беспокойтесь, если это покажется запутанным — есть две вещи, которые вам нужно понять, прежде чем поведение здесь будет иметь смысл:

  1. Интерфейсы и адаптеры Twisted (Zope)
  2. Компонентный

Значение счетчика хранится в классе адаптера, класс интерфейса документирует, что предоставляет этот класс. Причина, по которой вы можете хранить постоянные данные в адаптере, заключается в том, что Session (возвращаемый функцией getSession()) является подклассом Componentized.

person Peter Gibson    schedule 25.05.2012
comment
К вашему сведению: атрибут value в приведенном выше коде может быть любым. Это может быть целый словарь, если хотите. Это было не совсем очевидно из искаженной документации, но работает нормально. - person Michael Galaxy; 04.06.2014
comment
Я просто хочу где-нибудь порассуждать об этом. Честно говоря, это худший код хранения сеансов, который я когда-либо видел в любой среде, которая делает что-то подобное. Мне не нужно было определять 2 класса или что-либо адаптировать только для хранения простого значения в сеансе. Это довольно ужасно плохо спроектированный API в Twisted. - person Nik Haldimann; 09.10.2015