关于settings.py的奇怪的间歇性行为显然

时间:2015-05-05 13:32:42

标签: python django

我正在使用名为“django simple captcha”的python包,它允许您通过在设置文件中设置CAPTCHA_FONT_PATH来更改用于生成验证码图像的字体。但是,我希望动态更改CAPTCHA_FONT_PATH,每次运行验证码,并在我的views.py中调用

import captcha.conf;
...
captcha.conf.settings.CAPTCHA_FONT_PATH = BASE_DIR + '/fonts/' + random.choice(cfonts)

但是,它只是偶尔更新验证码实际上因某些未知原因而使用的CAPTCHA_FONT_PATH。有时它会更新,有时它不会更新(与random.choice调用完全无关,顺便说一句)。对于上述情况,我也尝试使用setattr,但行为没有变化。

CAPTCHA_FONT_PATH只能在名为views.py的函数的captcha_image文件中由验证码访问:

from captcha.conf import settings
...

font = ImageFont.load(settings.CAPTCHA_FONT_PATH)

以及它自己的settings.py

from django.conf import settings
...

CAPTCHA_FONT_PATH = getattr(settings, 'CAPTCHA_FONT_PATH'...)

一般来说,还有一些我对settings.py不了解的事情。

Django 1.8 (mod_wsgi 4.2.8/Python 2.7)

编辑:我并不完全确定它与设置有关,因为有时我无法判断某些captcha_image是否每次迭代都被调用,但不知道为什么它不会。也许有人熟悉这个软件包。

1 个答案:

答案 0 :(得分:0)

如果此行位于您的模块顶部

captcha.conf.settings.CAPTCHA_FONT_PATH = BASE_DIR + '/fonts/' + random.choice(cfonts)

然后在加载views.py时加载一次,而不是每次运行视图时加载。您需要将该行移动到视图中,以便在每次视图运行时重新生成它。

请注意,Django不鼓励altering settings at runtime。你的情况略有不同,因为你正在改变captcha.conf.settings,但它仍然看起来有点奇怪。理想情况下,我猜你会改变 django simple captcha ,这样你就可以为字体路径定义一个callable而不需要一个常量。