2012-05-10 12 views
8

Wewnątrz planu kolby, mam:Za pomocą Flask Blueprint, jak naprawić url_for przed złamaniem, jeśli określono poddomeny?

frontend = Blueprint('frontend', __name__) 

i trasa do mojej funkcji indeksu jest:

@frontend.route('/') 
def index(): 
    #code 

Działa to dobrze, ale próbuję dodać subdomenę na trasie, tak:

@frontend.route('/', subdomain='<var>') 
def index(var): 

Ale to przerywa aplikację i przeglądarka wypluwa (między innymi):

werkzeug.routing.BuildError 
BuildError: ('frontend.index', {}, None) 

frontend.index nazywa się w moim kodu w kilku miejscach w url_for („”) frontend.index

Jak mogę uzyskać url_for pracować, kiedy jestem w tym subdomeny? Jedyną rzeczą w dokumentach znajdę i myślę, że może to być istotne jest pod http://flask.pocoo.org/docs/api/:

Aby zintegrować aplikacje, kolba ma hak do przechwytywania URL budować błędów poprzez Flask.build_error_handler. Url_for function skutkuje w błędzie BuildError, gdy bieżąca aplikacja nie ma adresu URL dla podanego punktu końcowego i wartości podany jako . Gdy tak się stanie, current_app wywołuje jego build_error_handler, jeśli nie jest None, która może zwrócić ciąg znaków do użycia jako wynik url_for (zamiast domyślnego url_for do podniesienia wyjątku BuildError) lub ponownie podnieść wyjątek. Przykład:

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 

Jednak Jestem nowym python (i programowanie) i nie może zrozumieć, gdzie chciałbym umieścić ten kod i jak dostanę tę funkcję, aby zadzwonić po wystąpieniu builderror.

Każdy wgląd byłoby bardzo mile widziane :)

+0

Czy próbowali dodanie '_external = True'' do url_for() zadzwonić? –

+0

@chrickso: Zobacz moją odpowiedź. Wygląda na to, że musisz podać tylko różne nazwy metod. – pyfunc

Odpowiedz

13

Po pierwsze, aby skorzystać subdomen musisz mieć wartość dla SERVER_NAME configuration:

app.config['SERVER_NAME'] = 'example.net' 

masz widok takiego:

frontend = Blueprint('frontend', __name__) 
@frontend.route('/', subdomain='<var>') 
def index(var): 
    return ... 

W celu odtworzenia URL z tym poglądem , Flask potrzebuje wartości dla var. url_for('frontend.index') zakończy się niepowodzeniem, ponieważ nie ma wystarczających wartości. Przy powyższym SERVER_NAME, url_for('frontend.index', var='foo') zwróci http://foo.example.net/.

-3

Nie sądzę, jest to problem z kolby.

Jesteś zapewniając dwie funkcje o tej samej nazwie metoda:

@frontend.route('/') 
def index(): 
    #code 

i

@frontend.route('/', subdomain='<var>') 
def index(var): 

one owinięte w różny sposób, ale kiedy flask.build_url nazywa, to jest wyrzucanie z powodu nazwy funkcji przeciążonej . Wydaje się to niepoprawne na pierwszy rzut oka.

Spróbuj zapewniając inną nazwę funkcji na drugim jak

@frontend.route('/', subdomain='<var>') 
def index_var(var): 

To może rozwiązać problem. Nie testowałem tego jednak.

9

Dodaj nazwę planu w url_for. Przykład:

url_for('pay_sermepa.sermepa_cancel', _external=True) 
  • pay_sermepa: nazwa plan
  • sermepa_cancel: trasa