URL重定向问题在apache中部署工作的django应用程序(通过mod_wsgi)

时间:2011-02-21 15:29:27

标签: django apache mod-wsgi django-urls

我有一个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不是

我花了两天多的时间,请有人帮忙吗?

3 个答案:

答案 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”)。