class RespondersAPI(MethodView):
# some class based view to do restful services
...
#now we have url maps here
users_api = RespondersAPI.as_view('users_api', userlevel=1)
admin_mod.add_url_rule("/user/uid/<objectid:user_id>",
view_func = users_api,
methods=["PUT", "DELETE"])
admin_mod.add_url_rule("/user",
defaults={'page': 1},
view_func = users_api,
methods=["GET"])
admin_mod.add_url_rule("/user/page/<int:page>",
view_func = users_api,
methods=["GET"])
admin_mod.add_url_rule("/user/new",
view_func = users_api,
methods=["POST"],)
上記からわかるように、問題は 4 番目のルーティング ルールに到達できないことです。objectid コンバーターは、ここで何が起こっているかです。
>>> url_for('.users_api', page=1)
'/admin/user'
>>> url_for('.users_api', page=2)
'/admin/user/page/2'
>>> url_for('.users_api', user_id=users[0].id)
'/admin/user?user_id=521781f4fe8974125cef5ea9' # not what I expected
objectid コンバーターはArmin Ronacher のものです。そこにいくつかのデバッグコードを入れたところ、これが起動されていないことがわかりました。これは、url ルールを作成する順序に関係があると考えたので、他のすべてのルールが宣言される前に、objectid を使用して url ルールを宣言しようとしました。ただし、これはまったく役に立ちません。コードの何が問題になっていますか? 現在の URL マップは次のとおりです。
Map([
<Rule '/admin/user/new' (POST, OPTIONS) -> admin_mod.users_api>,
<Rule '/admin/user/uid/<user_id>' (PUT, OPTIONS, DELETE) -> admin_mod.users_api>,
<Rule '/admin/user/page/<page>' (HEAD, OPTIONS, GET) -> admin_mod.users_api>,
<Rule '/admin/user' (HEAD, OPTIONS, GET) -> admin_mod.users_api>,
... # and a bunch of rules ..
])