2013-10-06 7 views
6

Il url_for funziona tra i progetti?Utilizzo di url_per attraverso i progetti

/flaskapp 
    /runserver.py   (from server import app; app.run(debug=True)) 
    /server 
     /__init__.py  (app = Flask(__name__)) 
     /pages 
      /__init__.py ('pages' blueprint) 
     /users 
      /__init__.py ('users' blueprint) 

in server/__init__.py:

from server.pages import pages 
from server.users import users 

app = Flask(__name__) 

app.register_blueprint(pages) 
app.register_blueprint(users) 

in server/pages/__init__.py:

pages = Blueprint('pages', __name__) 

@pages.route('/') 
def index(): return '<h1>Index</h1>' 

in server/users/__init__.py:

users = Blueprint('users', __name__) 

@users.route('/login') 
def login(): 
    ... 
    return redirect(url_for('pages.index')) 
        ^^^^^^^^^^^^^^^^^^^^^^ 

Il url_for chiamata solleva BuildError: ('pages.index', {}, None) Quale sarebbe un modo per arrivare a 'pages.index'?

(ho provato importare il modulo, ma che non ha funzionato)

+1

Ho cercato il tuo esempio con Flask 0.10.1 e sono in grado di ricreare il problema. Sembra che dovrebbe funzionare, forse hai lasciato fuori dalla domanda un codice che è effettivamente importante? Se possibile, prova a ricreare il problema in un singolo file python e pubblica il file python. Inoltre, appena prima di app.debug, stampa sulla console 'app.url_map', che elencherà tutte le regole per gli endpoint. –

risposta

3

Risposta breve: Sì

Lungo (ish) Risposta:

Come meglio posso dire, stai organizzando la tua app come dovresti.

Ho ricreato la configurazione (anche se in un singolo file), che è possibile verificare qui. Questo codice viene eseguito sulla mia macchina.

https://gist.github.com/enlore/80bf02346d6cabcba5b1

Nel pallone, è possibile accedere a una determinata funzione di visualizzazione con un endpoint relativo (.login) dall'interno del modello possessore, o tramite uno assoluto (user.login) ovunque.

Il mio denaro è per te che hai un refuso nel nome di una funzione di visualizzazione.

Come ha detto Mark Hildreth nei commenti, un ottimo modo per eseguire il debug del problema è quello di dare un'occhiata alla tua mappa url.

>>> from app import app 
>>> app.url_map 
Map([<Rule '/login' (HEAD, OPTIONS, GET) -> user.login>, 
<Rule '/' (HEAD, OPTIONS, GET) -> pages.index>, 
<Rule '/static/<filename>' (HEAD, OPTIONS, GET) -> static>]) 
>>> 
2

Se si utilizza url_value_preprocessor assicurarsi che si sta impostando correttamente la url_defaults altrimenti url_for non avrebbero valori sufficienti per costruire l'url e si ottiene questo messaggio di errore piuttosto confusa.

Esempio.

@bp.url_value_preprocessor 
def get_project(endpoint, values): 
    project_name = values.pop('project_name') 
    g.project = Project.query.filter_by(name=project_name).first_or_404() 

@bp.url_defaults 
def add_project(endpoint, values): 
    if 'project_name' in values or not g.project: 
     return 
    values['project_name'] = g.project.name 
Problemi correlati