这非常具体到我想要做的事情所以我开始描述它是什么:
我想出了使用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):
...
我在金字塔手册中找不到参考如何在路线中设置参数。我想指向一些文档或示例的指针就足够了,我可以自己弄清楚细节。谢谢!
答案 0 :(得分:12)
有两种方法可以执行此操作,具体取决于您希望分隔代码的方式。
将所有逻辑放入您的视图中,由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
使用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 :(得分: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