2010-11-23 10 views
7

私はDjangoプロジェクト用のJSファイルを書くときに、もちろんAJAX呼び出しをいくつか行いますが、その呼び出しのURLはハードコードされています(これは非常に醜いです)。Django:JSを動的に生成するのは良い考えですか?

私はJSファイルをApacheの代わりにdjangoで扱うことを考えていたので、テンプレートタグ({% url %} !!!)を利用することができました。

私はこれをしてはいけない理由はありますか?

これを行うには正しい方法がありますか?

(これは変更されていないJSファイルを再送するのに多くの時間を消費しますが!)

答えて

6

私はdjango-mediageneratorが、それは十分に文書化されていない場合でも、その機能を提供することを見出した、djangopackagesからこれらのアセット・マネージャーのアプリケーションでより深く検索:(あなたは、Djangoのテンプレートとしてあなたのjsやcssファイルを生成して、静的にそれらを提供することができます彼らもバンドルされていて、キャッシングは管理されています。だから1つの石で2つの鳥+それはセットアップが本当に簡単です!お使いの設定で

ROOT_MEDIA_FILTERS = { 
    'js': 'mediagenerator.filters.template.Template', 
} 

JSファイルを持つためには、単にフィルタを追加し、(セット・アップしたdjango-mediageneratorをした後)のDjangoテンプレートとして生成されました。

+1

今日私は[django-compressor](https://github.com/jezdez/django_compressor) – sebpiq

0

ブラウザに送信される.jsはさまざまです。これにより、デバッグがより面倒になる可能性があります。多分問題ではなく、潜在的に考慮すべきもの。

+0

私はJSファイルがブラウザによってキャッシュされるか分かりません...それは毎回生成されるので、ブラウザは毎回のリクエストでそれをダウンロードするとは思わない? – sebpiq

+0

おそらくそうです。 jsのhttpキャッシュの応答ヘッダーを調べる必要があります – seand

4

動的に生成するJavascriptは非常に強力なツールになることができます。

一般的に、すべての要求に対して作業を最小限に抑えるためにできるだけ静的に保つ必要があります。これには、可能な限りブラウザキャッシュを持たせることが含まれますが、これはあなたのケースで問題になる可能性があります。

私が通常行っていることは、ベーステンプレートのヘッダーにブロックを入れることです。実行時にしか知られていないカスタムJavaScriptを実行する必要のあるテンプレート(たとえば、ログインしたユーザーに基づくカスタマイズ)では、ブロックに追加します。ここで私はダイナミックに私が知っているので、私はいくつかの仮定を行うことができますキャッシュされませんを生成することができます。欠点はより複雑です。

あなたが必要とするものがURLを指している場合、または単純な設定などがある場合は、これらの設定でJavaScriptファイルを返すビューを作成することをお勧めします。正しいヘッダー(Etag、Cache-Controlなど)を設定して、ブラウザが適切な時間にファイルをキャッシュできるようにすることができます。コードをアップグレードするとき、Etagが変更されることを確認します。コンフィギュレーションを使用する必要があるコードでは

、あなたは常にあなたが探している変数は、実際にあなたがが何らかの理由でときでJavaScriptの設定をデバッグするのは難しいです問題への実行がする他に定義されていることを確認する必要があります正しくロードされていません。

11

私はハイブリッド技術に行きます。あなたのjavascriptのほとんどを静的に提供してください。しかし、あなたのDjangoテンプレートでは、サーバ側のコードで生成されたさまざまなグローバル変数を定義する<script>ブロックを持っています - urlが良い例です。静的JSは動的コードで生成された変数を参照できます。

+0

これは私も同様ですが、ユーザーの入力を受け入れるものを実行している場合、安全でないインラインコンテンツセキュリティポリシーのスクリプトを使用するため、クロスサイトスクリプティングの脆弱性があります。より良い選択肢があればいいだろう。 – kloddant

関連する問題