3

次の URL エンドポイントを設定しています。

manager.py

from xxx import ContactAPI
from xxx.models import Contact

# self.app is my Flask app
# self.session is SQLAlchemy Session

api_name = 'contact'
instance_endpoint = '/%s/<int:instid>' % api_name
methods = ['GET']

api_view = ContactAPI.as_view(api_name, self.session,
                              Contact, app)

self.app.add_url_rule(instance_endpoint, methods=methods, 
                      defaults={'instid': None},
                      view_func=api_view)

そしてget()、私の ContactAPI クラスでオーバーライドします:

ビュー.py

from flask.views import MethodView

class ContactAPI(MethodView):

    def __init__(self, session, model, app, *args, **kwargs):
        super(ContactAPI, self).__init__(*args, **kwargs)

    def get(self, instid):
        print instid

URL/contact/1にアクセスすると、instidとして出力されNoneます。

defaults={'instid': None},manager.py から行を削除すると、instid1 として出力されます。

私の呼び出しに defaults 行があるとadd_url_rule、URL に入力しているものをオーバーライドするのはなぜですか?

4

2 に答える 2

4

を使用する場合、2 つのエンドポイントを登録する必要があることがわかりましたdefaults

がkwarg として ContactAPI ビューに{'instid': None}渡されるため、URLにヒットしたときに Flask に None を設定するように指示する必要があります。get()instid/contact

を打つときは/contact/1、 を使う必要があります<int:instid>。これを行うには、へdefaultsの呼び出しで kwargを削除する必要がありadd_url_rule()ます。

manager.py

from xxx import ContactAPI
from xxx.models import Contact

# self.app is my Flask app
# self.session is SQLAlchemy Session

api_name = 'contact'
instance_endpoint = '/%s/<int:instid>' % api_name
collection_endpoint = '/%s' % api_name

methods = ['GET']

api_view = ContactAPI.as_view(api_name, self.session,
                              Contact, app)

self.app.add_url_rule(instance_endpoint, methods=methods, 
                      view_func=api_view)

self.app.add_url_rule(collection_endpoint, methods=methods, 
                      defaults={'instid': None},
                      view_func=api_view)

関連する Werkzeug ドキュメント: http://werkzeug.pocoo.org/docs/routing/#werkzeug.routing.Rule

asdfこれを指摘してくれた #flask IRC チャンネルに感謝します。

于 2013-03-14T22:41:50.063 に答える
1

同様のことの完全な例がフラスコのドキュメントにあります - https://flask.palletsprojects.com/en/1.1.x/views/

于 2015-04-14T00:47:10.720 に答える