为什么通过电脑IP地址访问Pyramid应用时静态资产不加载?

2 投票
1 回答
1470 浏览
提问于 2025-04-17 12:03

我正在开发一个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 个回答

3

在没有看到你的代码的情况下,回答这个问题有点困难。根据我之前的类似经历,我猜测你可能没有在模板中使用static_url这个方法。下面是另一种在模板中引用静态资源的方法:

<link rel="stylesheet" href="${request.static_url('app:static/css/app.css')}">

你有在使用这个吗?如果用其他方法的话,肯定会导致你看到的那种情况。

如果应用程序安装在一个不是文档根目录的路径下,似乎会出现问题。你可以在这里看到对此的讨论。

撰写回答