我有一个Django的web应用程序安装与ubuntu 9.10 mod_wsgi和apache2
即时通讯使用下面的代码来通过一个HTTPpost用户身份validation我的网站的另一部分。 所有它需要的是一个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命令和其他应用程序validation正常。 但是,当我加载到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()
我已经把〜/ public_html / radiobusi.com /上的所有权限都设置为777,并将login信息转到apache和虚拟主机上进行debugging。 任何人有任何其他的想法,这可能是什么?
干杯
标记。
更新:
以下是来自虚拟主机的日志,包括错误日志和访问日志
[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请求。
这是来自/var/log/apache2/error.log的主要apache日志文件。 包括closures自己的信息作为时间追踪的方式。
[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我相信我正在打印响应。 至less即时通讯试图。 与线
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设置。 其评论说。
好吧pipe理得到一个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下的东西是postvariables。 希望这可以帮助。 这显然是与我的设置有关。 它只是奇怪的是,当我在djangotesting服务器运行相同的代码它的作品,而只要我把它放在apache的networking服务器上它呢?
再次感谢你的帮助!
干杯
标记
好的,所以我们再次回到用户错误。 在某些时候,问题改变了,因为我改变了上面的一些代码,所以
def post_authentication_api(request):
成为
def post_authentication_api(self, request):
这不工作,因为格雷厄姆在django邮件列表中说
“如果你有一个”自己“的第一个参数,而不是一个类的方法的function,很显然你会得到:”
Exception Type: TypeError at /auth/post_authentication_api Exception Value: post_authentication_api() takes exactly 2 arguments (1 given)
所以,当我解决了这个问题之后,我发现问题的根源(据我所知),那是wsgi阻塞了sys.stdout。 我认为这对我来说是公平的,我的代码中有一些打印语句,这就是为什么它没有运行。 一个非常简单的问题,由于某种原因变得非常复杂。
无论如何,非常感谢上周帮助我的Graham。 他一直孜孜不倦,对一个对最终结果感到尴尬的人非常宽容。 一些选票将会出现在他的评论和我的很多谢谢。
再次感谢
标记