Python - if、elif、else语句未按预期工作

1 投票
1 回答
1806 浏览
提问于 2025-04-18 17:35

我在用Django做一个网站,需要建立一个上下文处理器来提供来源信息(变量叫做 referer)。

我写了一个简单的条件语句:如果、否则如果、再否则。

[ . . . ]

host = get_current_site(request)
local_url = SITE_URLS['local']
dev_url = SITE_URLS['dev']
prod_url = SITE_URLS['prod']

# print referer for debugging purposes - remove when done...
print("current host: {0}".format(host))
print("current urls: {0} {1} {2}".format(local_url, dev_url, prod_url))

# determine default referer - eg, set as host/site name
if host == prod_url:
    referer = prod_url

elif host == dev_url:
    referer = dev_url

elif host == local_url:
    referer = local_url

else:
    # set referer for current request
    try:
        referer = request.META['HTTP_REFERER']

    except KeyError as e:
        print('ERROR: key error - referer doesn\'t exist: {0}'.format(str(e)));

[ . . . ]

奇怪的是,上面的打印语句显示 hostlocal_url 是相等的(从控制台看到的):

current host: http://localhost:8000
current urls: http://localhost:8000 [ . . . ]

但是它还是在执行else > try,并抛出了一个键错误……关键是,只有当默认的主机/网站不可用时,request.META['HTTP_REFERER'] 才是有效的。

这里到底出了什么问题?我好像漏掉了什么。Python告诉我 host != local_url,但为什么呢?

编辑

感谢 @Martijn Pieters 的一个很好的提示。我修改了打印语句,现在看到的是:

current host: <Site: http://localhost:8000>
current urls: 'http://localhost:8000'

我想我忘记使用网站框架的属性了:

https://docs.djangoproject.com/en/dev/ref/contrib/sites/

1 个回答

4

很可能你遇到了空格问题;可以用下面的格式替换你的代码:

print("current host: {0!r}".format(host))
print("current urls: {0!r} {1!r} {2!r}".format(local_url, dev_url, prod_url))

使用 repr() 函数的值,这样可以显示更多关于值类型的信息,而且任何多余的空格会立刻显现出来。

如果你看到一个 django.contrib.sites.models.Site 对象,可以对比一下它的 domain 属性:

if host.domain == prod_url:

撰写回答