2012-06-22 17 views
11

So basieren auf Informationen hier Safari 3rd party cookie iframe trick no longer working? und hier Missing cookies on iframe in safari 5.1.5 es ist klar, dass alte Tricks Arbeit gewohnt:Django Iframe Safari Fix

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 

So neue Art und Weise Ich suche es zu lösen.

Es scheint, dass es öffnet Fenster (mit Benutzer Erlaubnis/Klick oder es wird von Safari blockiert werden) und starten Sitzung dort.

Problem ist, dass die gleiche Popup-Seite wird alle Middlewares wahr, so dass es nicht immer innerhalb Projekt realisierbar sein kann (so wenig aufdringlich wie möglich zu beheben).

Auch Django-Session-Start ist auch in Middleware, ich habe keinen sauberen Weg gefunden, einen manuell zu starten. Irgendwelche Vorschläge?

+0

Warum müssen Sie eine Sitzung manuell starten? Wenn Ihr Popup-Fenster von Django kommt und über die Middleware läuft, erhalten Sie die neue Sitzung automatisch, falls sie noch nicht existiert. – Anentropic

+0

warum nicht js und post für ersetzen in iframe? – Efazati

Antwort