Теги шаблона Django для добавления абсолютного пути к файлу - PullRequest
0 голосов
/ 28 декабря 2018

У меня проблема с тем, что мой шаблонный тег django {% url%} добавляет путь к файлу к производственному веб-адресу.Это не реплицируется на мою локальную машину разработки.

При такой настройке urls.py, что:

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

В процессе производства я получаю ссылку www.mysite.com/home/username/ myapp / about_us вместо www.mysite.com/about_us

Я смотрел на подобную проблему, и она не помогает в моем конкретном приложении: Тег URL-адреса Django добавляет путь к файлу

Мой проект django размещен на хостинге A2 (общий) с использованием apache, wsgi и passenger.Мой файл .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 из моих ссылок?

Обновление : Мне показалось, что я решил эту проблему.Когда я изменяю переменную SCRIPT_NAME в passenger_wsgi.py на

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)

Это приводит к моей первоначальной проблеме.

1 Ответ

0 голосов
/ 29 декабря 2018

У меня есть ответ, который сейчас работает.Решением является в основном оригинальный файл 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 = '' над корневым путем приложения, но если кто-нибудь знает какие-либо проблемы, связанные с этим, пожалуйста, поделитесь.

...