У меня есть настройка веб-приложения Django с mod_wsgi и apache2 на ubuntu 9.10
Я использую следующий код для аутентификации пользователя через HTTP-сообщение для другой части моего сайта. Все, что для этого требовалось, - это HTTP 200.
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 munderwo@iinet.net.au
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 уже установил все разрешения на 777 на ~ / public_html / radiobusi.com / и включил loggin для отладки на apache и виртуальном хосте. У кого-нибудь есть другие идеи, что это может быть?
Ура
Отметка.
Обновить:
Ниже приведен журнал виртуальных хостов, журнал ошибок и журнал доступа.
[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.
это из основного файла журнала apache по адресу /var/log/apache2/error.log. Я включил сообщение о его закрытии, чтобы отследить его время.
[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 - это переменные сообщения. надеюсь это поможет. Очевидно, это как-то связано с моей настройкой. Просто странно, что когда я запускаю тот же код на тестовом сервере django, он работает, а как только я помещаю его на веб-сервер apache, он делает это?
В очередной раз благодарим за помощь!
Ура
отметка
Итак, мы снова приходим к ошибке пользователя. В какой-то момент проблема изменилась, потому что я изменил часть кода выше, так что
def post_authentication_api(request):
стал
def post_authentication_api(self, request):
это не работает, потому что, как сказал Грэм в списке рассылки django
«Если у вас ... есть первый аргумент self для функции, которая не является методом класса, очевидно, что вы получите:»
Exception Type: TypeError at /auth/post_authentication_api
Exception Value: post_authentication_api() takes exactly 2 arguments
(1 given)
Итак, после того, как я исправил это, я пришел к корню проблемы (насколько я могу судить), заключающейся в том, что wsgi блокировал sys.stdout. что, на мой взгляд, кажется мне справедливым, и в моем коде были некоторые операторы печати, и поэтому он не работал. Очень простая задача, которая по какой-то причине стала очень сложной.
В любом случае, большое спасибо Грэму, который помогал мне в этом на прошлой неделе. Он был неутомим и очень любезен с теми, кто весьма смущен окончательным результатом. Он получит несколько голосов за комментарии и мою большую благодарность.
еще раз спасибо
отметка