【发布时间】:2015-07-29 02:32:35
【问题描述】:
Flask 的 session 对象似乎正在将 OrderedDict 更改为 dict。这很重要,因为我希望将有关当前用户可访问页面的信息存储在OrderedDict 中,以帮助自动创建导航栏。
我可能会睡眼惺忪,但我不认为我在这里写了任何会覆盖现有数据的东西,所以 AFAICT 它只是无缘无故地转换为 dict。
这是在session 对象中设置OrderedDict 的代码。
def safe_route(page_request):
"""Returns the correct page for the user's request.
If a user requests a non-existent page, 404.
If user wants a page they shouldn't see, but somehow
they know about it, redirects to an access-denied page.
If everything is in order, returns the page the user requests.
"""
if page_request not in ordered_urls:
return abort(404) # early return for 404s
# get current user and build their navi-dict.
# this dict will be used to build the navibar in the webpage.
if not 'registered' in session:
CurrentUser = get_user(request)
session['name'] = CurrentUser.name
session['navi'] = build_user_navi(CurrentUser)
session['registered'] = True
if page_request in session['navi']:
tpl = "/{}.html".format(page_request)
else:
# if here, the user requested a page that DOES exist
# but they do NOT have access to. therefore, they are being
# goons and require a trip to boxxytown
tpl = "accessdenied.html"
return render_template(tpl, on_page=page_request)
它检查以确保会话具有'registered' 标志;如果不是,它会获取用户信息,然后调用build_user_navi,它返回OrderedDict。这是第一次工作;初始页面加载按我最初的意图显示导航栏中的链接。随后单击时,订单丢失了,OrderedDict 上的类型显然也是如此。
在render_template 调用之前,我在代码中添加了这一行,看看它是否只是改变了我的类型:
print type(session['navi'])
果然在<class 'collections.OrderedDict'>和<type 'dict'>之间切换。
有没有一种方法可以将OrderedDict 正确存储为会话数据,或者是否有一些非常好的理由说明这只能在第一次使用时才可以阻止我使用这种方法?
【问题讨论】: