2012-09-24 9 views
5

में एक सत्र "फोर्क" कैसे करें मेरे पास एक सर्वर है जो कई अनुप्रयोगों को खिलाता है।पायथन: django

कृपया कल्पना करें कि मैं 2 या अधिक अनुप्रयोगों में पंजीकृत उपयोगकर्ता हूं और प्रत्येक का उपयोग करते समय मैं एक अलग लॉगिन जानकारी का उपयोग करता हूं।

अब, यह उपयोगकर्ता के रूप में, मैं अलग टैब के साथ एक ही ब्राउज़र (1rst आवेदन के लिए) के लिए पहली बार प्रवेश हो रहा है तो वे एप्लिकेशन का उपयोग करने की ... के रूप में इरादा सब कुछ चला जाता है का उपयोग करें, लेकिन जब मैं (2 आवेदन का उपयोग के रूप में दूसरा उपयोगकर्ता), वह अनुरोध उसी request.session ऑब्जेक्ट तक पहुंच जाएगा। जब मैं लॉगिन (ऑथ फ्रेमवर्क से) का आह्वान करता हूं तो वर्तमान उपयोगकर्ता की वास्तविक request.session (request.session[SESSION_KEY] != user.id) और request.session.flush() में उपयोगकर्ता के साथ तुलना की जाएगी।

इसका मतलब यह है कि मैं उपयोगकर्ता कि 1 आवेदन पहुँचा के लिए request.session सामग्री के सभी खो देंगे, और कहा कि एक ही उपयोगकर्ता request.session उस बिंदु से दूसरे request.session उपयोगकर्ता के लिए "चिह्नित" कर दिया जाएगा।

मैं जो चाहता था, उस स्थिति में, एक ऐसा कार्य/विधि होना था जो दूसरे उपयोगकर्ता के लिए नया request.session बनाने की अनुमति देता है, मूल को छोड़कर।

पहले उत्तर के बाद संपादित: सबसे पहले, उत्तर के लिए धन्यवाद। मैं बहुत उन्मुख उत्तरों से बचने के लिए बहुत अधिक विस्तार से नहीं आ रहा था, लेकिन अब मुझे लगता है कि मुझे यह करना चाहिए:

ठीक है, मैंने पहले "इसे" एप्लिकेशन कहा है, लेकिन सच में, मेरा प्रोजेक्ट अनुरोध करता है एक ही अंतिम "उत्पाद" (उदाहरण के लिए, एक गेम) की पेशकश करने के लिए। (मैं अपने प्रोजेक्ट के अंदर कई Django एप्लिकेशन नहीं है। विशिष्ट झुकाव और बैकएंड के लिए लागू किया व्यापार मान्यताओं के आधार पर के साथ हर एक।)

यह अगर मैं मैं अलग प्रवेश द्वारों यूआरएल, सही व्यापार बैकएंड का उपयोग किया है कि बताया और अधिक विस्तृत किया जाएगा अनुरोध को संसाधित करने और एक गेम पुनर्प्राप्त करने के लिए।

मेरा मुख्य URL समान (नामस्थान) है और मेरी प्रोजेक्ट में केवल एक सेटिंग फ़ाइल है।

enter image description here

+0

मुझे यकीन नहीं है कि Django डोमेन के लिए कुकी को कैसे दबा सकता है जिसके लिए अनुरोध नहीं किया गया था ** या ** www.2.com/playCDS --- रीडायरेक्ट-टू ---> www.me. com/playCDS तो आप रेफरर के अनुसार उपयोगकर्ता प्रोफ़ाइल बदलते हैं, है ना? मैंने अभी भी अपना जवाब http://stackoverflow.com/a/12571909/140837 पोस्ट किया है, मैं तदनुसार अपडेट करूँगा लेकिन मूल उत्तर वहां है, सेटिंग्स उपयोगकर्ता प्रोफ़ाइल परिवर्तन के लिए तर्क क्योंकि आपके मामले में ऐसा लगता है कि " सबप्रोफाइल दृश्य बदलें "। – amirouche

+0

क्या कोई «सबप्रोफाइल» मॉडल है? – amirouche

+0

क्या आपने मेरे उत्तर की समीक्षा की? – amirouche

उत्तर

2

वहाँ है कि क्या आप "उपयोग के मामले" है या नहीं बदलने के लिए तैयार कर रहे हैं पर निर्भर करता है आपके सवाल का कई जवाब हो सकता है:

क) आप उपयोग के मामले में परिवर्तन नहीं कर सकते हैं: यह संभव नहीं है, क्योंकि एक Django सत्र ब्राउज़र सत्र से जुड़ा हुआ है चाहे वह कई ब्राउज़र विंडोज इंस्टेंस या टैब हों।

बी) आप उपयोग केस बदल सकते हैं: उपयोगकर्ता अभी भी अपने कोड में किसी भी संशोधन के बिना कई ब्राउज़रों (या क्रोम/क्रोमियम में निजी ब्राउज़िंग मोड) का उपयोग करके इसे प्राप्त कर सकता है।

