【发布时间】:2018-04-11 23:33:23
【问题描述】:
我有一个 Tornado 应用程序,我想使用 nginx 在非 root 位置下托管它。所以我有一个看起来像
的 nginx 配置server {
listen 80;
server_name mysite.com;
location /myapp/ {
proxy_pass http://localhost:8888/;
}
}
我希望应用程序位于mysite.com/myapp/。使用当前配置,所有处理程序都被路由到正确的 url,但是模板中使用的所有链接都是错误的。例如
<a href='/'>Home</a>
链接到mysite.com/ 而不是mysite.com/myapp/。我还希望该应用程序仍能在本地运行,因此我不希望将 /myapp/ 硬编码到模板中。
有没有办法用 nginx 或 Tornado 来处理这个问题?
到目前为止,我的解决方案是在模板命名空间中添加一个便利函数
import tornado.ioloop
import tornado.web
import os
APPLICATION_ROOT = os.environ.get('MYAPP_ROOT')
class BaseHandler(tornado.web.RequestHandler):
def full_url(self, path, *args, **kwargs):
if path.startswith('/'):
path = path.lstrip('/')
return os.path.join(APPLICATION_ROOT, path)
else:
return path
def get_template_namespace(self):
"""Returns a dictionary to be used as the default template namespace.
May be overridden by subclasses to add or modify values.
The results of this method will be combined with additional
defaults in the `tornado.template` module and keyword arguments
to `render` or `render_string`.
"""
namespace = dict(
handler=self,
request=self.request,
current_user=self.current_user,
locale=self.locale,
_=self.locale.translate,
pgettext=self.locale.pgettext,
static_url=self.static_url,
xsrf_form_html=self.xsrf_form_html,
reverse_url=self.reverse_url,
full_url=self.full_url
)
namespace.update(self.ui)
return namespace
并将MYAPP_ROOT='/myapp/'设置为环境变量并使用
<a href="{{ full_url('/') }}">Home</a>
在模板中。
【问题讨论】: