Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/django/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python Ugettext未在视图中提供正确的值(“缓存”旧语言值)_Python_Django_Gettext - Fatal编程技术网

Python Ugettext未在视图中提供正确的值(“缓存”旧语言值)

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

我有一个相当简单的信息网站,由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', 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版本对我来说是一个奇怪的解决方案)。我想我现在看到了默认参数计算的问题。非常感谢。