0

私は似たような質問をたくさん見てきましたが、それでも私は失敗しています。XP、Apache 2.2、Django 1.4、Python 2.7、および mod_wsgi 3.3 を獲得しました。私がやろうとしているのは、バットファイルが実行され、こんにちはとエコーされるページにアクセスしたときだけです。これは、django 内部開発サーバーで実行すると機能します。しかし、Apacheに到達すると失敗し、error.logにメッセージが表示されます

システムは、指定されたデバイスに書き込めません。
システムは、指定されたデバイスに書き込めません。
システムは、指定されたデバイスに書き込めません。
システムは、指定されたデバイスに書き込めません。
システムは、指定されたデバイスに書き込めません。

他の多くの場所でそのエラーを見たことはありません。ほとんどの人は「許可が拒否されました」と表示されるようです。私はまだ許可が間違っていると思います。したがって、実行すると、コンソールに表示されるdjango内部サーバーになります。

モデルを検証しています...

0 個のエラーが見つかりました
Django バージョン 1.4、設定 'testsite.settings' を使用
開発サーバーは http://127.0.0.1:8000/ で実行され
ています CTRL-BREAK でサーバーを終了してください。

C:\Sites\cprm>echo hi
hi
[2012/09/18 14:58:45] "GET / HTTP/1.1" 200 63

それは問題ないようです。/cprm ではなく、/testsite から実行しているという唯一の不満があります。私はただcdすることができました..前に。とにかく、内部サーバーではコンソールに書き込んでいるので、Apacheで同等のことをする必要があると思います。Apache コンソールがどこにあるかわかりません。エラーが生成される場所であるため、Apacheログファイルに権限を追加しようとしました。それが通常のコンソールと同等かどうかはわかりません。

私のApacheファイルは次のようになります(バックティックは無視してください):

<`VirtualHost *>

ServerName http://example.com:80

WSGIScriptAlias /cprm "C:/sites/cprm/wsgi.py"
WSGIScriptAlias /testsite "C:/sites/testsite/wsgi.py"

<Directory "C:/sites">
        AllowOverride None
        Options None
        Order allow,deny
        Allow from all
</Directory>

<Directory "C:/Program Files/Apache Software Foundation/Apache2.2/logs">
        AllowOverride None
        Options None
        Order allow,deny
        Allow from all
</Directory>

<`/VirtualHost>

私のビューは次のようになります。

from django.http import HttpResponse
import datetime, os

def home(request):
    os.system('C:/Sites/testsite/testsite/test.bat')
    now = datetime.datetime.now()
    html = "<html><body>It is now %s.</body></html>" % now
    return HttpResponse(html)

基本的には、私が試した簡単なテストです。


編集

ハイパチャ。返信ありがとうございます。私は今、このトピックについていくつか読んだことがあります。だから私はあなたが示した変更を加えました。私の wsgi.py ファイルは次のようになります。

os、sysのインポート

path = 'C:/Sites/testsite'

パスが sys.path にない場合:
sys.path.append(path)


os.environ.setdefault("DJANGO_SETTINGS_MODULE", "testsite.settings")
sys.stdout = sys.stderr
print 'hi'
from django.core.wsgi import get_wsgi_application
application = get_wsgi_application()

次に、error.log に移動すると、実際に「hi」が表示されます。それでいいです。ただし、echo hello を含む test.bat ファイルは実行されず、同じメッセージが表示されます。そして、許可のアドバイスをありがとう。現在、仮想を使用していません。私はまだその準備ができていません。私が試すことができる他のアイデアはありますか?

4

2 に答える 2

0

確認事項

  1. ファイル C:/Sites/testsite/testsite/test.bat に対するユーザー権限は何ですか?

それらは、Apache プロセスを実行している同じユーザーに対して読み取られますか?

  1. だけでなく、ログインしているすべてのユーザーにpythonをインストールしましたか?

  2. Apache conf ディレクティブを確認しましたか? ユーザー/グループ: httpd を実行するユーザー/グループの名前 (または番号)。通常、ほとんどのシステム サービスと同様に、httpd を実行するための専用のユーザーとグループを作成することをお勧めします。

    ユーザー carlos グループ管理者

その同じユーザーは、ファイル システム上のファイルを読み取る権限を持っていますか?

<Directory "C:/Sites/testsite/testsite/">
    AllowOverride None
    Options None
    Order deny,allow
   Allow from all
</Directory>
于 2012-09-21T01:38:24.957 に答える
0

あなたの問題は、標準出力の処理方法に関連しているようです。WSGI はデフォルトで標準出力を無効にします。そのため、プログラムは開発サーバー (サーバーが起動された端末に出力をリダイレクトする) では正常に動作しますが、Apache では動作しません。

仮想ホストの conf ファイルに (他の WSGI ディレクティブと共に) 配置した構成ディレクティブを使用して、WSGI で stdout を有効にすることができます。

WSGIRestrictStdout Off

ただし、Apache はどの端末にも関連付けられていないことを考慮してください。プログラムの出力を確認したい場合、これを WSGI ファイルに追加して、標準出力を標準エラー ストリームにリダイレクトすることができます。

sys.stdout = sys.stderr

Apache を再起動すると、Apache の error.log ファイルにアプリケーション (または場合によっては子プロセス) の出力が表示されます。

: Apache ログ ファイル ディレクトリを仮想ホスト構成に追加しないでください。これらのファイルに対するアクセス許可を Apache に付与するのではなく、誰でもそれらを見ることができるようにします。これは、取るに足らないセキュリティ リスクを想像できるからです。


アップデート

権限の問題を回避する

WSGI をデーモン モードで使用してみてください。そうすれば、Web アプリケーションをユーザー名で実行できます (内部開発サーバーを使用する場合と同様)。あなたの場合、構成ディレクティブは次のようにする必要があります。

WSGIDaemonProcess site1 user=<USERNAME> group=<GROUP> processes=1 threads=1
WSGIScriptAlias /testsite "C:/sites/testsite/wsgi.py"

<Directory "C:/sites/testsite/">
    WSGIProcessGroup site1
    WSGIApplicationGroup %{GLOBAL}
    Order allow,deny
    Allow from all
</Directory>

<USERNAME>Windows マシンのユーザー名とグループでandを置き換える必要があり<GROUP>ます (ただし、ユーザー名を設定するだけで機能する場合があります)。アプリケーションは開発サーバーによって実行される方法と非常によく似た方法で実行されるため、これは通常、アクセス許可の問題を回避するための優れた方法です。(Apache の動作を開発サーバーの動作にさらに近づけるために、1 つのプロセスと 1 つのスレッドのみを使用していることに注意してください。本番環境ではこれらの値をより高い値に変更する必要があります)。

ここでデーモンモードのドキュメントを確認できます

スクリプトの実行

Python コードから外部プログラムを呼び出すにsubprocessは、通常、呼び出しよりもモジュールが優先されos.systemます。前者では、新しいプロセスの実行方法をより詳細に制御できますが、後者では呼び出しをオペレーティング システムに渡すだけです。

機能をお試しいただけsubprocess.check_outputます。スクリプト/プログラムを実行し、その出力をキャプチャできます。

print subprocess.check_output(['C:\Sites\testsite\testsite\test.bat'], shell=True)

出力を文字列変数にキャプチャできるという追加の利点があります。shell=True(ところで、 bat スクリプトを呼び出すときに、Windowsで param が必要な場合と必要でない場合がありますが、それについてはわかりません)。

于 2012-09-18T23:25:52.457 に答える