Python Django url模板标记添加绝对文件路径

Python Django url模板标记添加绝对文件路径,python,django,apache,passenger,wsgi,Python,Django,Apache,Passenger,Wsgi,我的{%url%}django模板标记在生产中向网址添加文件路径时遇到问题。这不会在我的本地开发机器上复制 使用URL.py设置,以便: url("^about_us/$", views.about_us, name="about_us"), 在制作中,我得到了链接 www.mysite.com/home/username/myapp/about_us 而不是 www.mysite.com/about_ 我已经研究过类似的问题,但它对我的具体应用没有帮助: 我的django项目使用apach

我的{%url%}django模板标记在生产中向网址添加文件路径时遇到问题。这不会在我的本地开发机器上复制

使用URL.py设置,以便:

url("^about_us/$", views.about_us, name="about_us"),
在制作中,我得到了链接 www.mysite.com/home/username/myapp/about_us 而不是 www.mysite.com/about_

我已经研究过类似的问题,但它对我的具体应用没有帮助:

我的django项目使用apache、wsgi和passenger托管在A2(共享)主机上。My.htaccess文件如下所示:

# DO NOT REMOVE. CLOUDLINUX PASSENGER CONFIGURATION BEGIN 
PassengerAppRoot "/home/user/myapp"
PassengerBaseURI "/"
PassengerPython "/home/user/virtualenv/myapp/2.7/bin/python2.7"
# DO NOT REMOVE. CLOUDLINUX PASSENGER CONFIGURATION END
import myapp.wsgi
SCRIPT_NAME = '/home/user/myapp'

class PassengerPathInfoFix(object):
    """
    Sets PATH_INFO from REQUEST_URI because Passenger doesn't provide it.
    """
    def __init__(self, app):
        self.app = app

    def __call__(self, environ, start_response):
        from urlparse import unquote
        environ['SCRIPT_NAME'] = SCRIPT_NAME

        request_uri = unquote(environ['REQUEST_URI'])
        script_name = unquote(environ.get('SCRIPT_NAME', ''))
        offset = request_uri.startswith(script_name) and len(environ['SCRIPT_NAME']) or 0
        environ['PATH_INFO'] = request_uri[offset:].split('?', 1)[0]
        return self.app(environ, start_response)

application = myapp.wsgi.application
application = PassengerPathInfoFix(application)
import myapp.wsgi
#SCRIPT_NAME = '/home/user/myapp'
SCRIPT_NAME = ''

class PassengerPathInfoFix(object):
    """
    Sets PATH_INFO from REQUEST_URI because Passenger doesn't provide it.
    """
    def __init__(self, app):
        self.app = app

    def __call__(self, environ, start_response):
        from urllib import unquote
        environ['SCRIPT_NAME'] = SCRIPT_NAME

        request_uri = unquote(environ['REQUEST_URI'])
        script_name = unquote(environ.get('SCRIPT_NAME', ''))
        offset = request_uri.startswith(script_name) and len(environ['SCRIPT_NAME']) or 0
        environ['PATH_INFO'] = request_uri[offset:].split('?', 1)[0]
        return self.app(environ, start_response)

application = myapp.wsgi.application
application = PassengerPathInfoFix(application)
我的passenger_wsgi.py文件如下所示:

# DO NOT REMOVE. CLOUDLINUX PASSENGER CONFIGURATION BEGIN 
PassengerAppRoot "/home/user/myapp"
PassengerBaseURI "/"
PassengerPython "/home/user/virtualenv/myapp/2.7/bin/python2.7"
# DO NOT REMOVE. CLOUDLINUX PASSENGER CONFIGURATION END
import myapp.wsgi
SCRIPT_NAME = '/home/user/myapp'

class PassengerPathInfoFix(object):
    """
    Sets PATH_INFO from REQUEST_URI because Passenger doesn't provide it.
    """
    def __init__(self, app):
        self.app = app

    def __call__(self, environ, start_response):
        from urlparse import unquote
        environ['SCRIPT_NAME'] = SCRIPT_NAME

        request_uri = unquote(environ['REQUEST_URI'])
        script_name = unquote(environ.get('SCRIPT_NAME', ''))
        offset = request_uri.startswith(script_name) and len(environ['SCRIPT_NAME']) or 0
        environ['PATH_INFO'] = request_uri[offset:].split('?', 1)[0]
        return self.app(environ, start_response)

application = myapp.wsgi.application
application = PassengerPathInfoFix(application)
import myapp.wsgi
#SCRIPT_NAME = '/home/user/myapp'
SCRIPT_NAME = ''

