2012-01-24 18 views
1

私はDjangoによって実行されている、かなりシンプルな情報ウェブサイトを持っています。ビューに正しい値が指定されていないUgettext(古い言語値をキャッシュしています)

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) 
    } 

Essentialyそれは私が避けるために使用する簡単な方法です

そのページ(ビュー)は、このように使用されるrender_to_responseショートカットによってレンダリングされています余分なコードブロックを作成することなく、サイトが翻訳される言語ごとにユニークなCSSとローカライズされたページタイトルを指定できるようになります(ローカライズされて4になります)。おそらくこれを行う良い方法がありますが、私はこの問題に関して私のDjangoの経験はまだ限られていることを認めなければなりません。私は客観的な批判を聞きたいと思います。

問題は、私は_としてugettext使用しており、私は/スイッチの言語/リロードページを移動するとき、テンプレートで使用されている、時には「タイトル」変数はたとえ古い言葉で「立ち往生」されることを思われることですページ自体はすでに新しい言語に翻訳されています。

例えば、サイトがイタリア語であれば、私はメインページを開き、タイトルは適切です。 それから、私は英語に切り替えます(言語スイッチを扱う私のjavascriptがページをリロードします)。他のものはすべて英語ですが、タイトルはまだイタリア語です。私は別のページに移動し、再びメインページに移動し、ページを数回リロードします。タイトルはイタリア語、ページは英語です。私はサーバーコンソールに行き、wsgiファイルに触れる(手動でDjangoをリロードする) - メインページは次のリロード時に完全に英語である。しかし、その後、私は言語をイタリア語に再度切り替えます。ページはイタリア語で、タイトルは英語です。

時には動作がさらに奇数になる— F5キーを押してページをリロードし続けると、前の言語のタイトルが2回連続して表示され、正しいタイトルが一度だけ表示され、次のリロードで「古い」タイトルを取得します。

ugettext_lazyを_とすると、私は全く問題ありません。です。タイトルは常に他のページと同じ言語です。

私が知る限り、各ページビューでビューが呼び出されているので、私は遭遇するものと信じています。create_render_args()の各ページの出力はどこかにキャッシュされ、常に同じ辞書を返します。可能。

この問題の原因は何ですか?私は何が欠けていますか?

答えて

2

これは古いPythonのデフォルト引数gotchaです。

create_render_args関数のデフォルト値は、関数が最初にインポートされたときに評価されます。これは、おそらくサーバープロセスが起動するときです。 WSGIのプロセスは最後に複数のリクエストを処理するため、ビュー間で値がキャッシュされる理由が説明されていますが、通常は複数のプロセスが同時に実行されるため、正しいバージョンが表示されることがあります。

ugettext_lazyを使用する理由がわかりません - これはまさにその使用例です - そうでなければ、生のテキスト自体をデフォルトとして使用して、関数内で_呼び出しを行うことができます。

+0

「ugettext_lazy」はそれを解決していますが、私は元々の問題の原因を知りました。 AFAIK、ugettext_lazy'は、新しいページビューごとに実行されることを意図していないコードで使用する必要があります(ビューの怠惰なバージョンのugettextを使用すると、私にとって奇妙な解決策であると感じるため)。私は今、デフォルトの引数評価の問題を見ると思います。ありがとうございました! – havelock

関連する問題