gpt4 book ai didi

python - Ugettext 未在 View 中提供正确的值 ("caching"旧语言值)

转载 作者:行者123 更新时间:2023-12-01 06:03:57 25 4
gpt4 key购买 nike

我有一个相当简单的信息网站,由 Django 运行。

其页面( View )由 render_to_response 快捷方式呈现,使用方式如下:

def index(request):  
return render_to_response(**create_render_args('Index.html', request))

def somepage(request):
return render_to_response(**create_render_args('Somepage.html', request, _(u'Some page title'), 'somepage.css'))

# other pages are also rendered in that way

create_render_args 函数在哪里:

def create_render_args(html, request, title = _(u'Default title'), page_css = ''):
return {
'template_name' : html,
'dictionary' :
{
'title' : title,
'page_css' : '' if page_css == '' else '<link rel="stylesheet" href="/css/{}" />'.format(page_css),
# other template variables...
},
'context_instance' : RequestContext(request)
}

本质上,这是一种简单的方法,我用它来避免额外的代码,避免创建额外的模板 block ,并且仍然能够为网站翻译成的每种语言指定唯一的 CSS 和本地化的页面标题(已本地化为 4 种语言)。也许有更好的方法可以做到这一点,但我必须承认我的 Django 经验在这件事上仍然相当有限 - 我希望听到任何客观的批评。

问题是,当我使用 ugettext 作为 _ 时,并且我导航/切换语言/重新加载页面时,似乎有时会使用“title”变量即使页面本身已经翻译成新语言,模板中的内容也会“卡在”旧语言中。

例如,如果该网站是意大利语,我打开主页,标题是正确的。然后我切换到英语(我处理语言切换的 JavaScript 重新加载页面),标题仍然是意大利语,尽管其他所有内容都是英语。我导航到另一个页面并再次导航到主页,重新加载页面几次 - 标题是意大利语,页面是英语。我转到服务器控制台,触摸 wsgi 文件(手动重新加载 Django) - 下次重新加载时主页是全英文的。但随后,我再次将语言切换为意大利语 - 页面是意大利语,标题是英语。

有时行为甚至更奇怪 - 如果我继续按 F5 重新加载页面,我可能会连续两次从以前的语言中获取其标题,然后一次出现正确的标题,然后我在以下重新加载时获得“旧”标题。

现在最困扰我的是 - 如果我使用 ugettext_lazy 作为 _,我完全没有问题。标题始终使用与页面其余部分相同的语言。

据我所知, View 在每个页面 View 上被调用,所以我相信我遇到了 - create_render_args() 每个给定页面的输出被缓存在某个地方并返回相同的字典一直 - 不应该是可能的。

这个问题的根源是什么?我错过了什么?

最佳答案

这又是旧的 Python 默认参数的问题。

create_render_args 函数的默认值在函数首次导入时评估,这可能是在服务器进程启动时。 WSGI 中的进程持续多个请求,这解释了为什么值在 View 之间缓存,但通常有多个进程同时运行,这解释了为什么有时您会看到正确的版本。

我不确定为什么使用 ugettext_lazy 不是你的答案 - 这似乎正是它的用例 - 但否则你可以只使用原始文本本身作为默认值并执行函数内的 _ 调用。

关于python - Ugettext 未在 View 中提供正确的值 ("caching"旧语言值),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8990526/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com