использование строки запроса в конфигурации маршрута Python Pyramid - PullRequest
6 голосов
/ 01 августа 2011

это очень специфично для того, что я пытаюсь сделать, поэтому я начинаю описывать, что это такое:

  • приложение Pyramid, обслуживающее графики типа http://localhost:6543/path/to/myplot/plot001.png
  • , если графикнедоступно другое изображение обслуживается (work.png)
  • другая часть - это представление деформации, которое предоставляет HTML-форму для ввода конфигурации для графика, например: http://localhost:6543/path/to/myplot/plot001.png?action=edit. Обратите внимание на строку запроса "action= edit ".
  • конфигурация состоит из файла данных, шаблонов и т. д.
  • форма имеет кнопки сохранения (для сохранения конфигурации) и кнопки рендеринга (http://localhost:6543/path/to/myplot/plot001.png?action=render). рендеринг результатов в файл png, который затемиспользуется статическим способом.

Я разобрался со всеми деталями, такими как рендеринг с использованием Matplotlib и т. д., но я новичок в Pyramid и Deform. У меня также есть рабочий вид, который обслуживает график из файла.Форма деформации тоже работает. На данный момент мне неясно, как лучше структурировать ULR, чтобы различать варианты использования, редактирования и рендеринга. Я предполагаю, что в разговоре о Pyramid это означает, как настроить маршрутизатор.tes for serve_view и edit_view.

__init__.py:
    config.add_route('serve_route', 
        '/{project_name}/testruns/{testrun_name}/plots/{plot_name}.png')
    config.add_route('edit_route', 
        '/{project_name}/testruns/{testrun_name}/plots/{plot_name}.png')
# can I use query strings like "?action=edit" here to distinguish the difference?


views.py:
@view_config(context=Root, route_name='serve_route')
def plot_view(context, request):
... 
@view_config(context=Root, renderer='bunseki:templates/form.pt', route_name='edit_route')
def edit_view(request):
...

В руководстве по пирамиде я не смог найти справочную информацию о том, как установить параметры в маршруте.Я предполагаю, что указатель на некоторую документацию или образец был бы достаточен, и я могу выяснить детали самостоятельно.Спасибо!

Ответы [ 3 ]

12 голосов
/ 11 августа 2011

Есть два способа сделать это в зависимости от того, что вы предпочитаете для разделения кода.

  1. Поместите всю логику в ваше представление, разделив оператором if в request.GET.get('action').

    config.add_route('plot', '/{project_name}/testruns/{testrun_name}/plots/{plot_name}.png')
    config.scan()
    
    @view_config(route_name='plot')
    def plot_view(request):
        action = request.GET('action')
        if action == 'edit':
            # do something
            return render_to_response('bunseki:templates/form.pt', {}, request)
    
        # return the png
    
  2. Регистрация нескольких представлений и делегирование между ними с использованием механики поиска представлений Pyramid.

    config.add_route('plot', '/{project_name}/testruns/{testrun_name}/plots/{plot_name}.png')
    config.scan()
    
    @view_config(route_name='plot')
    def plot_image_view(request):
        # return the plot image
    
    @view_config(route_name='plot', request_param='action=edit',
                 renderer='bunseki:templates/form.pt')
    def edit_plot_view(request):
        # edit the plot
        return {}
    
    # etc..
    

Надеюсь, это поможет. Это отличный пример регистрации одного шаблона URL и использования разных представлений для разных типов запросов по этому URL.

1 голос
/ 01 августа 2011

Я не уверен, что вы можете использовать contex=Root в этой ситуации, но вы, вероятно, запрашиваете: matchdict.

__ init__.py:

config.add_route('serve_route', 
    '/{project_name}/testruns/{testrun_name}/plots/{plot_name}.png')

views.py:

@view_config(route_name='serve_route')
def plot_view(request):
    project_name = request.matchdict['project_name']
    action = request.params.get('action', None)

http://docs.pylonsproject.org/projects/pyramid/1.1/narr/urldispatch.html#matchdict

Редактировать:

Если ваш вопрос является более общим вопросом относительно маршрутизации, вы должны создатьодин маршрут на действие, чтобы сделать код функций вашего представления короче и понятнее.Например, если вы хотите редактировать и визуализировать, ваши маршруты могут выглядеть примерно так:

__ init__.py:

config.add_route('render_plot',
    '/{project_name}/testruns/{testrun_name}/plots/{plot_name}.png')
config.add_route('edit_plot',
    '/{project_name}/testruns/{testrun_name}/plots/{plot_name}/edit')

views.py:

@view_config('render_plot')
def render(request):
    pass

@view_config('edit_plot', renderer='bunseki:templates/form.pt')
def edit(request):
    pass
0 голосов
/ 19 декабря 2016

Более эффективным способом будет указание действия в URL. И вы даже можете выполнять различные действия на одном и том же имени маршрута или нескольких.

config.add_route('serve_route', '/{project_name}/testruns/{testrun_name}/plots/{action}/{plot_name}.png')

views.py
@view_config(context=Root, route_name='serve_route', action='view')
def plot_view(request):
    pass

Или со строкой запроса

`config.add_route('serve_route', 
    '/{project_name}/testruns/{testrun_name}/plots/{plot_name}.png')

views.py
@view_config(context=Root, route_name='serve_route')
def plot_view(request):
    try:
       action = getattr(self._request.GET, 'action')
    except AttributeError:
       raise 
...