2011-11-09 38 views
9

Estoy escribiendo una aplicación en la que los usuarios podrán almacenar información para la que pueden especificar una interfaz REST. IE, almacene una lista de productos en /<username>/rest/products. Dado que las URL obviamente no se conocen de antemano, estaba tratando de pensar en la mejor forma de implementar la creación dinámica de URL en Flask. La primera forma en que pensé sería escribir una regla general y enrutar la URL desde allí. Pero básicamente estoy duplicando las capacidades de enrutamiento de URL cuando Flask ya las tiene incorporadas. Entonces, me preguntaba si sería una mala idea usar .add_url_rule() (docs here, bajar un poco) para adjuntarlos directamente a la aplicación. ¿Hay alguna razón específica por la que no se debe hacer?Agregue dinámicamente reglas de URL a la aplicación Flask

Respuesta

12

Cada vez que ejecuta add_url_rule() el enrutamiento interno reasigna el mapa de URL. Esto no es ni threadsafe ni rápido. En este momento no entiendo por qué necesita reglas de URL específicas del usuario para ser honesto. Suena como si realmente desearas montar aplicaciones específicas para el usuario?

Tal vez esto sea útil: http://flask.pocoo.org/docs/patterns/appdispatch/

+0

Tengo el mismo requisito, es decir, estoy buscando una manera de agregar dinámicamente nuevos puntos finales a una API creada con [Eve] (http://python-eve.org) utilizando su método 'register_resource', que llama' add_url_rule' internamente. Tenga en cuenta que esto no sucederá para todas las solicitudes, solo se desencadenará cuando se reciba un 'POST' para un punto final específico, por lo que el rendimiento no debería ser un problema. – kynan

+0

Exactamente el mismo requisito aquí. Api, que necesita agregar y eliminar una nueva ruta cada vez que se produce una solicitud PUT en determinada ruta. En mi caso estoy usando un matraz, pero básicamente es lo mismo. – cllamach

+0

Parece que puedo hacer esto en before_request si uso threading.lock, sin embargo, no estoy seguro de cómo detener problemas con url_por tener el siguiente error: ValueError: lista modificada durante sort ERROR: app: Internal Server Error, list modified durante el género – pip

0

he tenido requisito similar para mi aplicación en la que cada punto final de /<SOMEID>/rest/otherSOMEID dada debería estar delimitado a una función diferente. Una forma de lograr esto es mantener un diccionario de búsqueda donde los valores son la función que maneja el SOMEID específico. Por ejemplo echar un vistazo a este fragmento:

func_look_up_dict = {...} 
@app.route('<SOMEID>/rest/other', methods=['GET']) 
def multiple_func_router_endpoint(SOMEID): 
    if SOMEID in func_look_up_dict.keys(): 
     return jsonify({'result' = func_look_up_dict[SOMEID]()}), 200 
    else: 
     return jsonify({'result'='unknown', 'reason'='invalid id in url'}), 404 

por lo que para este tipo de atención que realmente no necesita "dinámica" añadir reglas de URL, sino más bien utilizar una regla de URL con parámetros y manejar los diferentes casos withing una sola función. Otra cosa a considerar es pensar realmente en el caso de uso de dicho punto final de URL. Si <username> es un parámetro que se debe pasar, ¿por qué no usar una regla de URL como /rest/product/<username> o pasarla como argumento en la solicitud GET? Espero que ayude.

Cuestiones relacionadas