条件重定向金字塔

sut*_*tee 1 python redirect view pyramid

我正在寻找一种方法将用户重定向到与使用@view_config兼容的不同路由/模板.

我有一个函数读取上传的文件,并尝试根据文件内容创建一个新模型.我想知道是否有一种干净的方式可以将用户重定向到两个网址之一,具体取决于新模型的创建是成功还是存在错误.

如果模型创建成功,我想将用户重定向到模型页面.如果出现错误,我想将用户重定向到错误页面.但是,在呈现错误页面时,我无法分解原始函数(load_model)的view_config.

@view_config(renderer="error.mak")
@view_config(renderer="model.mak",
        route_name='load_model_route')
def load_model(self):
   ...
   model = Model.find_model(model_name)
   if model:
      #redirect to model_route
   else:
      #redirect to model_error_route
Run Code Online (Sandbox Code Playgroud)

每个路由都有一个@view_config,它将它绑定到一个函数.

Ant*_*air 5

您要问的不是"如何重定向",而是"如何在视图功能中更改渲染器".要快速回答,我想你可以使用:

request.override_renderer = 'other-renderer.mak'
Run Code Online (Sandbox Code Playgroud)

但我认为这不是一个好主意.以下是大多数时间用于处理表单提交的常用模式:

from pyramid.httpexceptions import HTTPFound, HTTPNotFound
from pyramid.url import route_url
from your_app import Model, some_stuff, save_to_db

@view_config(route_name='new_model',
        renderer='model/new.mak', request_method='GET')
def new(request):
    """Shows the empty form."""
    return {'model': Model(), 'errors': {}}

@view_config(route_name='create_model',
        renderer='model/new.mak', request_method='POST')
def create(request):
    """Receives submitted form."""
    model = some_stuff()
    if len(model.errors) = 0: # is valid
        # do your stuff, then redirect
        save_to_db(model)
        return HTTPFound(route_url('show_model', request, model_id=model.id))
    # is invalid
    return {'model': model, 'errors': model.errors}

@view_config(route_name='show_model',
    renderer='model/show.mak', request_method='GET')
def show(request):
    """Shows details of one model."""
    model = Model.find(request.matchdict['model_id'])
    if model is None:
        return HTTPNotFound()
    return {'model': model}
Run Code Online (Sandbox Code Playgroud)

简而言之:

  • 当你有GET一个新模型的路线时,你会显示一个空表格.
  • POST在不同的视图函数中处理表单提交()
    • 如果数据有效,则执行您的操作,然后使用HTTPFound重定向
    • 如果数据无效,则返回一个dict以再次显示该表单,这次出错
  • 您在GET和中使用相同的渲染器POST,但是POST仅在无效数据的情况下使用该渲染器(否则,您重定向).
  • 您有另一个视图功能来显示创建的模型.