2012-05-10 41 views
8

裏面一個燒瓶藍圖,我有:使用Flask Blueprints,如何修復如果指定一個子域時破解url_for?

frontend = Blueprint('frontend', __name__) 

和我的索引功能的路線爲:

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

這工作得很好,但我想一個子域添加到路由,像這樣:

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

但是,這打破了應用程序和瀏覽器吐出來(除其他事項外):

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

frontend.index在我的代碼叫了幾個地方在url_for(「frontend.index」)

我怎樣才能得到url_for上班的時候,我包括一個子域?下列文件中的我唯一能找到,我想可能是相關的是這個http://flask.pocoo.org/docs/api/下:

集成應用程序,燒瓶帶有鉤子攔截URL通過Flask.build_error_handler建立 錯誤。如果當前應用沒有指定的 端點和值的URL,則url_for函數會在BuildError中產生 。如果它不是None,那麼current_app會調用它的 build_error_handler,它可以返回一個字符串 作爲url_for的結果(而不是url_for的默認值,以提高 BuildError異常)或者重新引發異常。舉個例子:

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 

不過,我是新來的Python(和編程),可以不明白的地方,我會把這個代碼或我將如何得到該功能時builderror發生時調用。

任何洞察力將不勝感激:)

+0

您是否嘗試過加入''_external = True''你的url_for()調用? –

+0

@chrickso:看到我的答案。它看起來像,你只需要提供不同的方法名稱。 – pyfunc

回答

13

首先,要使用子域名,你需要有一個價值,爲SERVER_NAME configuration

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

你有這樣的觀點:

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

爲了將URL重建這一觀點,Flask需要var的值。 url_for('frontend.index')將失敗,因爲它沒有足夠的值。通過上面的SERVER_NAME,url_for('frontend.index', var='foo')將返回http://foo.example.net/

-3

我不認爲這是一個問題與燒瓶。

你提供用同樣的方法名稱的兩個功能:

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

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

它們被包裝不同,但是當flask.build_url被調用,這是因爲重載函數名的拋。 乍一看似乎不正確。

嘗試使用第二個,提供不同的功能名稱,如

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

這樣可以解決您的問題。我還沒有測試過它。

9

url_for中添加藍圖名稱。例如:

url_for('pay_sermepa.sermepa_cancel', _external=True) 
  • pay_sermepa:藍圖名
  • sermepa_cancel:路線