Django部署,所有链接都以index.wsgi为前缀

时间:2014-02-02 01:05:33

标签: python django apache mod-wsgi

我想在Apache和mod_wsgi的Ubuntu服务器中部署我的django应用程序。我正在学习本教程 http://thecodeship.com/deployment/deploy-django-apache-virtualenv-and-mod_wsgi/

在我的网站文件中

<VirtualHost *:80>
    ServerAdmin webmaster@mydomain.com
    ServerName mydomain.com
    ServerAlias www.mydomain.com
    WSGIScriptAlias / var/www/index.wsgi

    Alias /static/ /var/www/static/
    <Location "/static/">
        Options -Indexes
    </Location >
</VirtualHost >

不介意通用的mydomain.com条目。该网站仅供进度显示,因此我可以与我的朋友讨论。

我有这个

import os
import sys
import site

# Add the site-packages of the chosen virtualenv to work with
site.addsitedir('/home/voger/venvs/ssite/local/lib/python2.7/site-packages')



# Add the app's directory to the PYTHONPATH
sys.path.append('/home/voger/projects/ssite')
sys.path.append('/home/voger/projects/ssite/ssite')

os.environ['DJANGO_SETTINGS_MODULE'] = 'ssite.settings'

# Activate your virtual env
activate_env=os.path.expanduser("/home/voger/venvs/ssite/bin/activate_this.py")
execfile(activate_env, dict(__file__=activate_env))

import django.core.handlers.wsgi
application = django.core.handlers.wsgi.WSGIHandler()

在我的settings.py中我有两行用于在登录和注销后重定向。这些不是在index.wsgi

之前添加的
LOGIN_REDIRECT_URL = '/login_redirect'
ACCOUNT_LOGOUT_REDIRECT_URL = "/logout_redirect"

当请求这些网址时,它会返回404

Reverse for 'login_redirect' with arguments '()' and keyword arguments '{}' not found. 0 pattern(s) tried: []

在我的HTML中,我有4个链接

<a id="logout" style="display: inline-block;" href="/index.wsgi/accounts/logout/">Logout</a>
<a id="profile" style="display: inline-block;" href="/accounts/profile">My Account</a>
<a id="signup" style="display: none;" href="/index.wsgi/accounts/signup/">Sign Up</a>
<a id="login" style="display: none;" href="/index.wsgi/accounts/login/">Sign In</a>

正如您所看到的那样,使用{%url%}插入的3个条目会自动添加到/index.wsgi中,而唯一一个硬编码的条目不会被添加到前面。但他们仍然按预期工作。

为什么我要预先添加/index.wsgi,如何将其删除?在我的开发机器上使用django的内置服务器一切正常。

我不知道它是否相关,但登录,注销和注册网址是由django-allauth提供的。

感谢您的任何回答或评论

1 个答案:

答案 0 :(得分:1)

首先:

WSGIScriptAlias / var/www/index.wsgi

错了。您缺少WSGI脚本路径上的前导斜杠。

你也不应该像在可能的情况下那样坚持在DocumentRoot目录中使用index.wsgi。如果由于某种原因没有使用带有WSGIScriptAlias的VirualHost,并且已经在Apache配置中的其他地方设置了wsgi-script的.wsgi处理程序,则意味着/index.wsgi的URL可以用你所有的访问你的Django问题然后从那里开始。这是因为Django会认为它的前缀是带有/index.wsgi的URL,因为它最终成为应用程序的挂载点。

因此,将WSGI脚本文件移出服务器的DocumentRoot目录。删除.wsgi扩展名的任何AddHandler指令。确保您实际使用的是VirtualHost,特别是WSGIScriptAlias指令的使用是正确的。

顺便说一句,你为什么要使用一些任意人的博客文章而不是Django docs网站上的官方mod_wsgi安装说明。