2010-08-29 12 views
2

J'ai trouvé ce regex based dispatcher mais je préfère utiliser quelque chose qui n'utilise que des chaînes de préfixe littéral. Est-ce que de telles choses existent?Distributeur WSGI non regex

Je sais que ce ne serait pas difficile à écrire mais je préfère ne pas réinventer la roue.

Répondre

2

Pas exactement ce que vous décrivez, mais vos besoins peuvent être satisfaits en utilisant bottle. Le décorateur route est plus structuré. Bottle n'héberge pas d'applications WSGI, bien qu'il puisse être hébergé en tant qu'application WSGI.

Exemple:

from bottle import route, run 

@route('/:name') 
def index(name='World'): 
    return '<b>Hello %s!</b>' % name 

run(host='localhost', port=8080) 
3

Flask/Werkzeug a un répartiteur url wsgi phénoménale qui n'est pas regex basée. Par exemple, dans Flask:.

@myapp.route('/products/<category>/<item>') 
def product_page(category, item): 
    pseudo_sql = select details from category where product_name = item; 
    return render_template('product_page.html',\ 
         product_details = formatted_db_output) 

Cela vous obtient ce que vous attendez, c.-à-http://example.com/products/gucci/handbag; c'est une API vraiment sympa. Si vous voulez juste littéraux il est aussi simple que:

@myapp.route('/blog/searchtool') 
def search_interface(): 
    return some_prestored_string 

Mise à jour: par la question de Muhammad est ici une application compatible wsgi minimale en utilisant 2 utilitaires non regex de Werkzeug - cela prend juste une url, si l'ensemble chemin est juste «/» vous obtenez un message de bienvenue, sinon vous obtenez l'url arrière:

from werkzeug.routing import Map, Rule 

url_map = Map([ 
    Rule('/', endpoint='index'), 
    Rule('/<everything_else>/', endpoint='xedni'), 
]) 

def application(environ, start_response): 
    urls = url_map.bind_to_environ(environ) 
    endpoint, args = urls.match() 
    start_response('200 OK', [('Content-Type', 'text/plain')]) 
    if endpoint == 'index': 
     return 'welcome to reverse-a-path' 
    else: 
     backwards = environ['PATH_INFO'][::-1] 
     return backwards 

vous pouvez déployer que Tornado, mod_wsgi, etc. Bien sûr, il est difficile de battre les belles idiomes de Flask et Bouteille, ou la minutie et la qualité de Werkzeug au-delà de Map et Rule.

+0

Est-ce un répartiteur wsgi dans le sens où il transmet les requêtes HTTP à une application wsgi? Ou est-ce la même chose que «bouteille» dans ma réponse, attend des fonctions qui fonctionnent avec le cadre particulier? –

+0

Voir le deuxième lien, section démarrage rapide. Mais oui, vous pouvez utiliser le routage Werkzeug pour la distribution wsgi pure uniquement, vous appelez la méthode 'bind_to_environ' sur l'objet' Map' avec le paramètre wsgi environ de la requête en tant que paramètre dans votre application et vous êtes opérationnel - vous pouvez avoir une application compatible wsgi avec juste 'Map' et' Rule' dans 6 lignes de code. Le truc de Flask est juste un bon ensemble d'utilitaires pour travailler avec ces mêmes objets d'une manière plus transparente. – unmounted