Django Iframe Safari Fix

时间:2012-06-22 12:19:05

标签: python django iframe cookies safari

因此,基于此处的信息Safari 3rd party cookie iframe trick no longer working?Missing cookies on iframe in safari 5.1.5,很明显旧的伎俩无法运作:

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

所以我正在寻找解决问题的新方法。

它似乎需要打开窗口(有用户权限/点击或它会被safari阻止)并在那里开始会话。

问题是,同一个弹出页面将运行所有中间件,因此它不一定在项目中可行(想要尽可能少的侵入性修复)。

同样django会话启动也在中间件内部,我还没有找到任何干净的手动启动方式。有什么建议吗?

2 个答案:

答案 0 :(得分:4)

我已经创建了修复程序的工作版本,并在此处上传到pypi:http://pypi.python.org/pypi/django-iframetoolbox

注意:在0.2版本之前它可能不稳定

答案 1 :(得分:1)

我也创造了类似于JackLeo的作品。您可以使用中间件或装饰器https://github.com/philroche/django-httpsiframecookiesetter以及更多选项。