【发布时间】:2018-04-21 20:31:50
【问题描述】:
我遇到一个问题,在将 SignedCookieSessionFactory 添加到我的金字塔配置后,当我尝试在浏览器中刷新页面时,只返回一个空白页面(head 和 body 标记都是空的)。我第一次点击该页面时,它按预期呈现。一个单独的会话也会产生一个空白页。为了让页面再次呈现,我必须重新启动服务器。在添加会话工厂之前刷新工作正常,但刷新时会丢失状态(如预期的那样)。
金字塔配置:
def main(global_config, **settings):
session_factory = SignedCookieSessionFactory('cossecret')
config = Configurator(settings=settings, session_factory=session_factory)
config.include('pyramid_jinja2')
config.include('.models')
config.include('.routes')
config.registry.games = Games()
config.scan()
return config.make_wsgi_app()
routes.py:
def includeme(config):
config.add_static_view('static', 'static', cache_max_age=3600)
config.add_route('home', '/')
config.add_route('game', '/game/{game}')
view.py:
@view_config(route_name='game', renderer='templates/game.jinja2')
def game_view(request):
""" Returns Game Play page based on ID"""
if "game_id" in request.session:
if request.matchdict['game'] != request.session["game_id"]:
if request.matchdict['game'] in request.registry.games.games:
request.session.invalidate()
request.session["game_id"] = request.matchdict['game']
else:
raise HTTPNotFound
else:
if request.matchdict['game'] in request.registry.games.games:
request.session["game_id"] = request.matchdict['game']
else:
raise HTTPNotFound
response = {}
response['game'] = request.session['game_id']
if "player_id" in request.session:
response['player_id'] = request.session['player_id']
else:
response['player_id'] = "None"
return response
我对 Pyramid 很陌生,所以任何想法都会受到赞赏。逐步浏览渲染器,我注意到渲染器第一次扫描了模板中的 html 标头,但第二次完全跳过了它们,然后忽略了 body 标记之后的所有内容。不确定这是否有帮助。
【问题讨论】:
-
当您说“渲染器第一次扫描模板中的 html 标头”时,您在谈论什么渲染器。这对我来说没有意义,也不符合我对 pyramid_jinja2 的了解(我是该库的维护者)。
-
对不起,我使用 pycharm 单步执行代码。我在返回响应处设置了一个断点,并单步执行它命中模板。看起来它正在加载模板。我所指的部分是 from_code 方法,它似乎读取模板文件的每一行,直到它遇到需要替换的变量然后返回。当我重新加载页面时它再次运行时,它只会到达 head 标签并返回。我只是在描述我在 pycharm 中看到的内容。我希望这会有所帮助。
-
我相信您遇到的任何问题都与您的模板的解析和执行方式无关。当然,我在这里看不到模板,也无法重现您的问题。您粘贴的代码当然看起来不错。
-
Michael,我找到了导致它的原因(请参阅下面的答案),但我不知道它为什么会产生这种行为。任何想法为什么会导致这个问题?
标签: python-2.7 jinja2 session-cookies pyramid