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/
.