2012-09-24 21 views
5

'daki bir oturumu nasıl "çağırabilirim" Birkaç uygulamayı besleyen bir sunucum var.Python: django

Lütfen bu uygulamaların 2 veya daha fazlasında kayıtlı bir kullanıcı olduğumu ve her birine erişirken bir farklı giriş bilgisi kullandığımı hayal edin.

Bu kullanıcı olarak, aynı tarayıcıyı bu uygulamalara erişmek için farklı sekmelerle kullanıyorum ... İlk kez oturum açma (ilk uygulama için) gibi her şey beklendiği gibi gider, ancak 2. uygulamaya eriştiğimde (as ikinci kullanıcı), bu istek aynı request.session nesnesine erişecektir. Giriş işlemini (auth çerçevesinden) çağırdığımda, geçerli kullanıcı kullanıcıyla gerçek request.session (request.session[SESSION_KEY] != user.id) ile karşılaştırılacak ve request.session.flush() çağrılacaktır.

Bu, 1 uygulama erişilen kullanıcı için request.session tüm içeriği gevşek anlamına gelir ve bu aynı kullanıcı request.session bu noktadan ikinci kullanıcı request.session olduğu "işaretli" olacaktır.

Bu durumda, ikinci kullanıcı için orijinali olduğu gibi bırakarak yeni bir request.session oluşturmaya izin veren bir işlev/yönteme sahip olmak istedim.

İlk yanıttan sonra düzenlenmiş: Her şeyden önce, yanıt için teşekkürler. Çok yönelimli cevaplardan kaçınmak için çok fazla ayrıntıya değinmemeye çalışıyorum ama şimdi bunu yapmam gerektiğini düşünüyorum:

Tamam, daha önce "it" uygulamalarını aradım ama gerçekte projem istekleri karşılar Aynı nihai "ürünü" sunmak için (örneğin bir oyun). (Projemde birkaç django uygulaması var. Her biri özel yönelimleri ve arka uçları uygulanmış iş hususlarına bağlı.)

Farklı giriş noktalarına sahip olduğumu söylemiş olsaydım daha ayrıntılı olurdu. isteği işlemek ve bir oyun almak için.

Ana URL'm aynı (ad alanı) ve projemde yalnızca bir ayar dosyası var. Eğer doğru sorununuzu anlamak

enter image description here

+0

Django'nun, isteğin yapılmadığı bir alan adı için bir çerezi nasıl itebileceğinden emin değilim ** veya ** www.2.com/playCDS --- yönlendirme ---> www.me. com/playCDS sonra kullanıcı profilini yönlendiriciye göre değiştirirsin, öyle mi? Hala benim cevap http://stackoverflow.com/a/12571909/140837 gönderdi, ben buna göre güncellenir ama temel cevap var, ayarları kullanıcı profili değiştirmek için mantık sizin durumunda çünkü bir "gibi görünmüyor" alt profil görünümünü değiştir. – amirouche

+0

Herhangi bir «SubProfile» modeli var mı? – amirouche

+0

Cevabımı incelediniz mi? – amirouche

cevap

2
siz "kullanma durumu" ya da değil değiştirmeye hazır olup olmamasına bağlı olarak soruya birkaç cevap var olabilir

:

a) Sen kullanım örneğini değiştiremezsiniz: bu mümkün değil birinde çünkü Django oturumu, çeşitli tarayıcı pencereleri veya sekmeleri olsun, bir tarayıcı oturumuna bağlanır.

b) Sen kullanım örneğini değiştirebilirsiniz: kullanıcı hala kodunda herhangi bir değişiklik yapmadan bu kullanarak birkaç tarayıcıları (veya profillerini (veya krom/krom içinde gizli tarama modunu)) elde edebilirsiniz.

c) Kullanıcı farklı pencerelerde aynı oturumda birden etkin profil için izin Web sitenize bir "kullanıcı" -Switch özelliğini uygulayabilirsiniz, bu github örgütü anahtarı özellik veya facebook sayfasına amaç benzer var/organization-switch, ancak birkaç kullanıcı profilinde github veya facebook'ta olmayan bazı sekmelerde olabilirsiniz.

) c ulaşmak için size "Kullanıcı" modeline bağlı bir "SubProfile" model örneklerini olması gerekir ve sorgu dizesi parametrelere dayalı her gelen istek üzerine sağ SubProfile etkinleştirmek ve istekleri karşısında subprofile bilgi inat.

