我正在将Bottle.py用于小型Web应用程序,并实现了一个登录系统,其中在每个请求开始时检查cookie值。如果设置了cookie,则会针对用户数据库检查cookie值以获取有效凭据,并将包含实际用户名的字符串添加到请求对象中以供稍后在同一请求中使用;
request.account = username #where username is fetched from the database
目的是1)使用通用例程检查登录,2)在构建特定响应时保留用户名
我的问题是,在设置了request.account的第一个请求之后,之后的所有请求都将设置此值。这让我想知道在Bottle中的请求之间是否存在请求对象的内部对象重用。
有谁知道这是如何运作的;如果请求对象被重用或者只有我的代码包含错误?有什么想法可以解决这个问题吗?
为了记录,我使用内置的Web服务器进行测试,在OS X上的python 2.7上运行。
编辑:
我编写了一个功能齐全的代码来说明上面列出的问题。它相当简化,以避免cookie和数据库。
#!/usr/bin/python2.7
from bottle import request, response, route, run
# some login cookie validation routine...
# this might validate cookie against user database
# and store the username of the logged in user
# in request.account.
def validate():
if not hasattr(request, 'account'):
print "request.account is NOT set"
request.account = "SomeUsername"
return False
else:
# here is the problem, this implies object reuse
# since I am only calling validate() once?
# or is my code bugged somehow?
print "request.account is already set"
return True
@route('/')
def index():
ret = validate() #validating cookie
if ret:
username = request.account
else:
username = "<Not logged in>"
return "TEST: this is /, username: %s" % username
if __name__ == "__main__":
run(host='localhost', port=8080, debug=True, reloader=True)