Есть ли хорошие плагины / модули Django для добавления поддержки Server Sent Event в ваше приложение? - PullRequest
1 голос
/ 03 февраля 2012

Я нашел это: http://www.niwi.be/post/django-sse-html5-server-sent-events-django/, но он кажется довольно грубым по краям, и то, что я нахожусь в версии 0.2, не дает мне такой уверенности в этом.

Я знаю, что поддержка SSE - это не просто ракетостроение, поэтому, возможно, она просто не требуется, но я подумал, что смогу узнать, знает ли кто-нибудь еще о каких-либо других проектах или модулях, которые могут помочь.

Я ищу типичное предложение по модулю или тип ответа "просто сделай сам".

Ответы [ 2 ]

0 голосов
/ 05 мая 2015

Для поддержки сжатия в SSE вы можете добавить декоратор Django "gzip_page". Смотрите следующий пример кода:

from django.views.decorators.gzip import gzip_page
from django.utils.decorators import method_decorator
...
class SSEView(View):
@method_decorator(gzip_page)
def  dispatch(self, request):
   pass

Причина использования декоратора состоит в том, что в Django недопустимый заголовок HTTP "Transfer-Encoding".

Вы можете использовать заголовок в других платформах Python, где этот заголовок разрешен.

response["Transfer-Encoding"] = "chunked"
0 голосов
/ 12 марта 2014

Пример Django SSE:

class SSEView(View):
def  dispatch(self, request):
    response = http.StreamingHttpResponse(streaming_content=self.iterator(request=request), content_type="text/event-stream")
    response['Cache-Control'] = 'no-cache'
    response['connection'] = 'keep-alive'
    return response

def iterator(self, request):
    """
    Yield unseen events (based on session timestamp)
    """
    user = request.user
    while True:
        user_ts = request.session.get("user_ts")    # Last seen
        sse = EVENT.find_one({
            "ts": {"$gt" : user_ts},                # New event, after last-seen
            "user_id": user._id},                   # Only requester's event
        })
        if not sse:
            time.sleep(random())
        else:
            yield sse
            request.session["user_ts"] = sse["ts"]  # Overwrite latest event time
...