【问题标题】:Does this `if` condition ever runs?这个“if”条件是否曾经运行过?
【发布时间】:2019-05-09 06:48:18
【问题描述】:

我正在阅读一些代码,我在这里感到困惑:

class PostListView(ListView):
    # compressed

    def get_context_data(self, **kwargs):

        session_key = 'viewed_topic_{}'.format(self.topic.pk)  # <-- here
        if not self.request.session.get(session_key, False):
            self.topic.views += 1
            self.topic.save()
            self.request.session[session_key] = True           # <-- until here

        kwargs['topic'] = self.topic
        return super().get_context_data(**kwargs)

所以if 条件检查如果没有与该键的会话,则将self.topics.view 加一。

我在这里感到困惑,因为每当用户登录网站时,他们的会话都会自动创建,除非用户没有登录网站,否则没有会话的可能性为零。 (请注意,本项目不允许未经身份验证的用户查看主页,必须登录。) 这个if 条件会被执行吗?

【问题讨论】:

  • print(...) 放入if 并使用不同的设置对其进行测试。您将看到是否可以联系到print()
  • 还在 if 语句之前放置一个不同的 print 语句,以检查它是否到达 if 语句开头

标签: python django if-statement


【解决方案1】:

session_key = 'viewed_topic_{}'.format(self.topic.pk) 这一行表示发布/主题特定的会话密钥。
if not self.request.session.get(session_key, False): 这一行检查密钥是否在会话中可用。如果不是简单地将密钥添加到会话中。
注意:这不是登录会话密钥。所以,不要与登录会话密钥混淆。

【讨论】:

    【解决方案2】:

    if 条件将被执行(预计之前有异常)。 if block 将根据条件执行。

    条件是否为真取决于是否未设置 该主题 ID 的键。对于该主题 ID 的第一次请求,这应该是 true,对于同一会话中的任何后续请求,这应该是 false。如果其他代码设置该键或引发异常,则可能会有所不同。

    顺便说一句,您可以使用:

    if session_key not in self.request.session:
    

    这也将更具可读性。

    【讨论】:

    • 谢谢大哥,如果条件好就换这个吧
    猜你喜欢
    • 1970-01-01
    • 2012-12-24
    • 1970-01-01
    • 1970-01-01
    • 2015-11-12
    • 2020-12-08
    • 2013-07-13
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多