Frage Wie kann ich nach POST in Pyramid umleiten?


Ich versuche, mein Formular an eine Route zu senden, die die Daten validiert und dann zurück zur ursprünglichen Route umleitet.

Beispielsweise:

  • Der Benutzer lädt die Seite website.com/post
  • Formular sendet die Daten an website.com/post-save
  • Der Nutzer wird zurück auf website.com/post weitergeleitet

Pyramid gibt mir einige Schwierigkeiten dabei.

Hier ist meine abgespeckte views.py

def _get_link_form(post_data):
    """ Returns the initialised form object """

    return LinkForm(post_data)

def home_page(request):

    form = _get_link_form(request.POST)
    return {'form' : form}

def save_post(request):
    """ form data is submitted here """"

    form = _get_link_form(request.POST)

    if not form.validate():
        return home_page(request, form)

Das ist der Code, mit dem ich gespielt habe. Es funktioniert nicht nur nicht, es fühlt sich auch unordentlich und gehackt an. Sicherlich gibt es einen einfacheren Weg, Post-Post in Pyramid umzuleiten.


18
2018-04-10 06:06


Ursprung


Antworten:


Ihr Problem wird am einfachsten gelöst, indem Sie einfach an die URL, unter der Ihr Formular angezeigt wird, POST senden und den Benutzer einfach von der Seite wegleiten, wenn der POST erfolgreich ist. Auf diese Weise ändern Sie die URLs nicht, bis das Formular erfolgreich abgeschickt wurde.

Wenn Sie nur an eine andere URL POST senden möchten, müssen Sie die Daten mithilfe von Sitzungen speichern, da Sie offensichtlich die Formulardaten zwischen Anforderungen verarbeiten.

Wenn Sie in der Lage sein möchten, Fehler in Ihren Formularen zu behandeln, verwenden Sie normalerweise eine Sitzung und Flash-Nachrichten. Um dies zu tun, fügen Sie einfach einen Speicherort für Flash-Nachrichten hinzu, die in Ihrer Basisvorlage angezeigt werden, und unterstützen die Setup-Sitzung mit etwas wie pyramid_beaker.

Angenommen, Ihre Homepage ist auf der "home" -Namen-Route eingerichtet:

from pyramid.httpexceptions import HTTPFound

def myview(request):
    user = '<default user field value>'
    if 'submit' in request.POST:
        user = request.POST.get('user')
        # validate your form data
        if <form validates successfully>:
            request.session.flash('Form was submitted successfully.')

            url = request.route_url('home') 
            return HTTPFound(location=url)
    return {
        # globals for rendering your form
        'user': user,
    }

Beachten Sie, dass Sie, wenn das Formular nicht validiert wird, denselben Code verwenden, den Sie zum ursprünglichen Rendern des Formulars verwendet haben, und nur bei erfolgreicher Weiterleitung. Dieses Format kann auch das Füllen des Formulars mit den in der Übergabe verwendeten Werten und Standardwerten verarbeiten.

Sie können die Flash-Nachrichten in der Vorlage Ihrer Wahl mit durchlaufen request.session.peek_flash() und request.session.pop_flash().

route_url unterstützt auch die Mutation der Abfragezeichenfolge für die generierte URL, wenn Sie Ihre Homepage-Ansicht zum Überprüfen der Sitzungsdaten kennzeichnen möchten.

Sie können natürlich einfach alles in der Abfragezeichenfolge an die Homepage zurückgeben, aber das ist eine ziemlich große Sicherheitslücke, gegen die Sitzungen schützen können.


26
2018-04-12 20:19



Die Pyramid-Dokumentation hat einen besonderen Punkt Sektion mit dem folgenden Beispiel:

from pyramid.httpexceptions import HTTPFound

def myview(request):
    return HTTPFound(location='http://example.com')

8
2018-04-10 06:24



Angenommen, Ihre Startseite ist die Standardansicht Ihrer Pyramiden-Webanwendung. Sie können Folgendes tun:

def _get_link_form(post_data):
    """ Returns the initialised form object """

    return LinkForm(post_data)

def home_page(request):

    form = _get_link_form(request.POST)
    return {'form' : form}

def save_post(request):   
    form = _get_link_form(request.POST)

    if not form.validate():
        from pyramid.httpexceptions import HTTPFound
        return HTTPFound(location=request.application_url)

Grundsätzlich müssen Sie wissen, wie die home_page-Ansicht Ihrem Konfigurator "hinzugefügt" wurde. Wenn Ihre Homepage tatsächlich unter / now / levels / deep / homepage lebt, könnte eine Weiterleitung wie folgt aussehen:

        return HTTPFound(location=request.application_url + '/few/levels/deep/homepage')

0
2018-04-12 14:20



Ich mache das so:

from pyramid.httpexceptions import HTTPCreated

response = HTTPCreated()
response.location = self.request.resource_url( newResource )
return response

Dies sendet den HTTP-Created-Code 201


0
2018-04-15 11:39



Ein sauberer Weg ist die Verwendung der "Überladung", die von der Pyramide für verschiedene Anfragetypen zur Verfügung gestellt wird, zB können Sie Ihre Methoden auf diese Weise dekorieren:

@action(request_method='GET',
        renderer='mypackage:/templates/save.mako',
        name='save')
def save(request):
    ''' Fill the template with default values or leave it blank'''
     return {}


@action(request_method='POST',
        renderer='mypackage:/templates/save.mako',
        name='save')
def save_post(request):
    """ form data is submitted here """"
    # process form

Im HTML müssen Sie das Aktionsformular aufrufen, wie

<form method="POST" id="tform" action="${request.route_url('home', action='save')}">

Auf diese Weise wird eine Methode bei Verwendung der Methode POST und die andere bei Verwendung von GET verarbeitet. Das Gleiche Name, aber zwei Implementierungen.


0
2018-04-09 13:46



Die Pyramidendokumentation hat Inhalt über Umleiten, können Sie mehr Informationen in der folgenden Verbindung sehen:

Pyramidendokumentation

import pyramid.httpexceptions as exc
raise exc.HTTPFound(request.route_url("section1"))   # Redirect

0
2017-12-02 21:10