5

http://effbot.org/zone/django-multihost.htmで見つけた multihost.py ミドルウェアを変更して、settings.SITE_ID を動的に設定しましたが、予約を残したばかりかもしれないという懸念があります。

複数のドメイン ホスティングで見つけたほとんどの例は、それぞれの SITE_ID にハードコードされた複数の settings.py ファイルでセットアップされています。

ここに致命的な欠陥がある修正プログラムを作成しましたか? この値を動的に変更すると、a**.

from django.conf import settings
from django.contrib.sites.models import Site

class MultiHostMiddleware:

    def process_request(self, request):
        try:
            host_raw = request.META["HTTP_HOST"]
            colon = host_raw.find(':')
            if colon > -1:
                host = host_raw[0:colon]
            else:
                host = host_raw

            s = Site.objects.get(domain=host)
            if s:
                settings.SITE_ID = s.id

        except KeyError:
            pass # use default urlconf (settings.ROOT_URLCONF)

興味深いことに、これはこれまでのところ稼働していますが、実際のトラフィックには耐えられませんでした。

4

1 に答える 1

6

短い公式の答えは、あなたがこれを行うことは想定されていませんが、ドキュメントではその理由が実際には説明されていません。

スレッド化されたサーバーを使用している場合、競合状態が心配です。これは非常に簡単にテストできます。1 つのビューにを呼び出すだけで、現在のサイトの名前で をsleep()返します。HttpResponse最初のビューがスリープしている間に、別のドメインの別のビューをヒットします。

プリフォークを使えば問題ないと思います。でグローバル構成を変更することでグラフのプロパティを設定するのが最も簡単なので、私は matplotlib でこのアプローチを使用しましたmatplotlib.rcParams.update()。私は prefork fcgi を使用しているため、各リクエストにはプロセス全体が含まれていると安全に想定できます (間違っている場合は修正してください)。

編集:アプリケーションを無効にすることで、RequestSiteを使用してやりたいことができると思います。たとえば、James Bennett のdjango-registrationは、その場合にオブジェクトをインスタンス化し、リクエスト オブジェクトからホスト名を抽出します。sitesRequestSite

于 2011-01-27T20:50:17.587 に答える