Вы можете использовать модуль pkg_resources
для создания путей, относящихся к модулям Python (и, таким образом, не зависящих от модуля, который их получает).Например:
import pkg_resources
print pkg_resources.resource_filename('os.path', 'static/favicon.ico')
# 'C:\\Python27\\lib\\static\\favicon.ico'
Просто замените os.path
тем модулем, который является родительским для ваших статических файлов.
РЕДАКТИРОВАТЬ : Если вам нужно запомнить это '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
объекту), вы можете получить этот путь, это довольно болезненно.Вот пример функции, которая использует недокументированные вызовы (и может измениться в будущих версиях 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/