90%のデータとコードを共有する2つのDjangoサイトを作成する

StackOverflow https://stackoverflow.com/questions/4619226

  •  30-09-2019
  •  | 
  •  

質問

Djangoアプリとしてホストされている2つの密接に関連するサイト、メインサイトとモバイルサイトがあります。彼らは同じ機能をたくさん持っており、同じデータにアクセスする必要があります。主な違いは、テンプレートが異なることであり、サイトの構造の方法が異なることです。

私には2つの別々の仮想ホストがあります。1つは1つです(ただし、そのようにする必要はありません)。私の最初の考えは、Djangoサイトのフレームワークがこれを解決するのに役立つということでしたが、ドキュメントは私のユースケースを説明していないようです。

誰かが私が正しい軌道に乗っているかどうかを知るために私にヒントを与えることができますか?たとえば、ホームページはアプリ間で完全に異なるため、urls.pyは異なる必要があります。主な目標は、2つの異なるアプリのデータを共有することと、それを管理するコードを複製する必要がないことです。

メインサイトから:

  • ユーザーは、モデルに保存されているアイテムを提出します

モバイルサイトから:

  • ユーザーはアイテムのリストを表示し、メインサイトに入力したばかりのアイテムを表示します
  • ユーザーは最近追加されたアイテムで5つ星の評価を与えます

メインサイトから:

  • ユーザーは、評価されたアイテムのリストを表示し、最近追加されたアイテム(現在は高い評価がある)がリストに表示されます。
役に立ちましたか?

解決 2

さて、両方の答えは素晴らしく、私が最終的な解決策に選んだものに貢献しています。

settings.pyファイルには、root_urlconfというオプションがあります。 settings_desktop.pyとsettings_mobile.pyと呼ばれる2つのsettings.pyファイルを作成しました。これらのそれぞれで次のコードを使用しました。

from settings.py import *

ROOT_URLCONF = 'myapp.urls_mobile'

(またはデスクトップの場合、myapp.urls_desktop)

これにより、実際には、各サイトで異なるテンプレートディレクトリを使用できるなど、多くのクールな機能が提供されますが、実際にはそうするつもりはありません。

次に、WSGIファイルの2つのバージョンを作成しました。ここでは、唯一の違いがこの行でした。

os.environ['DJANGO_SETTINGS_MODULE'] = 'myapp.settings_mobile'

また

os.environ['DJANGO_SETTINGS_MODULE'] = 'myapp.settings_desktop'

各仮想ホストの唯一の違いは、各ホストの異なるWSGIファイルを指すWSGISCRIPTALIASラインです。

これにより、両方のサイトに簡単に対応できる1つのDjangoアプリを効果的に使用できました。

これに対する良い解決策を解決するのを手伝ってくれてありがとう。

他のヒント

見て 同様の質問に対するこの答え. 。基本的に、同じビューを使用して、ユーザーエージェントに基づいて異なるテンプレートを返すことができます。また、アプリケーションロジックを構造化して、Django用語で異なる「アプリ」に分割されるようにすると、同様のコンポーネントで異なるフローが必要な場合は再利用できます。うまくいけば、これがあなたを外して走らせます。

アップデート:

したがって、メインサイトがあるとしましょう http://www.mainsite.com/ メインサイトの機能を作る独自のurls.pyモデルとviews.pyがあります。それからあなたは持っています http://www.m.mainsite.com/ これには、独自のURLとビューがあります。次に、メインサイトのモデルをインポートして、モバイルサイトビューで使用できます。

私は一度非常によく似たことをしました。複数のurls.pyのこの問題を解決する私の方法は、次のようなものでした。

各サイトに1つずつ、2つのurlconfを作成します。

新しいミドルウェアを作成します:

from django.utils.cache import patch_vary_headers

class DomainMiddleware:

    def __init__(self):
        pass

    def process_request(self, request):

        #avoid problems when reaching the server directly trough IP
        host = request.META.get('HTTP_HOST', None)
        if host is None: return

        host = host.split(':')[0] #remove port number

        if host is mobile:
            urlconf = "mobile.urls"
        else:
            urlconf = "default.urls"

        request.urlconf = urlconf

    def process_response(self, request, response):
        patch_vary_headers(response, ('Host',))
        return response

また、なぜあなたがしなければならないのかをチェックしてください ドキュメント上のpatch_vary_headers.

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top