Python Django Iframe Safari修复程序

Python Django Iframe Safari修复程序,python,django,iframe,cookies,safari,Python,Django,Iframe,Cookies,Safari,因此,根据这里和这里的信息,很明显,老把戏是行不通的: 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 Sa

因此,根据这里和这里的信息,很明显,老把戏是行不通的:

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.http导入HttpResponse
从django.conf导入设置
会话\u COOKIE\u NAME=getattr(设置“会话\u COOKIE\u NAME”)
类safariiframefix中间件(对象):
"""
中间件使用iframes中的Safari浏览器修复会话
Safari默认安全策略限制
iframe中第一个请求中的cookie设置
解决方案是创建隐藏表单以保留GET变量
并将其重新发布到当前URL
"""
def过程_请求(自我,请求):
if request.META['HTTP\u USER\u AGENT'].find('Safari')!=-1 \
和request.META['HTTP\u USER\u AGENT'].find('Chrome')=-1\
和会话\u COOKIE\u名称不在request.COOKIES中\
和“cookie\u fix”不在请求中。获取:
html=“”
对于request.GET中的项目:
html+=“”%(请求.获取[项目],项目)
html+=“”
html+=“”
html+=“document.cookie\u fix.submit()”“
返回HttpResponse(html)
其他:
返回
所以我正在寻找新的解决方法

似乎它需要打开窗口(具有用户权限/单击,否则将被safari阻止)并在那里启动会话

问题是同一个弹出页面将运行所有中间件,因此它在项目内部可能并不总是可行的(希望尽可能少的侵入性修复)


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

我已经创建了修复程序的工作版本,并在这里上传到pypi:


注意:在0.2版本之前,它可能不会稳定,我也创建了一个类似于JackLeo的工作环境。您可以使用中间件或装饰器以及其他一些选项。

为什么需要手动启动会话?如果您的弹出窗口来自Django并通过中间件,那么如果新会话不存在,您将自动获得新会话。为什么不在iframe中使用js和post进行替换?