Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/sharepoint/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 从渲染器访问视图配置_Python_Python 3.x_Pyramid - Fatal编程技术网

Python 从渲染器访问视图配置

Python 从渲染器访问视图配置,python,python-3.x,pyramid,Python,Python 3.x,Pyramid,有没有办法从渲染器访问视图配置?我所说的视图配置是指传递给装饰器的参数。我的目标是向视图配置添加一些设置,渲染器可以使用这些设置 我有一个自定义渲染器: class MyRenderer(object): def __init__(self, info): pass def __call__(self, value, system): # Get view options. my_renderer_opts = ...

有没有办法从渲染器访问视图配置?我所说的视图配置是指传递给装饰器的参数。我的目标是向视图配置添加一些设置,渲染器可以使用这些设置

我有一个自定义渲染器:

class MyRenderer(object):
    def __init__(self, info):
        pass

    def __call__(self, value, system):
        # Get view options.
        my_renderer_opts = ...

        # Render using options.
        ...
注册为:

config.add_renderer('my_renderer', MyRenderer)
在我看来,我有:

class Page(object):
    def __init__(self, request):
        self.request = request

    @pyramid.view.view_config(
        route_name='root',
        renderer='my_renderer',
        my_renderer_opts={...}
    )
    def view(self):
        pass

是否有方法访问从
MyRenderer>传递到
view\u config()
my\u renderer\u opts
。\uuu调用

如果仍要按说明实现它,可能
deriver
将非常有用:

from wsgiref.simple_server import make_server
from pyramid.view import view_config
from pyramid.config import Configurator


@view_config(route_name="hello", renderer="myrend", renderer_options={"a": 1})
def hello_world(request):
    return "Hello World!"


def rendereropt_deriver(view, info):
    options = info.options.get("renderer_options", {})

    def wrapped(context, request):
        setattr(request, "_renderer_options", options)
        return view(context, request)
    return wrapped


rendereropt_deriver.options = ("renderer_options",)


class MyRendererFactory:
    def __init__(self, info):
        self.info = info

    def __call__(self, value, system):
        options = getattr(system["request"], "_renderer_options", {})
        print("`renderer_options` is {}".format(options))
        return value


if __name__ == "__main__":
    with Configurator() as config:
        config.add_route("hello", "/")
        config.add_view_deriver(rendereropt_deriver)
        config.add_renderer("myrend", MyRendererFactory)
        config.scan(".")
        app = config.make_wsgi_app()
    server = make_server("0.0.0.0", 8000, app)
    server.serve_forever()

my\u renderer\u opts
可以通过视图谓词添加,渲染器可以访问请求/视图/视图名称等,检查
pyramid.interfaces.RendererHelper.render\u View
,谓词在
视图中可用。\uu谓词\uu
@slavonic如何使用谓词添加
my\u renderer\u opts
?我以前使用过谓词,但在此上下文中没有。我一直在寻找
RendererHelper
的源代码,但运气不好
system['view']
Page
的一个实例,但它没有
\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu>属性(在一个实际有谓词的视图上进行测试,与我的示例不同)