web-dev-qa-db-ja.com

POSTリクエストからDjango WSGIおよびapache経由)へのHTTP500エラー

私はubuntu9.10でmod_wsgiとApache2を使用してDjango Webアプリケーションをセットアップしました

次のコードを使用して、サイトの別の部分のHTTPPOSTを介したユーザー認証を行っています。必要なのはHTTP200だけです。

from Django.contrib.auth import authenticate
from Django.http import HttpResponse


def post_authentication_api(request):
    if request.method == 'POST':
        print request
        user = authenticate(username=request.POST['user'], password=request.POST['pass'])
        if user is not None:
            if user.is_active:
                print "correct"
                return HttpResponse("correct", mimetype="text/plain")
            else:
                print "disabled"
                return HttpResponse("disabled", mimetype="text/plain", status=401)
        else:
            print "incorrect"
            return HttpResponse("incorrect", mimetype="text/plain", status=401)

python manage.py runserverコマンドを使用して実行し、他のアプリケーションが正常に認証されると、これはすべて正常に機能します。しかし、Apacheにロードすると、500の内部エラーが発生します。実際、次のpythonコードを実行すると

import urllib
import urllib2

url = 'http://192.168.0.5/radiobusi/auth/post_authentication_api'
values = {'user' : 'Michael Foord',
          'pass' : 'Northampton',}

data = urllib.urlencode(values)
req = urllib2.Request(url, data)
response = urllib2.urlopen(req)
the_page = response.read()

私は得る

Traceback (most recent call last):
  File "testURL.py", line 10, in <module>
    response = urllib2.urlopen(req)
  File "/usr/lib/python2.6/urllib2.py", line 124, in urlopen
    return _opener.open(url, data, timeout)
  File "/usr/lib/python2.6/urllib2.py", line 395, in open
    response = meth(req, response)
  File "/usr/lib/python2.6/urllib2.py", line 508, in http_response
    'http', request, response, code, msg, hdrs)
  File "/usr/lib/python2.6/urllib2.py", line 433, in error
    return self._call_chain(*args)
  File "/usr/lib/python2.6/urllib2.py", line 367, in _call_chain
    result = func(*args)
  File "/usr/lib/python2.6/urllib2.py", line 516, in http_error_default
    raise HTTPError(req.get_full_url(), code, msg, hdrs, fp)
urllib2.HTTPError: HTTP Error 500: INTERNAL SERVER ERROR

これは私の仮想ホストファイルです

<VirtualHost *:80>
    #Basic setup
    ServerAdmin [email protected]
    ServerName 192.168.0.5 
    ServerAlias 192.168.0.5

    <Directory /home/munderwo/public_html/radiobusi.com/RadioBusiSite/mysite/Apache/>
        Order deny,allow
        Allow from all
    </Directory>

    Alias /radiobusi/media /home/munderwo/public_html/radiobusi.com/RadioBusiSite/mysite/media

    <Location /media>
      Order allow,deny
      Allow from all
    </Location>

    LogLevel debug
    ErrorLog  /home/munderwo/public_html/radiobusi.com/logs/Apache_error.log
    CustomLog /home/munderwo/public_html/radiobusi.com/logs/Apache_access.log combined

    WSGIDaemonProcess radiobusi.com user=www-data group=www-data threads=25
    WSGIProcessGroup radiobusi.com

    WSGIScriptAlias /radiobusi /home/munderwo/public_html/radiobusi.com/RadioBusiSite/mysite/Apache/RadioBusi.wsgi
</VirtualHost>

これは私のwsgiファイルです

import os
import sys

Apache_configuration= os.path.dirname(__file__)
project = os.path.dirname(Apache_configuration)
workspace = os.path.dirname(project)
sys.path.append(workspace) 

sys.path.append('/usr/local/lib/python2.6/dist-packages/Django-1.1.1-py2.6.Egg/Django/')
sys.path.append('/home/munderwo/public_html/radiobusi.com/RadioBusiSite/mysite/')

os.environ['PYTHON_Egg_CACHE'] = '/home/munderwo/public_html/radiobusi.com/Egg_cache'
os.environ['Django_SETTINGS_MODULE'] = 'mysite.settings'
import Django.core.handlers.wsgi
application = Django.core.handlers.wsgi.WSGIHandler()

