python - Django url模板标签添加绝对文件路径
问题描述
我有一个问题,我的 {% 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 添加文件路径
我的 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)
这又回到了我原来的问题。
解决方案
我有一个现在似乎可行的答案。解决方案基本上是上面发布的原始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 = '' 是否有任何警告,但如果有人知道这样做的任何问题,请分享。
推荐阅读
- javascript - 我可以构建一个子集合吗?(火库)
- jquery - 如何使用 jquery 日历控件显示图标?
- php - 如何在 php eval() 中捕获解析错误?
- reactjs - 如何检查 fetch 是否通过,如果是,则显示它?反应原生
- keycloak - 如何读取 Keycloak 用户上次登录的事件
- javascript - 如何从 React App 打开我的静态/单个网站演示?
- sql - 优化查询设计 Teradata
- python - 在 Python (Pandas) 或 Pyspark 中创建单词及其位置
- java - 无法使用 Spring Boot 在 MySQL 数据库中自动创建表
- spring-boot - 带有构造函数注入的 Spring Boot @WebMvcTest 不起作用