2

最近出くわした問題で、解決したとしても、正しい/単純な/採用された解決策について、あなたの意見を聞きたいです。

Django + python を使用して Web サイトを開発しています。「python manage.py runserver」を使用してローカルマシンで実行すると、ローカルアドレスはデフォルトでhttp://127.0.0.1:8000/になります。

ただし、実稼働サーバーでは、私のアプリには「 http://server.name/myproj/」のようなパスを持つ他の URL があります。

永続的な URL を生成して使用する必要があります。{% url view params %} を使用している場合、urls.py にこれが含まれているため、 / に対する相対パスを取得しています。

urlpatterns = patterns('',
 (r'^(\d+)?$', 'myproj.myapp.views.index'),
 (r'^img/(.*)$', 'django.views.static.serve', {'document_root': settings.MEDIA_ROOT + '/img' }),
 (r'^css/(.*)$', 'django.views.static.serve', {'document_root': settings.MEDIA_ROOT + '/css' }),
)

これまでのところ、2 つの解決策があります。

  1. urls.py を変更し、本番環境で実行する場合は「/myproj/」を含めます
  2. request.build_absolute_uri()views.py でリンクを作成するために使用するか、テンプレートで 'hostname:port/path' を含む変数を渡します

この問題に対処するためのより良い方法はありますか? ありがとうございました。

更新:まあ、問題は django ではなく、wsgi を構成する webfaction の方法にあるようです。URL「hostname.com/myapp」を持つアプリケーションの Apache 構成には、次の行が含まれています。

WSGIScriptAlias / /home/dreamiurg/webapps/pinfont/myproject.wsgi

したがって、SCRIPT_NAME は空です。私が見る唯一の解決策は、mod_python にアクセスするか、ルートからアプリケーションを提供することです。何か案は?

4

2 に答える 2

3

特別なことをする必要はありません。SCRIPT_NAMEDjangoは、ルート以外からDjangoサイトにサービスを提供するときにmod_wsgiによって設定された環境変数を尊重し、それをURL反転コードの前に自動的に追加します。

mod_pythonを使用している場合(使用すべきではありません)、django.rootApache構成で設定する必要がある場合があります。

更新これは、WebfactionがApacheのプロキシインスタンスを介してDjangoサイトにサービスを提供する方法によるものと思われます。このインスタンスは、Webfactionのコントロールパネルによって決定された実際のマウントポイントを認識していません。

この場合、おそらくスクリプトSCRIPT_NAMEで手動で設定する必要があります.wsgi。私はこれがうまくいくと思います:

_application = django.core.handlers.wsgi.WSGIHandler()

def application(environ, start_response):
    os.environ['SCRIPT_NAME'] = '/myproj/'
    return _application(environ, start_response)
于 2010-04-28T12:43:49.513 に答える
2

変化する:

WSGIScriptAlias / /home/dreamiurg/webapps/pinfont/myproject.wsgi

に:

WSGIScriptAlias /myproj /home/dreamiurg/webapps/pinfont/myproject.wsgi

次に、WebFaction の nginx フロント エンド構成を、バック エンドで「/」ではなく「/myproj」にプロキシするように変更します。

必要なのはそれだけです。urls.py で「/myproj」プレフィックスを使用しないでください。

言い換えれば、バックエンドのマウントポイントがフロントエンドにマウントされているように見える場所と同じであることを確認してください。

WSGI スクリプト ファイルを変更して SCRIPT_NAME を偽装することは、動作する可能性がありますが、Apache/mod_wsgi が適切な処理を実行できないため、一般的には推奨されません。

于 2010-04-29T01:11:05.013 に答える