regole nel pallone sono unici. Se definisci lo stesso URL assoluto per la stessa funzione, per impostazione predefinita si scontrerà perché stai facendo qualcosa che ti impedisce di fare dal nostro punto di vista che è sbagliato.
C'è una ragione per cui si vorrebbe avere più di un URL per lo stesso endpoint assoluto e che è retrocompatibilità con una regola che esisteva in passato. Dal momento che WZ0.8 e Flask 0.8 è possibile specificare esplicitamente un alias per un percorso:
@app.route('/')
@app.route('/index.html', alias=True)
def index():
return ...
In questo caso, se l'utente richiede /index.html
Flask emetterà automaticamente un redirect permanente ad appena /
.
Ciò non significa una funzione non poteva essere destinata a più di un URL, però, ma in questo caso si avrebbe bisogno di modificare l'endpoint:
@app.route('/')
def index():
...
app.add_url_rule('/index.html', view_func=index, endpoint='alt_index')
O in alternativa:
@app.route('/')
@app.route('/index.html', endpoint='alt_index')
def index():
...
In questo caso è possibile definire una vista una seconda volta con un nome diverso. Tuttavia questo è qualcosa che generalmente si vuole evitare perché la funzione di visualizzazione dovrebbe controllare request.endpoint per vedere cosa viene chiamato. Invece meglio fare qualcosa di simile:
@app.route('/')
def index():
return _index(alt=False)
@app.route('/index.html')
def alt_index():
return _index(alt=True)
def _index(alt):
...
In entrambi questi casi generazione URL è url_for('index')
o url_for('alt_index')
.
si può anche fare questo a livello di sistema di routing:
@app.route('/', defaults={'alt': False})
@app.route('/index.html', defaults={'alt': True})
def index(alt):
...
In questa generazione URL caso è url_for('index', alt=True)
o url_for('index', alt=False)
.
Che risposta approfondita e bella. Dammi una possibilità di verificare e la contrassegnerò come accettata. Dovresti forse inviarlo al popolo pocoo in modo che venga ufficialmente documentato. – jiggy
Ok, ho avuto qualche problema con questo fino a quando non ho aggiornato a pallone 0.8 (non è riuscito con 0.7.2). Sembra anche che stia raccogliendo la prima annotazione, non l'ultima per me. In entrambi i casi, il parametro endpoint è la chiave. – jiggy