【问题标题】:Django url template tags adding absolute filepathDjango url模板标签添加绝对文件路径
【发布时间】:2019-05-26 11:24:33
【问题描述】:

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

使用 urls.py 设置如下:

url("^about_us/$", views.about_us, name="about_us"),

在生产中,我正在获取链接 www.mysite.com/home/username/myapp/about_us 代替 www.mysite.com/about_us

我看过这个类似的问题,但它对我的具体应用没有帮助: Django url tag adds filepath

我的 django 项目托管在使用 apache、wsgi 和乘客的 A2(共享)主机上。我的 .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

我的 Passenger_wsgi.py 文件如下所示:

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)

我觉得其中一个文件有问题。如何从我的链接中删除 /home/user/myapp?

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

SCRIPT_NAME = '.'

这最初解决了我转到主页时的问题。但是,一个新的问题导致如果你去 www.mysite.com/about_us,那么 {% url %} 标签会导致

www.mysite.com/about_us/about_us

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

更新 #2:我确实找到了这个: https://smartlazycoding.com/django-tutorial/deploy-a-django-website-to-a2-hosting

从这个网站,将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)

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

【问题讨论】:

    标签: python django apache passenger wsgi


    【解决方案1】:

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

    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 = '' 是否有任何警告,但如果有人知道这样做的任何问题,请分享。

    【讨论】:

      猜你喜欢
      • 2011-07-25
      • 1970-01-01
      • 1970-01-01
      • 2021-10-18
      • 2014-10-10
      • 2019-03-09
      • 2013-10-09
      • 2014-09-15
      • 1970-01-01
      相关资源
      最近更新 更多