2012-06-22 6 views
11

Так на основе информации здесь Safari 3rd party cookie iframe trick no longer working? и здесь Missing cookies on iframe in safari 5.1.5 стало ясно, что старые приемы не будут работать:Джанго 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 

Так я ищу новый способ решить эту проблему.

Похоже, что для этого требуется открытое окно (с разрешения пользователя или щелчка или он будет заблокирован сафари) и начать сеанс там.

Проблема в том, что на той же самой всплывающей странице будут выполняться все средние объекты, поэтому она не всегда может быть жизнеспособной внутри проекта (как можно меньше интрузивных исправлений).

Также начало сеанса django внутри промежуточного программного обеспечения, я не нашел никакого чистого способа запуска одного вручную. Какие-либо предложения?

+0

Зачем вам нужно начинать сеанс вручную? Если ваше всплывающее окно происходит из Django и проходит через промежуточное программное обеспечение, вы автоматически получаете новый сеанс, если он еще не существует. – Anentropic

+0

Почему я не использовал js и post для замены в iframe? – Efazati

ответ

Смежные вопросы