2012-08-08 13 views
6

decir que tengo un MethodView con este aspecto:POST-entonces-redirección y 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 

Este registrarse con este fragmento conocido:

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

Lo que pasa es que después de la post es Si se realiza correctamente, se redirecciona a la función get pero con una llamada POST y aumenta 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 - 

¿Hay una manera de contar redirect utilizar una llamada GET en su lugar?

+2

Me estoy poniendo esto también, pero no tienen respuesta y tropezado con esta pregunta. ¿Encontraste una respuesta? – blueblank

+0

Ningún hombre. Volví a hacer el proyecto en django, aunque el matraz se ve mucho mejor ... – tutuca

+4

302 volatilidad http://tools.ietf.org/html/rfc2616#section-10.3.3 "* Nota: RFC 1945 y RFC 2068 especifican que el cliente no puede cambiar el método en la solicitud redirigida. Sin embargo, la mayoría de las implementaciones de agente de usuario existentes tratan 302 como si fuera una respuesta 303, realizando un GET en el valor de campo Ubicación independientemente del método de solicitud original. 303 y 307 se han agregado para los servidores que desean aclarar inequívocamente qué clase de reacción se espera del cliente. * " – soulseekah

Respuesta

2

Parece que se puede hacer una redirección 302 con el mismo método de solicitud que la solicitud anterior. Sin embargo, una redirección 303 siempre debe usar GET (source).

La función de redirección puede tomar un código de estado. Prueba esto:

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

Editar: discusión similares: Redirecting to URL in Flask

+0

Entonces, ¿es un error en el matraz? Siempre recibo solicitudes 'POST' ... – tutuca