16

開発サーバーのサブディレクトリ エイリアスで簡単なテスト プロジェクトを実行したいと考えています。基本的なセットアップは、サブディレクトリ内のすべてを 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 を正しく生成して一致させることができるようになったため、これらの設定の組み合わせは機能しているようです。

4

3 に答える 3

8

これは誤りです:

Django は、URL の生成と解析を完全に破壊するサブディレクトリ エイリアスで実行されることを明らかに理解していません。

Djangoそれを理解し、透過的に処理します。サーバーはSCRIPT_NAMEそれ自体を設定する必要があります。使用しているという事実FORCE_SCRIPT_NAMEは、問題が Django ではなく、Nginx の構成にあることを示しています。

location問題は、より適切なディレクティブではなく、の使用であると思われます。残念ながら、私は Nginx/uwsgi の専門家ではありません。Apache/mod_wsgi では、次のようにします。

WSGIScriptAlias /mysite /usr/local/django/mysite/apache/django.wsgi

mysiteサイトがルートではなく で始まることを mod_wsgi に伝えます。nginx/uwsgi にはほぼ確実に同様のコマンドがあります。

于 2012-07-02T11:18:10.643 に答える
6

http://www.example.com/(ベース ドメイン)で Django サイトをホストしているときに、この Nginx ロケーション ブロックが機能する場合:

location / {
    uwsgi_pass unix:/tmp/fancyprojectname.socket;
    include /etc/nginx/uwsgi_params;
}

次に、これはhttp://www.example.com/subpath/(ベースドメインのサブパス)で機能します:

location /subpath {
    uwsgi_pass unix:/tmp/fancyprojectname.socket;
    uwsgi_param SCRIPT_NAME /subpath; # explicitly set SCRIPT_NAME to match subpath
    uwsgi_modifier1 30; # strips SCRIPT_NAME from PATH_INFO (the url passed to Django)
    include /etc/nginx/uwsgi_params;
}

...そして、Django 設定で FORCE_SCRIPT_NAME を設定する必要はありません。

参考文献:

于 2016-04-12T11:59:32.240 に答える