開発サーバーのサブディレクトリ エイリアスで簡単なテスト プロジェクトを実行したいと考えています。基本的なセットアップは、サブディレクトリ内のすべてを wsgi アプリケーションに渡す場所を持つ nginx です。
Django は、URL の生成と解析を完全に破壊するサブディレクトリ エイリアスで実行されることを明らかに理解していません。
ドキュメントにプレフィックスのような設定が見つかりませんでした。私のGoogle fuもそれほど役に立ちませんでした...代わりにここで質問しています。
私が見つけた唯一のことは、少なくとも URL 生成を修正する設定 FORCE_SCRIPT_NAME でした。(参照: http://docs.webfaction.com/software/django/config.html#mounting-a-django-application-on-a-subpath )
悲しいことに、言及されたサイトが示唆しているにもかかわらず、これは urlconf の解析を修正しませんそれ。
サブディレクトリエイリアスでdjangoアプリケーションを実行することは可能ですか?
nginx 構成:
server {
location /fancyprojectname/static {
alias /srv/fancyprojectname/static;
}
location /fancyprojectname/ {
uwsgi_pass unix://var/run/uwsgi/app/fancyprojectname/socket;
include uwsgi_params;
}
}
編集
そこで、「uwsgi_param SCRIPT_NAME /fancyprojectname;」を設定します。nginx の場所で FORCE_SCRIPT_NAME が不要になります - 残念ながら URL マッチングはまだ機能しません。
from django.conf.urls import patterns, include, url
# Uncomment the next two lines to enable the admin:
from django.contrib import admin
admin.autodiscover()
urlpatterns = patterns('',
# Uncomment the admin/doc line below to enable admin documentation:
# url(r'^admin/doc/', include('django.contrib.admindocs.urls')),
# Uncomment the next line to enable the admin:
url(r'^admin/', include(admin.site.urls)),
)
何が起こっていると思いますか: 管理者の正規表現は "^admin" で始まり、実際の URL は "fancyprojectname/admin/" であるため、SCRIPT_NAME が設定されていても、Django は URL を正しく一致させることができません。
ソリューション
したがって、実際には SCRIPT_NAME の問題でした。
WSGI 仕様には次のように書かれています。
SCRIPT_NAME アプリケーション オブジェクトに対応するリクエスト URL の「パス」の最初の部分。これにより、アプリケーションはその仮想の「場所」を知ることができます。アプリケーションがサーバーの「ルート」に対応する場合、これは空の文字列である可能性があります。
PATH_INFO リクエスト URL の「パス」の残りの部分で、アプリケーション内のリクエストのターゲットの仮想「場所」を指定します。リクエスト URL がアプリケーション ルートを対象とし、末尾にスラッシュがない場合、これは空の文字列になることがあります。
Nginx は SCRIPT_NAME を自動的に設定しないため、いずれにしてもこれを設定する必要があります。その後、PATH_INFO が間違っています。デフォルトのセットアップでは、Nginx がこれを $document_uri に設定するため、これが完全な URL になります。
"uwsgi_modifier1 30;" Nginx に UWSGI_MODIFIER_MANAGE_PATH_INFO を設定するように指示し、次に UWSGI に PATH_INFO の SCRIPT_NAME を削除するよう指示します。
Django は URL を正しく生成して一致させることができるようになったため、これらの設定の組み合わせは機能しているようです。