Frage

Ich bin auf der Suche nach einer Möglichkeit, Benutzer auf verschiedene Routen/Vorlagen umzuleiten, die mit @view_config kompatibel sind.

Ich habe eine Funktion, die in einer hochgeladenen Datei liest und versucht, ein neues Modell basierend auf dem Dateiinhalt zu erstellen. Ich habe mich gefragt, ob es einen sauberen Weg gab, wie ich den Benutzer zu einem von zwei URLs umleiten kann, basierend darauf, ob die Erstellung des neuen Modells erfolgreich ist oder ein Fehler vorliegt.

Wenn die Modellerstellung erfolgreich ist, möchte ich den Benutzer auf die Modellseite umleiten. Wenn ein Fehler vorliegt, möchte ich den Benutzer zu einer Fehlerseite umleiten. Ich habe jedoch Probleme, die ursprüngliche Funktion (Load_Model) von View_config auszubrechen, wenn die Fehlerseite rendert.

@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

Jede Route hätte eine @view_config, die sie an eine Funktion bindet.

War es hilfreich?

Lösung

Was Sie fragen, ist nicht "wie man umleitet", sondern "wie man den Renderer in der Ansichtsfunktion ändert". Um schnell zu antworten, denke ich, dass Sie verwenden könnten:

request.override_renderer = 'other-renderer.mak'

Aber ich denke nicht, dass es eine gute Idee ist. Hier ist das übliche Muster, das die meiste Zeit verwendet wird, um die Einreichung von Formularen zu behandeln:

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}

Zusamenfassend:

  • Sie zeigen eine leere Form, wenn Sie eine haben GET Auf der Route für ein neues Modell.
  • Sie verarbeiten die Formulareingabe (POST) In einer anderen Ansichtsfunktion
    • Wenn die Daten gültig sind, machen Sie Ihre Sachen, dann leiten Sie mit httpfund um
    • Wenn die Daten ungültig sind, geben Sie diesmal ein DIKT zurück, um das Formular erneut mit Fehlern anzuzeigen
  • Sie verwenden den gleichen Renderer in der GET und POST, aber der in der POST wird nur bei ungültigen Daten verwendet (sonst umleiten Sie um).
  • Sie haben eine andere Ansichtsfunktion, um das erstellte Modell anzuzeigen.

Andere Tipps

Antoine zeigte eine allgemeinere Lösung, aber hier ist ein Versuch, sich an Ihr Grundformat zu halten.

Die Idee ist, dass Sie eine Verarbeitung durchführen und den Benutzer dann entweder zu einem Erfolg oder einer Fehlerseite umleiten möchten. Sie können zu einer Fehlerseite umgeleitet, wenn Sie genauso wie eine Erfolgsseite umgeleitet werden möchten. Ich werde jedoch eine andere Version zeigen, bei der Sie nur die Fehlerseite in Load anzeigen. Wenn Sie jedoch laden, leiten Sie das Modell um.

config.add_route('show_model', '/models/{id}')
config.add_route('load_model', '/load_model')

@view_config(route_name='load_model', renderer='error.mak')
def load_model(self):
    # ...
    model = Model.find_model(model_name)
    if model:
        return HTTPFound(self.request.route_url('show_model', id=model.id))
    return {} # some dict of stuff required to render 'error.mak'

@view_config(route_name='show_model', renderer='model.mak')
def show_model(self):
    id = request.matchdict['id']
    model = Model.get_model_by_id(id)
    # be aware model could fail to load in this new request
    return {'model': model} # a dict of stuff required to render 'model.mak'
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top