您可以使用pkg_resources
module 来创建相对于 Python 模块的路径(因此独立于检索它们的模块)。例如:
import pkg_resources
print pkg_resources.resource_filename('os.path', 'static/favicon.ico')
# 'C:\\Python27\\lib\\static\\favicon.ico'
只需替换即可os.path
与静态文件的父模块一起使用。
EDIT: 如果你需要记住这一点'static'
路线映射到'MyPkg:static'
,那么最简单的方法就是首先将其保存在某个字典中:
STATIC_ROUTES = {'static': 'MyPkg:static'}
for name, path in STATIC_ROUTES.iteritems():
cfg.add_static_view(name=name, path=path)
然后简单地检索路径:
static_path = STATIC_ROUTES['static']
package, relative_path = static_path.split(':')
icon_path = pkg_resources.resource_filename(
package, os.path.join(relative_path, 'favicon.ico'))
但是,如果这是不可能的(例如,您无权访问cfg
对象),你can找回这条路,实在是太痛苦了。这是一个示例函数,它使用未记录的调用(因此可能在未来的 Pyramid 版本中更改)并忽略一些附加设置(例如route_prefix
配置变量):
def get_static_path(request, name):
from pyramid.config.views import StaticURLInfo
registrations = StaticURLInfo()._get_registrations(request.registry)
if not name.endswith('/'):
name = name + '/'
route_name = '__%s' % name
for _url, spec, reg_route_name in registrations:
print ':', reg_route_name
if reg_route_name == route_name:
return spec
在你的情况下,它应该像这样工作:
>>> get_static_path(request, 'static')
MyPkg:static/