在webpy中使用auto_application划分网站的url结构,会发现是个很好用的东西。
使用过程中却发现每个auto_application默认有自己单独的cookie。
范例
#encoding=utf-8
import web
appA = web.auto_application()
appB = web.auto_application()
urls = (
'/save', appA,
'/get', appB
)
class SaveName(appA.page):
path = '/?'
def GET(self):
web.setcookie("name", "wyq", expires=24 * 60 * 60)
return web.cookies().get("age")
class GetName(appB.page):
path = '/?'
def GET(self):
return web.cookies().get("name")
app = web.application(urls, globals())
if __name__ == '__main__':
web.config.debug = True
app.run()
#print app.request("/save").data
#print app.request("/get").data
上面代码,生成两个auto_application appA与appB。
appA处理所有以/save开头的url请求,appB处理所有以/get开头的url请求。
appA = web.auto_application()
appB = web.auto_application()
发送http://0.0.0.0:8080/save请求,将name信息保存在cookie中。
web.setcookie("name", "wyq", expires=24 * 60 * 60)
发送http://0.0.0.0:8080/get请求,获取name值。
预想是返回name值,却发现结果为空。什么原因呢?
观察下面从chrome中取到的截图。
/save请求
注意上面的Set-Cookie,多了个path=/save/。原来在application中保存cookies时,会设置cookies的path属性。
cookie的path属性,用于限制cookie的访问域,只有此域下的请求才能取到此cookie信息。
换句话说只有url以/save/开头的请求才能,取到此cookie的信息。
上面appA属于/save/域下的,appB属于/get/域下的。它们属于不同的域,所以appB访问不到appA中的cookie。
如何解决呢?办法就是在设置cookie时添加path="/"的属性,即可解决。
web.setcookie("name", "wyq", expires=24 * 60 * 60, path="/")