10

フラスコの青写真の中に、私は持っています:

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/の下にあります:

アプリケーションを統合するために、FlaskにはFlask.build_error_handlerを介してURLビルドエラーをインターセプトするフックがあります。現在のアプリに特定のエンドポイントと値のURLがない場合、url_for関数はBuildErrorを引き起こします。その場合、current_appはNoneでない場合に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(およびプログラミング)に不慣れであり、このコードをどこに配置するか、またはビルドエラーが発生したときにその関数をどのように呼び出すかを理解できません。

どんな洞察も大歓迎です:)

4

3 に答える 3

15

まず、サブドメインを使用するには、SERVER_NAME構成の値が必要です。

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/ます。

于 2012-07-27T19:08:12.203 に答える
-3

これはFlaskの問題ではないと思います。

同じメソッド名を持つ 2 つの関数を提供しています。

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

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

それらは異なってラップされますが、flask.build_url が呼び出されると、オーバーロードされた関数名のためにスローされます。これは一見間違っているように見えます。

次のように、2番目の関数に別の関数名を付けてみてください

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

これで問題が解決する場合があります。私はそれをテストしていません。

于 2012-05-16T22:27:56.347 に答える