8

Settings.py の Django の TEMPLATE_DIRS は、UNIX スタイルのスラッシュを呼び出します。

このため、電話をかけると

get_template('some/template.html')

ビューでは、結果は常にルートから始まり、

/home/username/projectname/public/some/template.html

問題は、まったく別のサイトでホストされているテンプレートを使用したいということです。これは、他の Settings.py フィールド (MEDIA_URL および STATIC_URL) に対しては正常に機能し、異論のない絶対 http パスを使用します。

http パスを指定すると、

 TEMPLATE_DIRS ('http://example.com/',)

Settings.py で強制します

get_template('some/template.html')

試して見つけるという観点で

/home/username/projectname/public/http://example.com/some/template.html

私はこれを回避しようとしました

TEMPLATE_DIRS ('../../../../http://example.com/',)

しかし、それでも先頭のスラッシュが強制されるため、「/http://example.com」が得られますが、これは役に立ちません。

私の質問:

  1. これをだまして別のサーバーからテンプレート ファイルを取得する方法はありますか?
  2. ビュー用にテンプレート ファイルを処理する必要があることを考えると、それは実現可能でしょうか?
  3. UNIXスタイルのスラッシュを必要としない「django.template.loaders.filesystem.Loader」の代替を作成することは可能ですか?
4

3 に答える 3

5

したくない場合は、テンプレート ディレクトリを使用する必要はありません。テンプレート ファイルを提供しているサーバーがある場合は、それらをリモートで取得しurllib2、コンテキストを使用して手動でテンプレートを作成およびレンダリングできます。

import urllib2
from django.template import Context, Template

tpl_html = urllib2.urlopen("http://mysite.com")
tpl = Template(tpl_html)
return tpl.render(Context({
    'some_variable' : 'some_val',
})

これを行う場合は、キャッシングを組み込む必要があります。このテンプレートを使用するすべてのリクエストについて、外部リクエストを作成する必要があります。別の方法として、これをカスタム ローダーに書き込むこともできますが、同じ制限を受けます。

于 2011-11-20T11:48:47.243 に答える
3

これはできません。

パス名とは関係ありません。ファイルシステム テンプレート ローダーがファイル システムから何かをロードする必要があるため、この名前が付けられています。

これは、MEDIA_URL の場合とはまったく異なります。これは、HTML にパスを追加するだけで、ブラウザーがロードします。Django はそのファイルがどこにあるかは気にしません。実際には逆のことが当てはまりますが、URL ではない (つまり、どこかの Web サーバーによって提供される) ファイルパスを渡すと、単に機能しません。

これで、別のサーバーからテンプレートを取得するテンプレート ローダーを作成できます。テンプレート ローダーはプラグ可能です。新しいローダーの名前を TEMPLATE_LOADERS 設定に入れるだけです。urllib.urlopenローダー自体は、外部サーバーからテンプレートを取得するなどの方法を使用する必要があります。

しかし、これを行う前によく考えてください。これは、ページを提供する前に、すべてのテンプレート リクエストで外部サーバーへの呼び出しが必要になることを意味します。他のテンプレートを拡張し、含まれているテンプレート タグへの呼び出しを含むテンプレートの典型的なケースでは、5 回または 10 回の呼び出しになる可能性があります。また、メディア ファイルとは異なり、並行して実行することはできません。ページはプロセス全体が完了するまで提供されません。これにより、Web サーバーが非常に遅くなる可能性があります。

なぜこれをする必要があると思うのかわかりません。テンプレートはアプリケーション コードの一部であるため、通常は Python コードと同じサーバーに存在します。それらを外部に保持する理由が本当にある場合、1つの解決策は、 sshfsなどを介して外部ファイルシステムをWebサーバーにマウントすることです。ただし、それでも非常に遅くなる可能性があります。もう一度考えてみて。

于 2011-11-20T11:46:36.927 に答える
0
  1. いいえ - http 経由で別のサーバーからファイルを取得するようにだますことはできません。
  2. はい - 確かに django.template.loaders.filesystem.Loader をサブクラス化して (そして load_template_source メソッドを適切に変更することで)、http 経由でテンプレートをロードできるようにすることができます。

3 を実行したら、2 の答えは「はい」になります。実行可能です。最終的に、Django のテンプレート言語は、ファイルが正しい形式である限り、どこからファイルを取得するかを気にしません。

ただし、テンプレートをロードする方法は非常に非効率的であり、同じ結果を達成するためのより良い方法がある可能性が高いです。

于 2011-11-20T11:55:58.567 に答える