iveはすでに〜/ public_html/radiobusi.com /ですべての権限を777に設定し、Apacheと仮想ホストでデバッグするためにlogginをオンにしました。誰か他のアイデアがありますか?

乾杯

マーク。

更新:

以下は、仮想ホストからのログであり、エラーログとアクセスログの両方です。

[Mon Jan 18 19:54:27 2010] [info] mod_wsgi (pid=27874): Attach interpreter ''.
[Mon Jan 18 19:54:27 2010] [info] mod_wsgi (pid=27874): Enable deadlock thread in process 'radiobusi.com'.
[Mon Jan 18 19:54:27 2010] [debug] mod_wsgi.c(8668): mod_wsgi (pid=27874): Starting 25 threads in daemon process 'radiobusi.com'.
[Mon Jan 18 19:54:27 2010] [debug] mod_wsgi.c(8674): mod_wsgi (pid=27874): Starting thread 1 in daemon process 'radiobusi.com'.
[Mon Jan 18 19:54:27 2010] [info] mod_wsgi (pid=27874): Enable monitor thread in process 'radiobusi.com'.
[Mon Jan 18 19:54:27 2010] [debug] mod_wsgi.c(8508): mod_wsgi (pid=27874): Deadlock timeout is 300.
[Mon Jan 18 19:54:27 2010] [debug] mod_wsgi.c(8511): mod_wsgi (pid=27874): Inactivity timeout is 0.
[Mon Jan 18 19:54:27 2010] [debug] mod_wsgi.c(8674): mod_wsgi (pid=27874): Starting thread 2 in daemon process 'radiobusi.com'.
[Mon Jan 18 19:54:27 2010] [debug] mod_wsgi.c(8674): mod_wsgi (pid=27874): Starting thread 3 in daemon process 'radiobusi.com'.
[Mon Jan 18 19:54:27 2010] [debug] mod_wsgi.c(8674): mod_wsgi (pid=27874): Starting thread 4 in daemon process 'radiobusi.com'.
[Mon Jan 18 19:54:27 2010] [debug] mod_wsgi.c(8674): mod_wsgi (pid=27874): Starting thread 5 in daemon process 'radiobusi.com'.
[Mon Jan 18 19:54:27 2010] [debug] mod_wsgi.c(8674): mod_wsgi (pid=27874): Starting thread 6 in daemon process 'radiobusi.com'.
[Mon Jan 18 19:54:27 2010] [debug] mod_wsgi.c(8674): mod_wsgi (pid=27874): Starting thread 7 in daemon process 'radiobusi.com'.
[Mon Jan 18 19:54:27 2010] [debug] mod_wsgi.c(8674): mod_wsgi (pid=27874): Starting thread 8 in daemon process 'radiobusi.com'.
[Mon Jan 18 19:54:27 2010] [debug] mod_wsgi.c(8674): mod_wsgi (pid=27874): Starting thread 9 in daemon process 'radiobusi.com'.
[Mon Jan 18 19:54:27 2010] [debug] mod_wsgi.c(8674): mod_wsgi (pid=27874): Starting thread 10 in daemon process 'radiobusi.com'.
[Mon Jan 18 19:54:27 2010] [debug] mod_wsgi.c(8674): mod_wsgi (pid=27874): Starting thread 11 in daemon process 'radiobusi.com'.
[Mon Jan 18 19:54:27 2010] [debug] mod_wsgi.c(8674): mod_wsgi (pid=27874): Starting thread 12 in daemon process 'radiobusi.com'.
[Mon Jan 18 19:54:27 2010] [debug] mod_wsgi.c(8674): mod_wsgi (pid=27874): Starting thread 13 in daemon process 'radiobusi.com'.
[Mon Jan 18 19:54:27 2010] [debug] mod_wsgi.c(8674): mod_wsgi (pid=27874): Starting thread 14 in daemon process 'radiobusi.com'.
[Mon Jan 18 19:54:27 2010] [debug] mod_wsgi.c(8674): mod_wsgi (pid=27874): Starting thread 15 in daemon process 'radiobusi.com'.
[Mon Jan 18 19:54:27 2010] [debug] mod_wsgi.c(8674): mod_wsgi (pid=27874): Starting thread 16 in daemon process 'radiobusi.com'.
[Mon Jan 18 19:54:27 2010] [debug] mod_wsgi.c(8674): mod_wsgi (pid=27874): Starting thread 17 in daemon process 'radiobusi.com'.
[Mon Jan 18 19:54:27 2010] [debug] mod_wsgi.c(8674): mod_wsgi (pid=27874): Starting thread 18 in daemon process 'radiobusi.com'.
[Mon Jan 18 19:54:27 2010] [debug] mod_wsgi.c(8674): mod_wsgi (pid=27874): Starting thread 19 in daemon process 'radiobusi.com'.
[Mon Jan 18 19:54:27 2010] [debug] mod_wsgi.c(8674): mod_wsgi (pid=27874): Starting thread 20 in daemon process 'radiobusi.com'.
[Mon Jan 18 19:54:27 2010] [debug] mod_wsgi.c(8674): mod_wsgi (pid=27874): Starting thread 21 in daemon process 'radiobusi.com'.
[Mon Jan 18 19:54:27 2010] [debug] mod_wsgi.c(8674): mod_wsgi (pid=27874): Starting thread 22 in daemon process 'radiobusi.com'.
[Mon Jan 18 19:54:27 2010] [debug] mod_wsgi.c(8674): mod_wsgi (pid=27874): Starting thread 23 in daemon process 'radiobusi.com'.
[Mon Jan 18 19:54:27 2010] [debug] mod_wsgi.c(8674): mod_wsgi (pid=27874): Starting thread 24 in daemon process 'radiobusi.com'.
[Mon Jan 18 19:54:27 2010] [debug] mod_wsgi.c(8674): mod_wsgi (pid=27874): Starting thread 25 in daemon process 'radiobusi.com'.
[Mon Jan 18 19:54:47 2010] [info] mod_wsgi (pid=27874): Create interpreter '192.168.0.5|/radiobusi'.
[Mon Jan 18 19:54:47 2010] [info] [client 192.168.0.5] mod_wsgi (pid=27874, process='radiobusi.com', application='192.168.0.5|/radiobusi'): Loading WSGI script '/home/munderwo/public_html/radiobusi.com/RadioBusiSite/mysite/Apache/RadioBusi.wsgi'.
munderwo@bertha:~/public_html/radiobusi.com/logs$ cat Apache_access.log 
192.168.0.5 - - [18/Jan/2010:19:54:47 +0800] "POST /radiobusi/auth/post_authentication_api HTTP/1.1" 500 42213 "-" "Icecast 2.3.2"
192.168.0.5 - - [18/Jan/2010:19:55:04 +0800] "POST /radiobusi/auth/post_authentication_api HTTP/1.1" 500 42213 "-" "Icecast 2.3.2"

