2014-04-04 10 views
5

Bu, teoriye dair bir soru, çünkü bu konseptle ilgili çıplak bir fikrim var ve henüz bir kod yok.Tornado, Django, Websockets ve Session syncing

Websockets'i Tornado ile birlikte kullandığımı ve köprülü bir şekilde düzenli bağlantıları gerçekleştirecek bir django projesi kullandığımı varsayalım. Bu şu anlama gelir: asıl sunucu Tornado olup her talebi alır ve eğer istek/soket yoluna sahip değilse, django wsgi işleyicisi bunu (bir geri alma kabı üzerinden) halleder. Diğer tarafta,/soket yolu istekleri ws veya wss protokolleri olmalı ve Tornado tarafından websockets olarak kabul edilir.

Bağlantı başladığında, Yükseltmeden önceki ilk istek çerezlere sahip olacaktır ve oturum kimliğini çerezlerden alabilir ve oturum nesnesini kimliğe göre almak için oturum yöneticisini kullanabilirim. Bir websocket bağlantısı olduğundan bu bağlantının atlatması için, uzun vadeli bir olacak, ben oturum kimliği çerezi için aynı değere sahip olacağım (çünkü web kafesi bağlantısı yok çünkü çerez başlıklarını atamadım çünkü) Artık başlıklar gönderemezsiniz - bu fikir, ek yükü azaltmak ve mesajla birlikte çerezleri aktarmak büyük bir yük olabilir.

Şimdiye kadar bir sorun yok: Websockets bağlanıyor, çerezi yalnızca bir kez gönderiyor, bu soket için sunucu tarafındaki sınırlama o çerez değerine sahip olabilir (oturum kimliği) ve bağlantı kapanana kadar onunla oynayın.

Anketim: Bir oturumun artık mevcut olmadığını nasıl algılayabilirim? (olası nedenler: 1. kullanıcı, mevcut oturumun kapatılmasını içeren bir kaynak yayınladı, AJAX yoluyla yapıldı ve websocket kapalı olmadıysa, 2. oturumun boş kalması nedeniyle sona erdi, 3. bir şekilde django api kullanımıyla oturum kapatıldı, Bunun için mevcut yürütme bağlamını ima etmediği düşünüldüğünde, talep kapatılmakta - böyle bir senaryonun mümkün olup olmadığını bilmiyorum).

Notlar: belirli bir oturumun ne zaman kapatıldığını algılamak, ilgili web kartlarının da kapatılıp kapatılmayacağını belirlememde bana yardımcı olabilir.

cevap

1

Çerez sistemini django'dan (django.contrib.sessions.middleware.SessionMiddleware kullanarak) kullandığınızı kabul ediyorum.

Her websocket isteğinde her oturum oturumunu istemezsiniz. Sonra oturum canlı olup olmadığını öğrenmek için sunucuya kalmış.

Bu, oturum belleğine her zaman erişilmesini gerektirir. Veritabanı destekli oturumlar kullanıyorsanız, çok fazla yük getirecektir. Önbellek destekli oturumlar kullanıyorsanız, yapılabilir.

django belgelerinden referans: https://docs.djangoproject.com/en/1.8/topics/http/sessions/