使用bottle.py为

时间:2015-05-18 03:00:02

标签: python cookies bottle

python新手。我使用bottle.py作为Web服务器。

我有一组需要在不同路由上呈现的静态HTML文件。我正在使用static_file()函数。我还想为页面设置基于会话的cookie。所以我使用的是response.set_cookie()。

但事实证明,当我返回一个static_file时,cookie永远不会被设置。但是,如果我将响应更改为一个简单的字符串,set_cookie()工作正常。有谁能解释为什么?我该如何解决这个问题?

@app.route("/index")
def landingPage():
response.set_cookie("bigUId", "uid12345")
# return "Hello there"    
return static_file("/html/index.html", root=config.path_configs['webapp_path'])

2 个答案:

答案 0 :(得分:6)

欢迎使用Bottle和Python。 :)

Bottle source code,问题很明显。看看def static_file(...): ... return HTTPResponse(body, **headers) 如何结束:

static_file

HTTPResponse会创建一个 static_file对象 - 因此您之前设置的所有标头都将被丢弃。

一个非常简单的方法是在调用@app.route("/index") def landingPage(): resp = static_file("/html/index.html", root=config.path_configs["webapp_path"]) resp.set_cookie("bigUId", "uid12345") return resp 后设置Cookie ,如下所示:

my_matrix[my_matrix==0] <- NA

我刚尝试过,它完美无缺。祝你好运!

答案 1 :(得分:0)

好吧,我刚刚尝试过,确实它没有用,我之前从未尝试过使用带有static_file()的cookie ...但是,你可以执行以下操作将静态文件作为模板返回,并且cookie将是设置:

您的路由功能:

@route('/test')
def cookie_test():
    response.set_cookie("test", "Yeah")
    return template('template/test.html')

要实现这一点,您需要以这种方式为/ template定义路径:

@route('/template/<filepath:path>')
def server_static(filepath):
    return static_file(filepath, root="./template")

(显然,根据您的项目路径将“/ template”更改为您需要的任何内容!)

我这样做,而且工作正常!当你尝试使用static_file()设置一个cookie时,我不确定为什么它不起作用,它可能来自这样一个事实:IT是你正在服务的静态文件,或者其他什么,我真的不知道。

另外,使用template()函数来服务一个“静态”html页面可能不是正确的方法,但是我有一段时间以来一直在做这个,我从来没有遇到任何问题有这个。

希望它有所帮助!