これらを取得するために、Apacheを停止しました。ログを削除しました。再び彼らに触れました。次に、Apacheを再起動し、POSTリクエストを2回試行しました。

これは、/ var/log/Apache2 /error.logにあるメインのApacheログファイルからのものです。私はそれを追跡する時間の方法としてそれ自身を閉鎖するというメッセージを含めました。

   [Mon Jan 18 19:53:47 2010] [notice] caught SIGTERM, shutting down
    [Mon Jan 18 19:54:27 2010] [notice] mod_python: Creating 8 session mutexes based on 6 max processes and 25 max threads.
    [Mon Jan 18 19:54:27 2010] [notice] mod_python: using mutex_directory /tmp 
    [Mon Jan 18 19:54:27 2010] [warn] mod_wsgi: Compiled for Python/2.6.2.
    [Mon Jan 18 19:54:27 2010] [warn] mod_wsgi: Runtime using Python/2.6.4.
    [Mon Jan 18 19:54:27 2010] [warn] mod_wsgi: Python module path '/usr/lib/python2.6/:/usr/lib/python2.6/plat-linux2:/usr/lib/python2.6/lib-tk:/usr/lib/python2.6/lib-old:/usr/lib/python2.6/lib-dynload'.
    [Mon Jan 18 19:54:27 2010] [debug] mod_wsgi.c(8070): mod_wsgi (pid=27872): Socket for 'radiobusi.com' is '/var/run/Apache2/wsgi.27872.0.1.sock'.
    [Mon Jan 18 19:54:27 2010] [info] mod_wsgi (pid=27874): Starting process 'radiobusi.com' with uid=33, gid=33 and threads=25.
    [Mon Jan 18 19:54:27 2010] [notice] Apache/2.2.12 (Ubuntu) DAV/2 SVN/1.6.5 mod_python/3.3.1 Python/2.6.4 mod_wsgi/2.5 configured -- resuming normal operations
    [Mon Jan 18 19:54:27 2010] [info] Server built: Nov 12 2009 22:50:52
    [Mon Jan 18 19:54:27 2010] [debug] worker.c(1740): AcceptMutex: sysvsem (default: sysvsem)
    [Mon Jan 18 19:54:27 2010] [info] mod_wsgi (pid=27877): Attach interpreter ''.
    [Mon Jan 18 19:54:27 2010] [info] mod_wsgi (pid=27878): Attach interpreter ''.

