在Python Pyramid路由配置中使用查询字符串

时间:2011-08-01 10:10:57

标签: python forms routes pyramid deform

这非常具体到我想要做的事情所以我开始描述它是什么:

  • 一个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中这意味着如何为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 个答案:

答案 0 :(得分:12)

有两种方法可以执行此操作,具体取决于您希望分隔代码的方式。

  1. 将所有逻辑放入您的视图中,由request.GET.get('action')上的“if”语句分隔。

    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..
    
  3. 希望这会有所帮助。这是一个很好的例子,可以注册单个url模式,并为该URL上的不同类型的请求使用不同的视图。

答案 1 :(得分:1)

我不确定在这种情况下你可以使用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

答案 2 :(得分:0)

更有效的方法是在网址中指定操作。您甚至可以在相同的路径名称或多个路径上执行不同的操作。

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