Доступ к настройке вида из рендерера - PullRequest
1 голос
/ 26 июня 2019

Есть ли способ получить доступ к конфигурации представления из рендерера? Под конфигурацией представления я подразумеваю аргументы, передаваемые декоратору view_config () . Моя цель - добавить некоторые настройки в конфигурацию представления, которые затем может использовать средство визуализации.

У меня есть пользовательский рендер:

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

Есть ли способ доступа к my_renderer_opts, переданному view_config() из MyRenderer.__call__()?

1 Ответ

2 голосов
/ 27 июня 2019

, если вы все еще не реализуете его, как описано, возможно, 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()
...