1) sizin zaten bunu Subprofiledjango.contrib.auth.models.User için yabancı bir anahtar ile bir modeli gibi bir şey var sanırım, ayrıca bir kullanıcı kendi subprofile değiştirmesine izin bir görünüme sahip olabilir. Subprofile-switch çalışmasını yapmak için, alt sekmesini kullanan mevcut sekme oturumundaki bilgileri devam ettirmek zorundadır, çünkü sorgu dizgesine bir parametre eklemesi gerekir çünkü bu, sekmeyi bağlayan yegane yer değil, kullanıcıdır. -oturum, toplantı, celse. Örneğin "subprofile = 123". . Düzgün bir şekilde et ile subprofile doğrulamak gerekir arkadaşları, görünümü aşağıdaki gibidir:

def select_subprofile(request): 
    if request.method == 'POST': 
     form = SubProfileSelectForm(request) 
     if form.is_valid(): 
      subprofile = form.cleaned_data['subprofile'] 
      url = '%s?subprofile' % (reverse('homepage'), subprofile) 
      return redirect(url) # the redirect is something like '/homepage?subprofile=123' 
    else: 
     form = SubProfileSelectForm() 
    return render(request, 'myapp/subprofile_select.html', {'form':form}) 

Bu görüş her oyunun ilk sayfası olabilir.

2) Bundan sonra, geçerli sekme için kullanıcının alt profilini almanız gerekir. Bu konu için middleware (howtos on SO ve example middlewares bundled with Django aradıklarını bilmiyorsanız) sorgu dizesini request.user numaralı SubProfile örneğine eklemek için kullanacağız. her gelen istek için ara katman irade geçerli kullanıcı nesnesine sorgu dizesinde bulunan cari subprofile bilgilere karşılık gelen SubProfile örneğini takmak, ara katman şuna benzer:

class SubProfileMiddleware(object): 

    def process_request(self, request): 
     subprofile = request.GET.get('subprofile', None) 
     if subprofile: 
      # it's important to check for user here or malicious users will be 
      # able to use Subprofiles of other users 
      subprofile = Subprofile.objects.filter(user=request.user, id=subprofile) 
      # This can also be written 
      # subprofile = request.user.subprofile_set.filter(id=subprofile) 
      if not subprofile: 
       # this is a malicious user 
       raise Http403 
      else: 
       request.user.subprofile = subprofile 
     else: 
      # set default subprofile 
      request.user.subprofile = self.user.default_subprofile 

uygulamanızın her görünümünde erişebilir Bu şekilde request.user'un örneğine subprofile özniteliğinde. Geçerli bir sorgu dizesi subprofile=123 varsa, kullanıcı varsayılan alt profil değilse, bu alt profil etkin olacaktır.

uygulamanız kullanıcının bir subprofile kullanarak mesaj gönderebilir hangi örnekler duvarlar var, her biri Organization modelleri ile bir uygulamadır ki, fonksiyon duvara bir mesaj göndermek için, aşağıdaki imza post_on_organization_wall(subprofile, message, organization), bunu kullan görünüm fonksiyonu aşağıdaki gibi görünecektir:

def organization_wall_post(request, organization): 
    organization = Organization.objects.get_object_or_404(organization) 
    if request.method == 'POST': 
     form = MessageForm(request.POST) 
     if form.is_valid(): 
      post_on_organization_wall(request.user.subprofile, message, organisation) 
    else: 
     form = MessageForm() 
    return render(request, 'organisation/wall_post.html', {'form': form}) 

3) Şimdi istekler arasında subprofile bilgi inat gerekiyor. Bunu yapmanın en kolay yolu, alt anahtar anahtarının istek sorgu dizesi varlığını kontrol eden ve istenen URL'ye ekleyen kendi url şablon etiketinize everycall yerine {% url %} şablonudur. the code of Django's url template tag yeniden kullanabilirsiniz.

0

, mesele kullanıcıların farklı olmasına rağmen sen uygulamalar arasında oturumları paylaşıyorsanız olmasıdır. Uygulamalarınızın birbirlerinin oturumlarını kapatmamasını sağlamak için SESSION_COOKIE_DOMAIN, SESSION_COOKIE_PATH veya SESSION_COOKIE_NAME ayarlarınızı settings.py olarak ayarlayarak çözebilmeniz gerekir.

İlgili konular