как использовать сессию / cookie в twisted.web? - PullRequest
9 голосов
/ 08 июня 2009

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

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

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

Ответы [ 3 ]

4 голосов
/ 19 августа 2009

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

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

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

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

4 голосов
/ 14 июня 2009

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

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

2 голосов
/ 25 мая 2012

См. Этот связанный вопрос Сохранение экземпляра соединения - twisted.web . В ответе есть ссылка на это сообщение в блоге 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. Витые (Zope) интерфейсы и адаптеры
  2. компонентный

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

...