2017-07-08 18 views
4

私はDjangoプロジェクトをサーバーのサブディレクトリ(dns_name_of_my_page/notes)に配置しました。このプロジェクトの私のアプリは、dns_name_of_my_page/notes/app /からアクセスできます。残念ながら、Djangoプロジェクト全体が、ホスティングサーバーのpublic_htmlのサブディレクトリ 'notes'にある場合、管理サイトは動作しません。管理サイト(dns_name_of_my_page/notes/admin /)に入力すると、サブディレクトリ(dns_name_of_my_page/adminlogin /?next = // admin /)の名前がないURLにリダイレクトされますが、これは受け入れられません。ここでサブディレクトリのDjango - adminサイトが動作していません

urlpatterns = [ 
    url(r'^/?app/?', include('app.urls')), 
    url(r'^/?$', views.index, name='index'), 
    url(r'^/?admin/?', admin.site.urls), 
] 

は私のアプリ内のURLの私の設定です:

?それはここで

は、プロジェクト内のURLの私の設定です/ dns_name_of_my_page /ノート/のにadminlogin /むしろ次= /ノート/管理する必要があります

urlpatterns = [ 
    url(r'^$', views.index, name='index'), 
    url(r'^(?P<num>[0-9]+)/?', views.num, name='num'), 
] 
私が設定しようとしてい

FORCE_SCRIPT_NAME = '/notes/' 

または

SUB_SITE = "/notes/" 

settings.pyでも、それは私を助けませんでした。

Djangoアプリをサブディレクトリで実行する場合、この種の問題がありましたか?

+0

プロジェクトのログ記録を初期化しましたか?管理ページにアクセスするときに、どのようなエラーが表示されますか?静的ファイルは機能していますか? – hansTheFranz

+1

あなたの 'url(r '^ /?admin /?'、admin.site.urls)は' url(r '^ admin /'、admin.site.urls)で、 '? .. –

+0

合意。Djangoはあなたのために後続のスラッシュを処理できます。 https://docs.djangoproject.com/en/1.10/ref/settings/#append-slash –

答えて

1

私は今日このことに気付きましたが、同様の質問[1]が多数ありますが、答えは私の経験からのアマルガムです。

あなたの質問から欠けている1つの詳細は、あなたが後に取り組んでいるサーバー設定です。私の解説を説明するために、Djangoの側面とどのように連携するかを理解するのに役立ちます。

Djangoの管理者(およびAuthなどの他のほとんどのアプリケーション)にアクセスする際にこの問題が含まれている私が解決している問題は、複数の独立したdjangoプロジェクトのホストとして動作するサーバーを持つことです。目的は、http://my.server.com/project_name/foo/bar/ [2]で始まるURIを持つことです。それぞれのプロジェクトに関しては、my.server.comで動作し、/ foo/barだけを処理しています(ほとんどのプロダクション/シングルアプリケーションシステムの場合と同様、manage.py runserverを使用したローカル開発)

私は、自分のドメインのポート80と443でリスンプロキシとしてリッスンリスニングを使用しています。そのサーバー内では、サブプロジェクトごとにNginxサービス+ Gunicornにプロキシするためにlocationの設定があります。

nginxのデフォルトの場所の設定は次のようになります。各プロジェクトの自身のnginxの+ gunicornサービスは、このトピックに特に関連はありませんが、あなたが見ることができるように、それは独自のローカル上の提示のために

location /project_name { 
    proxy_set_header X-Forwarded-Protocol $scheme; 
    proxy_set_header X-Real-IP $remote_addr; 
    proxy_set_header Host $http_host; 
    proxy_set_header X-Scheme $scheme; 
    proxy_set_header X-Forwarded-For $remote_addr; 

    proxy_pass http://localhost:7001/; 
} 

セットアップサービスポート。

この設定はhttp://my.server.com/foo/bar/の有効な要求を供給します。これはDjangoが出力で生成するすべてのURLに/ project_name /プレフィックスを追加するように説得しています。、あなたがカバーしている必要がある重要な設定の一握りがあり、これらがあることを行うには

USE_X_FORWARDED_HOST = True 
FORCE_SCRIPT_NAME = '/project_name/' 

これは、Djangoがヘッダを尊重する原因は、nginxのに沿って通過していることを変更し、また、トリガそれは自分ですテンプレートの{% url name %}タグの出力を書き換えるプロセス。

SESSION_COOKIE_PATH = '/project_name/' 

これは、そのドメインに複数のログインを分離助け、あなたは一つのプロジェクトにログインできることを意味ではなく、別の上(またはそれを混乱さ)すべきです。

STATIC_FILES_ROOT='\path\on\disk\as\in\your\nginx\config\for\static\' 
STATIC_FILES_URL='/project_name/static/' 
MEDIA_FILES_ROOT='\path\on\disk\as\in\your\nginx\config\for\media\' 
MEDIA_FILES_URL='/project_name/media/' 

これらは、{%static blah%}タイプのテンプレートタグとファイルサービスを処理します。

LOGIN_REDIRECT_URL='/project_name/' 
LOGOUT_REDIRECT_URL='/project_name/' 

これらのサービスのうち、/ログイン、およびそれが戻ってログインまたはログアウトのプロジェクトサイトのルートにユーザーを送信していることを確認するために認証モジュールを使用した結果を処理します。あなたは、私たちがあなたのサイトのurls.pyでこのラインを持つ管理ページ

ADMIN_URL=r'^admin/' 

この設定のペアについては、以下をやるようなURL-confのスタイルの正規表現文字列を使用して含めて、簡単に自分のニーズにこれらを調整することができます

url(settings.ADMIN_URL, include(admin.site.urls)), # default=r'^admin/' 

ここで重要な点は正規表現の前に/は存在しないことです。それ以外の場合はホスト名に強制的に戻そうとするため、FORCE_SCRIPT_NAMEで指定された変更が有効になります。

また、/で始まるテンプレートには、Djangoテンプレート出力の変更によってキャッチされないような、ハードコードされたURL(相対的またはその他)がないように注意してください。

これらのプロジェクトのそれぞれを3つの異なるシステムに配備できました。そのうちの2つは、そのドメインまたはサービスポート上で唯一のdjangoアプリケーションとして実行され、残りの1つはこの共有ドメイン設定です各場所の設定値の変更以外は何も要求しません。独自のコードサンプルで、このアプローチを取る


、私はあなたへの変更を探していることをお勧めしたい:検索と一致するため補佐官へ

urlpatterns = [ 
    url(r'^admin/?', admin.site.urls), 
    url(r'^app/?', include('app.urls')), 
    url(r'^$', views.index, name='index'), 
] 

、私が来て管理者を再配置しました最初に空の/ home/rootマッチテンプレートが最後に来るようにします。さもなければあなたのFORCE_SCRIPT_NAMEの設定は正しい軌道にあります。


[1] multiple instances of django on a single domain; Is it possible to host multiple django projects under the same domain?; how to deploy django under a suburl behind nginx

[2]サービスはhttpsで提供されるため、実際にはSSL変換も処理されますが、内部でlocalhostポート(マシンファイアウォールの内側に隠れています)はhttpのみを処理します。

関連する問題