我有一个django应用程序,可以在django开发服务器下完美运行。我正在尝试使用mod_wsgi在apache2.2中部署它,我有错误
在httpd.conf文件中,我使用以下方式“安装”我的应用程序在root / myapp下:
WSGIScriptAlias /myapp /home/path_to_my_app/apache_conf/django.wsgi
我按照标准指示准备django.wsgi。现在,我可以访问我的应用程序的主页面模板,但它似乎有重定向错误。 “/ myapp”根未在ULR重定向请求上自动插入。通过urls.py从主页面模板到views.py中的某些模块的请求无法正确传递。
apache错误日志:
127.0.0.1 - - [21/Feb/2011:16:11:44 +0100] "GET /myapp/ HTTP/1.1" 200 1795
127.0.0.1 - - [21/Feb/2011:16:11:46 +0100] "GET /api/dir HTTP/1.1" 404 205
“/ api / dir”不存在,它应该与urls.py中的模式匹配,但id不是
我花了两天多的时间,请有人帮忙吗?
答案 0 :(得分:1)
您的apache配置中似乎缺少一些内容:
在我的服务器的工作配置中,我有:
# tell apache where to find the wsgi script.
WSGIScriptAlias / "/home/path_to_my_app/wsgi/my.settings.wsgi"
# turn on auto-reload in WSGI
WSGIScriptReloading On
WSGIReloadMechanism Process
# assign a process to a process group
WSGIDaemonProcess djangoapps processes=10 threads=1 maximum-requests=500 display-name=my-wsgi
WSGIProcessGroup djangoapps
# tell apache where to find the wsgi script.
WSGIScriptAlias / "/home/path_to_my_app/wsgi/my.settings.wsgi"
# turn on auto-reload in WSGI
WSGIScriptReloading On
WSGIReloadMechanism Process
# assign a process to a process group
WSGIDaemonProcess djangoapps processes=10 threads=1 maximum-requests=500 display-name=my-wsgi
WSGIProcessGroup djangoapps
您的WSGIScriptAlias行是正确的,但您需要告诉wsgi您将如何运行您的应用程序。 您最有可能获得404,因为没有WSGIDaemonProcess行告诉WSGI处理程序如何使用您的流程。
http://code.google.com/p/modwsgi/wiki/ConfigurationDirectives可能是一个有用的参考。
答案 1 :(得分:1)
最后我发现了错误。它没有连接到httpd.conf文件,而是连接到django urls.py文件和模板的URL。
当我以这种方式挂载myapp时:
WSGIScriptAlias /myapp my_path_to_wsgi_module/django.wsgi
我相信django模板文件中指定的URL应该带有一个初始斜杠,如下所示:
'/api/dir'
结果是这样应用程序只能在django开发服务器上运行,而不能在apache上运行。
相反,如果您使用没有初始斜杠的URL,如:
'api/dir'
该应用程序在django开发服务器和apache上都能正常工作!
即使在django urls.py文件的模式匹配上也必须避免使用起始斜杠:
像这样:(r'^api/dir$', 'available_services')
而不是这样:(r'^/api/dir$', 'available_services')
对于专家django用户来说,这可能是显而易见的事情,但如果你像我这样的新手,这可能会让你失去一定的时间,因为这是一个难以被发现的问题。
答案 2 :(得分:0)
实际上它比这更复杂一点。
有些时候您需要绝对的应用内网址,因为您不希望到达相对于当前网址的网址。
e.g。你在主布局模板中有一个全局菜单(即一个模板,它被项目中的每个其他模板“扩展”):你不能拥有像“home”,“contact”,“about”,“blog”这样的相对网址因为如果你在/ yourapp / blog / entries / 2014/02/06 / add(让我们说这样的url存在)并且你点击任何菜单项,你会去(比如说,对于“home”)/ yourapp / blog /条目/ 2014/02/06 / add / home而不是/ home,您可以期待。
虚拟主机的丑陋解决方案在这里很好(在Java中,Struts 2有一个选项来解析“动作”的URL(即命名的url /入口点),包括部署在Web容器中的部署上下文目录(例如tomcat) ))...不知道它有任何你能猜到的“上下文”设置(也许可以将当前的“WSGIScriptAlias”键作为环境变量返回)。之后,使用返回urls的初始斜杠(“/ home”)。