class PassengerPathInfoFix(object):
    """
    Sets PATH_INFO from REQUEST_URI because Passenger doesn't provide it.
    """
    def __init__(self, app):
        self.app = app

    def __call__(self, environ, start_response):
        from urllib import unquote
        environ['SCRIPT_NAME'] = SCRIPT_NAME

        request_uri = unquote(environ['REQUEST_URI'])
        script_name = unquote(environ.get('SCRIPT_NAME', ''))
        offset = request_uri.startswith(script_name) and len(environ['SCRIPT_NAME']) or 0
        environ['PATH_INFO'] = request_uri[offset:].split('?', 1)[0]
        return self.app(environ, start_response)

application = myapp.wsgi.application
application = PassengerPathInfoFix(application)
我觉得其中一个文件有问题。如何从我的链接中删除/home/user/myapp

更新:我以为我解决了这个问题。当我将passenger_wsgi.py中的SCRIPT_NAME变量更改为

SCRIPT_NAME = '.'
当我转到主页时,这最初解决了这个问题。然而,一个新的问题导致,如果您访问www.mysite.com/about_us,{%url%}标记将导致

www.mysite.com/about_-us/about_-us

也许这将为解决方案提供一些方向

更新#2:我确实发现了这个:

从该网站,将passenger_wsgi.py文件更改为

import os
import sys
# set variables
sys.path.append(os.getcwd())
os.environ['DJANGO_SETTINGS_MODULE'] = 'project_name.settings'
#setup django application
import django.core.handlers.wsgi
from django.core.wsgi import get_wsgi_application
application = get_wsgi_application()
修复了该问题,但仍然存在它描述的POST问题。然后,我做出了网站建议的更改:

import os
import sys
# Set up paths and environment variables
sys.path.append(os.getcwd())
os.environ['DJANGO_SETTINGS_MODULE'] = 'project_name.settings'
import django.core.handlers.wsgi
from django.core.wsgi import get_wsgi_application
SCRIPT_NAME = os.getcwd()
class PassengerPathInfoFix(object):
    def __init__(self, app):
        self.app = app
    def __call__(self, environ, start_response):
        from urllib import unquote
        environ['SCRIPT_NAME'] = SCRIPT_NAME
        request_uri = unquote(environ['REQUEST_URI'])
        script_name = unquote(environ.get('SCRIPT_NAME', ''))
        offset = request_uri.startswith(script_name) and len(environ['SCRIPT_NAME']) or 0
        environ['PATH_INFO'] = request_uri[offset:].split('?', 1)[0]
        return self.app(environ, start_response)
application = get_wsgi_application()
application = PassengerPathInfoFix(application)

这又回到了我原来的问题。

我现在有一个似乎可行的答案。解决方案基本上是上面发布的原始passenger_wsgi.py文件,但将SCRIPT_NAME设置为空字符串。我的passenger_wsgi.py文件如下所示:

# DO NOT REMOVE. CLOUDLINUX PASSENGER CONFIGURATION BEGIN 
PassengerAppRoot "/home/user/myapp"
PassengerBaseURI "/"
PassengerPython "/home/user/virtualenv/myapp/2.7/bin/python2.7"
# DO NOT REMOVE. CLOUDLINUX PASSENGER CONFIGURATION END
import myapp.wsgi
SCRIPT_NAME = '/home/user/myapp'

class PassengerPathInfoFix(object):
    """
    Sets PATH_INFO from REQUEST_URI because Passenger doesn't provide it.
    """
    def __init__(self, app):
        self.app = app

    def __call__(self, environ, start_response):
        from urlparse import unquote
        environ['SCRIPT_NAME'] = SCRIPT_NAME

        request_uri = unquote(environ['REQUEST_URI'])
        script_name = unquote(environ.get('SCRIPT_NAME', ''))
        offset = request_uri.startswith(script_name) and len(environ['SCRIPT_NAME']) or 0
        environ['PATH_INFO'] = request_uri[offset:].split('?', 1)[0]
        return self.app(environ, start_response)

application = myapp.wsgi.application
application = PassengerPathInfoFix(application)
import myapp.wsgi
#SCRIPT_NAME = '/home/user/myapp'
SCRIPT_NAME = ''

class PassengerPathInfoFix(object):
    """
    Sets PATH_INFO from REQUEST_URI because Passenger doesn't provide it.
    """
    def __init__(self, app):
        self.app = app

    def __call__(self, environ, start_response):
        from urllib import unquote
        environ['SCRIPT_NAME'] = SCRIPT_NAME

        request_uri = unquote(environ['REQUEST_URI'])
        script_name = unquote(environ.get('SCRIPT_NAME', ''))
        offset = request_uri.startswith(script_name) and len(environ['SCRIPT_NAME']) or 0
        environ['PATH_INFO'] = request_uri[offset:].split('?', 1)[0]
        return self.app(environ, start_response)

application = myapp.wsgi.application
application = PassengerPathInfoFix(application)
这解决了我的路径问题,我可以使用POST。我不知道在应用程序的根路径上设置SCRIPT_NAME=''是否有任何警告,但是如果有人知道这样做的任何问题,请与我们分享