2012-06-22 16 views
11

तो जानकारी के आधार पर यहां Safari 3rd party cookie iframe trick no longer working? और यहाँ Missing cookies on iframe in safari 5.1.5 यह स्पष्ट है कि वर्ष चाल अभ्यस्त काम:Django Iframe सफारी फिक्स

from django.http import HttpResponse 
from django.conf import settings 


SESSION_COOKIE_NAME = getattr(settings, 'SESSION_COOKIE_NAME') 

class SafariIFrameFixMiddleware(object): 
    """ 
    Middleware fixes sessions with Safari browser in iframes 

    Safari default security policy restricts 
    cookie setting in first request in iframe 

    Solution is to create hidden form to preserve GET variables 
    and REPOST it to current URL 
    """ 
    def process_request(self, request): 
     if request.META['HTTP_USER_AGENT'].find('Safari') != -1 \ 
       and request.META['HTTP_USER_AGENT'].find('Chrome') == -1 \ 
       and SESSION_COOKIE_NAME not in request.COOKIES \ 
       and 'cookie_fix' not in request.GET: 
      html = """<html><body><form name='cookie_fix' method='GET' action='.'>""" 
      for item in request.GET: 
       html += "<input type='hidden' value='%s' name='%s' />" % (request.GET[item], item) 
      html += "<input type='hidden' name='cookie_fix' value='1' />" 
      html += "</form>" 
      html += '''<script type="text/javascript">document.cookie_fix.submit()</script></html>''' 
      return HttpResponse(html) 
     else: 
      return 

तो मैं इसे हल करने का नया तरीका की मांग कर रहा हूँ।

ऐसा लगता है कि इसे खुली खिड़की की आवश्यकता है (उपयोगकर्ता अनुमति/क्लिक के साथ या इसे सफारी द्वारा अवरुद्ध कर दिया जाएगा) और वहां सत्र शुरू करें।

समस्या यह है कि एक ही पॉपअप पृष्ठ सभी मध्यवर्ती लोगों को सच साबित कर देगा, इस प्रकार यह परियोजना के अंदर हमेशा व्यवहार्य नहीं हो सकता है (जितना संभव हो उतना छोटा घुसपैठ तय करना चाहिए)।

इसके अलावा डीजेंगो सत्र भी मिडलवेयर के अंदर है, मुझे मैन्युअल रूप से शुरू करने का कोई साफ तरीका नहीं मिला है। कोई सुझाव?

+0

आपको मैन्युअल रूप से सत्र शुरू करने की आवश्यकता क्यों है? यदि आपकी पॉपअप विंडो Django से आती है और मिडलवेयर के माध्यम से जाती है तो आपको स्वचालित रूप से नया सत्र मिलता है, अगर यह पहले से मौजूद नहीं है। – Anentropic

+0

आईफ्रेम में प्रतिस्थापित करने के लिए जेएस और पोस्ट का उपयोग क्यों नहीं किया? – Efazati

उत्तर

1

मैं भी JackLeo के समान चारों ओर एक काम बनाया है जब तक स्थिर नहीं हो सकता है। आप मिडलवेयर या सजावटी https://github.com/philroche/django-httpsiframecookiesetter के साथ-साथ कुछ और विकल्प का उपयोग कर सकते हैं।