为什么通过电脑IP地址访问Pyramid应用时静态资产不加载?
我正在开发一个Pyramid应用程序,通常通过 http://localhost:6543
在本地查看,这也是paster文档推荐的方式。我的应用里有一些资源,比如 .css
文件,这些文件放在一个叫 static
的文件夹里。我通过 config.add_static_view('static','static')
让这些资源可以被访问。当我通过 localhost
查看时,一切都正常,我的 .css
文件也能加载,没问题。但是,当我通过我电脑的主机名或IP地址访问应用时,这些静态资源就无法加载了。
新安装的Pyramid paster模板也有同样的问题。我按照Pyramid的文档,特别是关于 查看应用程序 的步骤进行操作,一切都如文档所描述的那样正常。但是,当我把地址栏的URL从 http://localhost:6543
改成 http://my.host.name:6543
时,样式表就无法加载了。
这些资源是可以访问的;如果在新创建的Pyramid paster模板中输入 http://my.host.name:6543/static/pylons.css
,你可以看到css的内容,但在加载根页面时却没有加载它。Firebug显示这些资源被请求了,但从未收到。
这到底是怎么回事呢?我该如何确保在通过其他方式请求时我的静态资源能够加载?
编辑:添加一些代码。这是来自Pyramid starter
paster模板的代码,我没有修改过,它和我的应用表现出相同的行为,可以算是一个最小示例。
来自包的 __init__.py
:
def main(global_config, **settings):
""" This function returns a Pyramid WSGI application.
"""
config = Configurator(settings=settings)
config.add_static_view('static', 'static', cache_max_age=3600)
config.add_route('home', '/')
config.scan()
return config.make_wsgi_app()
完整的 views.py
:
from pyramid.view import view_config
@view_config(route_name='home', renderer='templates/mytemplate.pt')
def my_view(request):
return {'project':'TestProject'}
来自 templates/mytemplate.pt
的相关行:
<link rel="stylesheet" href="/static/pylons.css" type="text/css" media="screen"
charset="utf-8" />
其中 static/pylons.css
位于根目录下的 static
文件夹中。
再次强调,在浏览器中打开 http://0.0.0.0:6543
一切正常,而 http://my.host.name:6543
显示的页面没有样式信息;但是 http://my.host.name:6543/static/pylons.css
却能显示样式表的文本。
1 个回答
在没有看到你的代码的情况下,回答这个问题有点困难。根据我之前的类似经历,我猜测你可能没有在模板中使用static_url这个方法。下面是另一种在模板中引用静态资源的方法:
<link rel="stylesheet" href="${request.static_url('app:static/css/app.css')}">
你有在使用这个吗?如果用其他方法的话,肯定会导致你看到的那种情况。
如果应用程序安装在一个不是文档根目录的路径下,似乎会出现问题。你可以在这里看到对此的讨论。