90%のデータとコードを共有する2つのDjangoサイトを作成する
質問
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.