

PythonのWebアプリケーションフレームワークであるBottleのチュートリアルを使用しているのですが、その中でDynamic
Routingのfilterのところで詰まってしまっています。

具体的には以下のコードを実行します。

[code]

    from bottle import route, run, template
    
    @route('/object/<id:int>')
    def callback(id):
        assert isinstance(id, int)
    
    @route('/show/<name:re:[a-z]+')
    def callback(name):
        assert name.isalpha()
    
    @route('/static/<path:path>')
    def callback(path):
        return static_file(path,null)
    
    run(host='localhost', port=8080, reloader=True, debug=True)
    
[/code]

その後ブラウザから`http://localhost:8080/object/192`にアクセスすると次のように出力されます。

[code]

    192 object
    
[/code]

Pythonの[公式ドキュメント](https://docs.python.org/3/library/functions.html#isinstance)を見ると`isinstance()`はTrueもしくはFalseを戻り値として返すようなので、Trueが出力されるのが正しいのではないかと考えているのですが、`192
object`が正しいのでしょうか。そうでない場合、記載したコードに誤りがあればご指摘いただけると幸いです。

よろしくお願いします。


CC BY-SA 3.0
2016-11-13T08:31:46.567
30372
2021-01-15T05:10:01.760
7269
question
python bottle
BottleフレームワークでDynamic Routingのフィルターを機能させる方法


`@route('/<action>/<user>')` のルーティングが原因です。  
`@route('/object/<id:int>')` とバッティングしているため、先に記述されている`user_api`関数が呼ばれます。  
`@route('/<action>/<user>')`
を削除するか、この`user_api`関数を`callback`関数の後に記述することで回避できます。

また、`assert`はエラーの時のみエラーを返します。  
True, Falseを返したい時は`return str(isinstance(id, int))`などで文字列を返さないと正しく表示されません。

[code]

    from bottle import route, run, template
    
    @route('/hello')
    def hello():
        return "Hello World!" 
    
    @route('/')
    @route('/hello/<name>')
    def greet(name='Stranger'):
        return template('Hello {{name}}, how are you?', name=name)
    
    @route('/wiki/<pagename>')
    def show_wiki_page(pagename):
        return template('Now you see the {{pagename}} wiki.', pagename=pagename)
    
    @route('/<action>/<user>')          #バッティング
    def user_api(action, user):
        return template('{{user}} {{action}}', user=user, action=action)
    
    @route('/object/<id:int>')
    def callback(id):
        assert isinstance(id, int)      #間違っている時にエラーを返す
        return str(isinstance(id, int)) #True, Falseを返す
    
    @route('/show/<name:re:[a-z]+')
    def callback(name):
        assert name.isalpha()
    
    @route('/static/<path:path>')
    def callback(path):
        return static_file(path,null)
    
    run(host='localhost', port=8080, reloader=True, debug=True)
    
[/code]

* * *

この投稿は @metropolis
さんの[コメント](https://ja.stackoverflow.com/questions/30372/#comment29364_30372)などを元に編集し、[コミュニティWiki](https://ja.meta.stackoverflow.com/q/1583)として投稿しました。


CC BY-SA 4.0
2021-01-15T05:10:01.760
73311
2021-01-15T05:10:01.760
9820
30372
answer