ग) आप अपनी वेबसाइट है कि उपयोगकर्ता अलग विंडो में एक ही सत्र में कई सक्रिय प्रोफ़ाइल की अनुमति में एक "उपयोगकर्ता" स्विच सुविधा को लागू कर सकते हैं, यह GitHub संगठन स्विच सुविधा या फेसबुक पेज के लिए उद्देश्य में समान है/संगठन-स्विच लेकिन आपके पास कई टैब में कई उपयोगकर्ता की प्रोफ़ाइल हो सकती है जो कि जिथब या फेसबुक पर नहीं है।

सी प्राप्त करने के लिए) आप अपने "उपयोगकर्ता" मॉडल से जुड़ी एक "SubProfile" मॉडल उदाहरणों की आवश्यकता है, और क्वेरी स्ट्रिंग पैरामीटर के आधार पर प्रत्येक भेजे अनुरोध पर सही SubProfile को सक्रिय करने और अनुरोध भर subprofile की जानकारी को बनाए।

1) मुझे लगता है कि आप पहले से ही है कि Subprofiledjango.contrib.auth.models.User के लिए एक विदेशी कुंजी के साथ एक मॉडल की तरह कुछ है, तो आप भी एक राय यह है कि एक उपयोगकर्ता अपने subprofile को बदलने की अनुमति हो सकती है। सबप्रोफाइल-स्विच काम करने के लिए, इसे वर्तमान टैब सत्र में जानकारी को जारी रखने की आवश्यकता है, जो उपप्रोफाइल का उपयोग कर रहा है, जिसके लिए इसे क्वेरी स्ट्रिंग में पैरामीटर जोड़ने की आवश्यकता है क्योंकि यह केवल एक ही स्थान है जो टैब को बाध्य करता है और उपयोगकर्ता नहीं -session। उदाहरण के लिए "subprofile = 123"। । आप ठीक से एक रूप एट साथ subprofile मान्य करने के लिए की जरूरत है अल, दृश्य इस तरह दिखता है:

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}) 

यह दृश्य प्रत्येक खेल के पहले पृष्ठ हो सकता है।

2) इसके बाद, आपको वर्तमान टैब के लिए उपयोगकर्ता के उप-लाभ को पुनर्प्राप्त करने की आवश्यकता है। इस मामले के लिए हम middleware में क्वेरी स्ट्रिंग का उपयोग करेंगे (howtos on SO और example middlewares bundled with Django देखें यदि आपको नहीं पता कि यह क्या है) वर्तमान SubProfile उदाहरण request.user को अटैचमेंट करने के लिए उपयोग किया जा सकता है। प्रत्येक आवक अनुरोध के लिए मिडलवेयर इच्छा SubProfile उदाहरण वर्तमान उपयोगकर्ता ऑब्जेक्ट के लिए क्वेरी स्ट्रिंग में पाया वर्तमान subprofile जानकारी के लिए इसी देते हैं, मिडलवेयर इस तरह दिखता है:

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 

इस तरह आप अपने अनुप्रयोग के हर दृश्य में उपयोग कर सकते है SubProfile पर subprofilerequest.user की विशेषता पर उदाहरण। यदि कोई वैध क्वेरी स्ट्रिंग subprofile=123 है, तो उपयोगकर्ता के पास यह सबप्रोफाइल सक्रिय होगा, अगर यह डिफ़ॉल्ट उपप्रोफाइल नहीं है।

मान लें कि आपका आवेदन Organization मॉडल जिनमें से प्रत्येक उदाहरणों दीवारें हैं, तो उपयोगकर्ता के संदेश पोस्ट कर सकते हैं जिस पर एक subprofile उपयोग करने के साथ एक आवेदन पत्र है, समारोह एक दीवार पर एक संदेश पोस्ट करने के निम्नलिखित हस्ताक्षर post_on_organization_wall(subprofile, message, organization), का मानना ​​है कि इस का उपयोग समारोह इस तरह दिखेगा:

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) अब आप अनुरोध भर subprofile की जानकारी को बनाए की जरूरत है। ऐसा करने का सबसे आसान तरीका हरकॉल को {% url %} पर अपने url टेम्पलेट टैग पर प्रतिस्थापित करता है जो उपप्रोफाइल कुंजी के अनुरोध क्वेरी स्ट्रिंग उपस्थिति की जांच करता है और इसे अनुरोधित यूआरएल में जोड़ता है। आप the code of Django's url template tag का पुन: उपयोग कर सकते हैं।

0

अगर मैं आपकी समस्या को सही ढंग से समझ, मुद्दा यह है कि आप अनुप्रयोगों के बीच सत्र साझा कर रहे हैं, भले ही उन भिन्न हैं। यह सुनिश्चित करने के लिए कि आपके अनुप्रयोग एक-दूसरे के सत्रों को नहीं दबाते हैं, आपको सेटिंग.py में SESSION_COOKIE_DOMAIN, SESSION_COOKIE_PATH, या SESSION_COOKIE_NAME सेट करके इसे हल करने में सक्षम होना चाहिए।

संबंधित मुद्दे