tutorial route app python routes flask

python - route - Usando Flask Blueprints, ¿cómo arreglar url_for para que no se rompa si se especifica un subdominio?



flask session (3)

Agrega el nombre del plano en url_for . Ejemplo:

url_for(''pay_sermepa.sermepa_cancel'', _external=True)

  • pay_sermepa : nombre del proyecto
  • sermepa_cancel : ruta

Dentro de un plano de matraz, tengo:

frontend = Blueprint(''frontend'', __name__)

y la ruta a mi función de índice es:

@frontend.route(''/'') def index(): #code

Esto funciona bien, pero estoy tratando de agregar un subdominio a la ruta, así:

@frontend.route(''/'', subdomain=''<var>'') def index(var):

Pero esto rompe la aplicación y el navegador escupe (entre otras cosas):

werkzeug.routing.BuildError BuildError: (''frontend.index'', {}, None)

frontend.index se menciona en mi código en algunos lugares en url_for (''frontend.index'')

¿Cómo puedo hacer que url_for funcione cuando incluyo un subdominio? Lo único en los documentos que puedo encontrar y creo que puede ser relevante es esto en http://flask.pocoo.org/docs/api/ :

Para integrar aplicaciones, Flask tiene un gancho para interceptar los errores de compilación de URL a través de Flask.build_error_handler. La función url_for da como resultado un BuildError cuando la aplicación actual no tiene una URL para el punto final y los valores dados. Cuando lo hace, current_app llama a build_error_handler si no es None, que puede devolver una cadena para usar como resultado de url_for (en lugar de url_for para lanzar la excepción BuildError por defecto) o volver a generar la excepción. Un ejemplo:

def external_url_handler(error, endpoint, **values): "Looks up an external URL when `url_for` cannot build a URL." # This is an example of hooking the build_error_handler. # Here, lookup_url is some utility function you''ve built # which looks up the endpoint in some external URL registry. url = lookup_url(endpoint, **values) if url is None: # External lookup did not have a URL. # Re-raise the BuildError, in context of original traceback. exc_type, exc_value, tb = sys.exc_info() if exc_value is error: raise exc_type, exc_value, tb else: raise error # url_for will use this result, instead of raising BuildError. return url app.build_error_handler = external_url_handler

Sin embargo, soy nuevo en python (y en la programación) y no puedo entender dónde colocaría este código o cómo llamaría a esa función cuando ocurre un builderror.

Cualquier idea sería muy apreciada :)


No creo que esto sea un problema con Flask.

Está proporcionando dos funciones con el mismo nombre de método:

@frontend.route(''/'') def index(): #code

y

@frontend.route(''/'', subdomain=''<var>'') def index(var):

Se envuelven de forma diferente, pero cuando se llama a flask.build_url, se está lanzando debido a un nombre de función sobrecargado. Esto parece incorrecto a primera vista.

Intente proporcionar un nombre de función diferente para el segundo como

@frontend.route(''/'', subdomain=''<var>'') def index_var(var):

Esto puede resolver su problema. Aunque no lo he probado.


Primero, para usar subdominios, necesita tener un valor para la configuración de SERVER_NAME:

app.config[''SERVER_NAME''] = ''example.net''

Usted tiene una vista como esta:

frontend = Blueprint(''frontend'', __name__) @frontend.route(''/'', subdomain=''<var>'') def index(var): return ...

Para reconstruir la URL de esta vista, Flask necesita un valor para var . url_for(''frontend.index'') fallará ya que no tiene suficientes valores. Con el SERVER_NAME anterior, url_for(''frontend.index'', var=''foo'') devolverá http://foo.example.net/ .