2012-08-08 7 views
6

Sagen, ich habe eine MethodView wie folgt aussehen:POST-then-Umleitung und MethodViews

from flask import jsonify, request, redirect, flash, views, url_for 
from models import Provider 

class ProviderAPI(views.MethodView): 

    def get(self, provider_id): 
     if provider_id is not None: 
      provs = [Provider.objects.get_by_id(provider_id)] 
     else: 
      provs = Provider.objects.all() 
     return jsonify(dict(objects=[x.attributes_dict for x in provs])) 

    def post(self): 
     data = request.form.to_dict() 
     data['index'] = request.form.getlist('index') 
     if data: 
      obj = Provider(**data) 
      if obj.is_valid(): 
       obj.save() 

       flash('%s created' % obj,) 

       return redirect(url_for(
        'provider', 
        provider_id=obj.id, 
        ) 
       ) 
      else: 
       return jsonify(obj.errors) 

    def put(self, provider_id): 
     pass 

    def delete(self, provider_id): 
     pass 

Das mit diesem bekannten Schnipsel registrieren lassen:

def register_api(view, endpoint, url, pk='id', pk_type='int'): 
    """ 
    Helper for the API boilerplate, `view` must inherit from MethodView 

    register_api(UserAPI, 'user', '/user/', pk='provider_id') 
    """ 
    view_func = view.as_view(endpoint) 

    app.add_url_rule(url, defaults={pk: None}, 
        view_func=view_func, methods=['GET',]) 
    app.add_url_rule(url, view_func=view_func, methods=['POST',]) 
    app.add_url_rule('%s<%s:%s>' % (url, pk_type, pk), view_func=view_func, 
        methods=['GET', 'PUT', 'DELETE']) 

Die Sache ist, dass nach dem post ist erfolgreich es ist die get Funktion umgeleitet, aber mit einem POST Anruf und es erhöht Method Not Allowed.

127.0.0.1 - - [08/Aug/2012 12:35:21] "POST /provider/ HTTP/1.1" 302 - 
127.0.0.1 - - [08/Aug/2012 12:35:21] "POST /provider/44 HTTP/1.0" 405 - 

Gibt es eine Möglichkeit redirect zu sagen, anstatt einen GET Anruf zu benutzen?

+2

Ich bekomme dies auch, haben aber keine Antwort und stolperte auf dieser Frage. Hast du eine Antwort gefunden? – blueblank

+0

Kein Mann. Ging zurück zum Projekt in Django, obwohl Kolben sieht viel besser aus ... – tutuca

+4

302 Volatilität http://tools.ietf.org/html/rfc2616#section-10.3.3 "* Hinweis: RFC 1945 und RFC 2068 angeben, dass Dem Client ist es nicht erlaubt, die Methode für die umgeleitete Anforderung zu ändern.Die meisten vorhandenen Benutzeragentenimplementierungen behandeln 302 jedoch so, als ob es eine 303-Antwort wäre, die unabhängig von der ursprünglichenAnforderungsmethode ein GET für den Standortfeldwert ausführt 303 und 307 wurden für Server hinzugefügt, die eindeutig angeben möchten, welche Art von Reaktion vom Client erwartet wird. * " – soulseekah

Antwort

2

Es sieht so aus, als könnte eine 302-Weiterleitung mit der gleichen Anfrage-Methode wie die vorherige Anfrage gemacht werden. Bei einer 303-Weiterleitung sollte jedoch immer GET (source) verwendet werden.

Die Umleitungsfunktion kann einen Statuscode annehmen. Versuchen Sie folgendes:

  return redirect(url_for(
       'provider', 
       provider_id=obj.id, 
       ), 
       code=303 
      ) 

Edit: ähnliche Diskussionen: Redirecting to URL in Flask

+0

Also ist es ein Fehler in der Flasche? Ich bekomme immer 'POST' Anfragen ... – tutuca

Verwandte Themen