【问题标题】:Pyramid rendering blank page on refresh after configuring sessions配置会话后,金字塔在刷新时呈现空白页面
【发布时间】: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


【解决方案1】:

显然,在我的 API 中的另一个观点中,有这样的:

json_return = json.dumps(return_data)
response = Response     
response.content_type = 'json'      
response.body = json_return     
return Response(content_type='json', body=json_return)

我不知道为什么创建两个响应对象会导致这种行为,但是删除第一个以支持仅使用“return”行解决了问题。

【讨论】:

  • 嗯,第一个对象是一个类,而不是一个实例,因此会影响从该类创建的所有响应对象,这不是很好。
  • 啊!这就说得通了。谢谢!
猜你喜欢
  • 1970-01-01
  • 2017-02-21
  • 1970-01-01
  • 2015-03-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-06-26
相关资源
最近更新 更多