testURL.pyでも、応答を出力していると思います。まあ少なくとも私はしようとしています。線で

response = urllib2.urlopen(req)
the_page = response.read() 

これを行うためのより良い方法はありますか?

更新:コメントのリクエストに応じてurls.pyを追加しました

from Django.conf.urls.defaults import *
from Django.contrib import admin
from Django.contrib.auth import forms

admin.autodiscover()

urlpatterns = patterns('',
    (r'^admin/(.*)', admin.site.root),
    (r'^polls/', include('mysite.polls.urls')),
    (r'auth/post_authentication_api$', 'mysite.users.views.post_authentication_api'),
    (r'^site_media/(?P<path>.*)$', 'Django.views.static.serve', {'document_root': '/Users/munderwood/Documents/Aptana Studio Workspace/RadioBusiSite/mysite/media/'}),    
)

そして、私が知る限り、Apache2.confにはErrorDocumentが設定されていません。そのコメントアウト。

ok Djangoエラーページをなんとか取得できました。かなり奇妙です。

Environment:

Request Method: POST
Request URL: http://bertha.homeunix.org:3000/radiobusi/auth/post_authentication_api
Django Version: 1.1.1
Python Version: 2.6.4
Installed Applications:
['Django.contrib.auth',
 'Django.contrib.contenttypes',
 'Django.contrib.sessions',
 'Django.contrib.sites',
 'Django.contrib.admin',
 'Django.contrib.flatpages',
 'mysite.polls',
 'mysite.RadioBusi',
 'mysite.Support',
 'mysite.users']
Installed Middleware:
('Django.middleware.common.CommonMiddleware',
 'Django.contrib.sessions.middleware.SessionMiddleware',
 'Django.contrib.auth.middleware.AuthenticationMiddleware',
 'Django.contrib.flatpages.middleware.FlatpageFallbackMiddleware')


Traceback:
File "/usr/local/lib/python2.6/dist-packages/Django-1.1.1-py2.6.Egg/Django/core/handlers/base.py" in get_response
  92.                 response = callback(request, *callback_args, **callback_kwargs)

Exception Type: TypeError at /auth/post_authentication_api
Exception Value: post_authentication_api() takes exactly 2 arguments (1 given)

POST
Variable    Value
user    u'e_username'
pass        u'e_password'

POSTの下にあるのはpost変数です。お役に立てれば。それは明らかに私の設定と関係があります。 Djangoテストサーバーで同じコードを実行すると機能するのに、Apache Webサーバーに配置するとすぐに機能するのは奇妙なことですか?

助けてくれてありがとう!

乾杯

マーク

2
Mark

さて、もう一度ユーザーエラーが発生します。上記のコードの一部を変更したため、ある時点で問題が変化しました。

def post_authentication_api(request): 

なりました

def post_authentication_api(self, request):

grahamが言ったように Djangoメーリングリスト

「クラスのメソッドではない関数に対して「自己」の最初の引数がある場合、次のようになることは明らかです。」

Exception Type: TypeError at /auth/post_authentication_api 
  Exception Value: post_authentication_api() takes exactly 2 arguments 
(1 given)

それで、それを修正した後、wsgiがsys.stdoutをブロックしていたという問題の根本に到達しました(私が知る限り)。これは私には公平に思えます。コードにいくつかのprintステートメントが含まれていたため、実行されませんでした。なんらかの理由で非常に複雑になった非常に単純な問題。

とにかく、これについて先週私を助けてくれたGrahamに感謝します。彼は疲れを知らず、最終的な結果について非常に恥ずかしい人にとても親切でした。コメントと私の多くの感謝のために彼の方法でいくつかの投票が来るでしょう。

再度、感謝します

マーク

1
Mark