Flask会话cookie未在Safari中设置

时间:2015-07-13 15:28:20

标签: python session safari flask mobile-safari

我的会话cookie遇到了一个奇怪的行为:在我的mac上运行烧瓶应用程序,一切正常,并且在任何浏览器上都设置了cookie。

但是,如果我在Windows服务器上运行它,会话cookie不会在Safari(和iOS)上设置 - 但仍然适用于任何其他浏览器。怎么会发生这种情况?以下是一个简单应用的示例:

public class CountryManager: NSObject {

    public func saveWines(json:JSON) {
        var countriesForStore = [Country]()
        let db = RLMRealm.defaultRealm()
        for (key:String, subJson:JSON) in json{
            let country = Country() //Serialize each country
            country.configure(key.toInt()!,json:subJson)
            countriesForStore.append(country)
        }

        db.beginWriteTransaction()
        db.addOrUpdateObjectsFromArray(countriesForStore)
        db.commitWriteTransaction()
    }

    public func regionsForCountryWithNameLike(name:String) -> RLMResults {
        let db = RLMRealm.defaultRealm()
        let countryPredicate = NSPredicate(format: "name CONTAINS[c] %@", name)
        let countries = Country.objectsWithPredicate(countryPredicate)

        var rawRegionNames = [String]()
        for country in countries {
            if let c = country as? Country {
                for region in c.regions{
                    rawRegionNames.append((region as! Region).name)
                }
            }

        }
        let regionNames = "','".join(rawRegionNames)
        let regionPredicate = NSPredicate(format: "name IN {'\(regionNames)'}")
        let regions = Region.objectsInRealm(db, withPredicate: regionPredicate)
        return regions
    }
}

以示例test.html:

import os
import uuid
from flask import Flask, render_template, session

app = Flask(__name__)

SESSION_LIFETIME = 3600

@app.before_request
def before_request():

    # create session
    if not session.get('uid'):
        session.permanent = True
        session['uid'] = uuid.uuid4()

@app.route('/', methods=['GET'])
def test():

    return render_template('test.html')

if __name__ == "__main__":
    app.secret_key = os.urandom(24)
    app.permanent_session_lifetime = SESSION_LIFETIME
    app.debug = True
    app.run(threaded=True,
            host="0.0.0.0",
            port=int("5000")
            )

为什么它适用于任何浏览器而不适用于(重要)Safari?为什么在我的mac上运行相同的代码(从外部和本地访问),但在Windows上没有?所有其他浏览器都使用Windows(甚至从外部)。

1 个答案:

答案 0 :(得分:1)

我有相同的行为,会话变量无法正常工作。

所以我所做的就是删除会话使用,并像我使用list with key-value pair

的会话一样工作

首先初始化列表

 list_name = {'key1':'','key2':''};  and so on...

然后将变量存储在此列表中,并通过替换键

在任意位置访问它