2011-02-27 11 views
17

में सत्र कुंजी हो रही मैं एक डेटाबेस में कुछ बातें संग्रहीत करना चाहते हैं, और एक विदेशी कुंजी के रूप में वर्तमान सत्र का उपयोग कर रहा: models.py से Django: एक सत्र की स्थापना और एक ही दृश्य

class Visited(models.Model): 
    session = models.ForeignKey(Session) 
    page = models.ForeignKey(Page) 
    times_visited = models.PositiveIntegerField() 
    ip_address = models.IPAddressField() 
    date_last_visited = models.DateTimeField() 
    def __unicode__(self): 
     return u'(%s, %s)' % (str(self.session.session_key), str(self.page.name)) 

बनाने के अगर यह पहली बार एक उपयोगकर्ता साइट पर आ चुका है

Session.objects.get(session_key=request.session.session_key) 

हालांकि, और इस तरह की जरूरत नहीं है: इस मॉडल के लिए एक नई प्रविष्टि मैं निम्नलिखित का उपयोग कर रहा वर्तमान सत्र प्राप्त करने के लिए (views.py में) एक कुकी सेट अभी तक, ऊपर दिया गया कोड DoesNotExist त्रुटि उत्पन्न करेगा।


मैं जानता हूँ कि भले ही अब सेट कुकी कि आप अभी भी सत्र वस्तुओं सेट कर सकते हैं। तो मैं कुछ हैक्स के बारे में सोच सकते हैं जैसे यह काम करते हैं, बनाने के लिए:

एक सत्र वस्तु (सत्र कुंजी के अलावा)
  • अस्थायी रूप से डेटा मैं करने के लिए जोड़ना चाहते हैं की दुकान के रूप में
    • सेट अद्वितीय पहचानकर्ता एक सत्र ऑब्जेक्ट डेटाबेस, और एक सजावट समारोह का उपयोग यह जांचने के लिए करें कि यह सत्र का उपयोग करने से पहले मौजूद है या नहीं।
    • बस सत्र ऑब्जेक्ट्स का उपयोग करें और डेटाबेस में कुछ भी स्टोर न करें (यह तकनीकी रूप से संभव होगा, लेकिन मेरे कार्यान्वयन के लिए यह पाइथन शब्दकोशों पर निर्भर करेगा-कुछ सौ प्रविष्टियों के साथ-कम से कम जैसे डेटाबेस के रूप में कुशल छँटाई।)


    लेकिन मैं एक बेहतर समाधान मैं के साथ रह सकते हैं करना चाहते हैं। क्या इस समस्या का कोई आम तौर पर उपयोग या अच्छा समाधान है? या क्या मैं अपने मॉडल में सत्रों का सही संदर्भ भी दे रहा हूं?

    आपकी मदद के लिए धन्यवाद।

  • उत्तर

    39

    request.session एक अद्वितीय session_key के साथ SessionStore object है।

    सत्र_की विशेषता के रूप में जल्द ही बनाई गई है। लेकिन सत्र ऑब्जेक्ट स्वयं को सत्रस्टोर ऑब्जेक्ट की सहेज विधि को कॉल करके दृश्य संसाधित होने के बाद डेटाबेस में सहेजा जाता है (सत्र मध्यवर्ती की प्रक्रिया_ प्रतिक्रिया विधि में)।

    यह वास्तव में दर्ज नहीं किया है, लेकिन स्रोत कोड मुझे लगता है कि आप इस तरह से एक नया सत्र वस्तु बनाने के लिए अपेक्षा की जाती है पर देख रहे हैं:

    if not request.session.exists(request.session.session_key): 
        request.session.create() 
    

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

    from django.conf import settings 
    from django.contrib.sessions.middleware import SessionMiddleware 
    
    class CustomSessionMiddleware(SessionMiddleware): 
        def process_request(self, request): 
         engine = import_module(settings.SESSION_ENGINE) 
         session_key = request.COOKIES.get(settings.SESSION_COOKIE_NAME, None) 
         request.session = engine.SessionStore(session_key) 
         if not request.session.exists(request.session.session_key): 
          request.session.create() 
    

    (बेशक आप अपने नए सत्र मिडलवेयर SESSION_ENIGNE के माध्यम से अंदर अपने settings.py संदर्भ होना चाहिए)

    लेकिन ध्यान रखें - यह दृष्टिकोण प्रत्येक अनुरोध के लिए एक नया सत्र ऑब्जेक्ट उत्पन्न करेगा यदि उपयोगकर्ता का ब्राउज़र कुकीज़ का समर्थन नहीं करता है ...

    +0

    यह आपके उत्कृष्ट स्पष्टीकरण के लिए धन्यवाद कि यह सब कैसे काम करता है (या बल्कि यह क्यों नहीं करता है ' टी काम)। अगर मैं लालित्य नहीं करता, तो सादगी के लिए मैंने दूसरे "हैक" की एक भिन्नता के साथ कहा। –

    +0

    मैं Django या पायथन से बहुत परिचित नहीं हूं, लेकिन मुझे पूरा यकीन है कि यह जवाब बिल्कुल वही है जो मुझे चाहिए। क्लाइंट से सत्र आईडी पास होने पर मुझे सत्र को स्वैप करने की आवश्यकता है (पूछें नहीं)। हालांकि मैं थोड़ा उलझन में हूं, क्या मैं इस वर्ग को 'ddango.contrib.sessions.middleware.SessionMiddleware' और 'SESSION_ENGINE' के अलावा 'MIDDLEWARE_CLASSES' दोनों में संदर्भित करता हूं? निश्चित रूप से इसे 'SESSION_ENGINE' में संदर्भित करने से इस लाइन को पुन: प्राप्त करने का कारण बनता है? 'इंजन = import_module (सेटिंग्स.SESSION_ENGINE)'। क्या मैं इस बिंदु को याद कर रहा हूं? – Steve

    +0

    मुझे नहीं लगता कि 'request.session.create() '' सेट-कुकी 'हेडर सेट करता है। – Flimm

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