Python Ugettext未在视图中提供正确的值(“缓存”旧语言值)
我有一个相当简单的信息网站,由Django运营 它的“页面(视图)由render_to_响应快捷方式呈现,如下所示:Python Ugettext未在视图中提供正确的值(“缓存”旧语言值),python,django,gettext,Python,Django,Gettext,我有一个相当简单的信息网站,由Django运营 它的“页面(视图)由render_to_响应快捷方式呈现,如下所示: 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', re
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)
}
def create_render_参数(html,请求,标题=u(默认标题)),page_css=“”):
返回{
“模板名称”:html,
“字典”:
{
“标题”:标题,
“page\u css”:“如果page\u css==”则为“”,否则为“”。格式(page\u css),
#其他模板变量。。。
},
“上下文\实例”:RequestContext(请求)
}
本质上,这是一种简单的方法,我使用它来避免额外的代码,避免创建额外的模板块,并且仍然能够为网站翻译成的每种语言指定唯一的CSS和本地化页面标题(本地化为4)。也许有更好的方法可以做到这一点,但我必须承认,在这个问题上,我的Django经验仍然相当有限——我希望听到任何客观的批评
问题是,当我使用ugettext作为\u
,导航/切换语言/重新加载页面时,似乎有时模板中使用的“title”变量在旧语言中“卡住”,即使页面本身已经翻译成新语言
例如,如果网站是意大利语的,我打开主页,标题是正确的。
然后我切换到英语(我处理语言切换的javascript重新加载页面),标题仍然是意大利语,尽管其他所有内容都是英语。我导航到另一个页面,再次导航到主页,重新加载页面几次-标题是意大利语,页面是英语。我转到服务器控制台,触摸wsgi文件(手动重新加载Django)——下一次重新加载时,主页完全是英文的。但后来,我又换了意大利语——页面是意大利语的,标题是英语的
有时这种行为甚至更奇怪——如果我一直按F5重新加载页面,我可能会连续两次从以前的语言中获取其标题,然后一次正确的标题出来,然后在接下来的重新加载中获取“旧”标题
现在最困扰我的是什么-如果我使用ugettext\u lazy作为
,我一点问题都没有。标题始终与页面的其他部分使用相同的语言
据我所知,在每个页面视图上都会调用视图,因此我认为我遇到了一些问题-create\u render\u args()
对缓存在某个位置的每个给定页面的输出,并始终返回同一个字典,这是不可能的
这个问题的根源是什么?我遗漏了什么?这是旧的Python默认参数,再次得到了它
create\u render\u args
函数的默认值在首次导入该函数时计算,这可能是在服务器进程启动时。WSGI中的进程持续处理多个请求,这解释了为什么在视图之间缓存值,但通常有多个进程同时运行,这解释了为什么有时您会看到正确的版本
我不确定为什么使用
ugettext\u lazy
对你来说不是答案——这似乎正是它的使用案例——但是,否则你可以使用原始文本本身作为默认文本,在函数中执行\u lazy
调用。ugettext\u lazy
正在解决它,我只是好奇原始问题的根源。顺便说一句,ugettext\u lazy
应该用在不应该在每个新页面视图上运行的代码上(并且由于在视图中使用ugettext的lazy版本对我来说是一个奇怪的解决方案)。我想我现在看到了默认参数计算的问题。非常感谢。