4

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

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

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

メインサイトより:

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

携帯サイトから:

  • ユーザーがアイテムのリストを表示し、メイン サイトで入力したアイテムを確認する
  • ユーザーは、最近追加されたアイテムに 5 つ星の評価を付けます

メインサイトより:

  • ユーザーが高評価アイテムのリストを表示すると、最近追加されたアイテム (現在は高評価) がリストに表示されます。
4

3 に答える 3

4

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

アップデート:

したがって、メイン サイトhttp://www.mainsite.com/があり、メイン サイトの機能を実現する独自の urls.py models.py と views.py があるとします。次に、独自の URL とビューのセットを持つhttp://www.m.mainsite.com/があります。次に、メイン サイトのモデルをインポートして、モバイル サイトのビューで使用できます。

于 2011-01-06T20:33:46.353 に答える
1

OK、どちらの答えも素晴らしく、最終的な解決策として選択したものに貢献しました.

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)

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

次に、次の行だけが異なる 2 つのバージョンの wsgi ファイルを作成しました。

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

また

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

各仮想ホストの唯一の違いは、ホストごとに異なる wsgi ファイルを指す WSGIScriptAlias 行です。

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

これに対する良い解決策を見つけてくれてありがとう。

于 2011-01-09T02:37:06.813 に答える
0

私はかつて非常に似たようなことをしました。複数の 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

docs で patch_vary_headersを実行する必要がある理由も確認してください。

于 2011-01-06T22:17:14.393 に答える