2012-08-08 12 views
6

dire che ho un MethodView simile a questo:POST-then-redirect e 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 

Questa ottenere registrato con questo frammento noto:

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']) 

Il fatto è, che dopo il post è con successo sta reindirizzando la funzione get ma con una chiamata POST e solleva 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 - 

C'è un modo per dire redirect di utilizzare una chiamata GET invece?

+2

sto ottenendo questo pure, ma non hanno alcuna risposta e ci siamo imbattuti su questa questione. Hai trovato una risposta? – blueblank

+0

Nessun uomo. Sono tornato a fare il progetto in django, anche se il pallone sembra molto meglio ... – tutuca

+4

302 volatilità http://tools.ietf.org/html/rfc2616#section-10.3.3 "* Nota: RFC 1945 e RFC 2068 specificano che il client non è autorizzato a modificare il metodo sulla richiesta reindirizzata.Tuttavia, la maggior parte delle implementazioni degli user agent esistenti trattano il 302 come se fosse una risposta 303, eseguendo un GET sul valore del campo Location indipendentemente dal metodo di richiesta originale. 303 e 307 sono stati aggiunti per i server che desiderano chiarire in modo inequivocabile quale tipo di reazione è prevista per il cliente. * " – soulseekah

risposta

2

Sembra che un reindirizzamento 302 possa essere eseguito con lo stesso metodo di richiesta della richiesta precedente. Un reindirizzamento 303, tuttavia, dovrebbe sempre utilizzare GET (source).

La funzione di reindirizzamento può richiedere un codice di stato. Prova questo:

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

Edit: discussione simile: Redirecting to URL in Flask

+0

Quindi e 'un bug in fiasco? Ho sempre richieste 'POST' ... – tutuca