c-bata / webframework-in-python

"How to write WSGI WEB Framework" talked at PyConJP 2016
https://c-bata.github.io/webframework-in-python/
25 stars 3 forks source link

Router#match()がおかしい(インデントその他) #8

Closed kwatch closed 6 years ago

kwatch commented 6 years ago

https://c-bata.link/webframework-in-python/routing.html#router のコードはインデントがおかしいです。おそらくタブを使ってしまったのだと思います。

### before
    def match(self, method, path):
        for r in filter(lambda x: x['method'] == method.lower(), self.routes):
            matched = re.compile(r['path']).match(path)
         if matched:
             kwargs = matched.groupdict()
             return r, kwargs
     return http404, {}

### after
    def match(self, method, path):
        for r in filter(lambda x: x['method'] == method.lower(), self.routes):
            matched = re.compile(r['path']).match(path)
            if matched:
                kwargs = matched.groupdict()
                return r, kwargs
        return http404, {}

そのほか気づいた点です。

### after
    def match(self, method, path):
        method = method.lower()
        http = http404
        for r in self.routes:
            matched = re.match(r['path'], path)
            if matched:
                http = http405
                if r['method'] == method:
                    kwargs = matched.groupdict()
                    return r['callback'], kwargs
        return http, {}
c-bata commented 6 years ago

お、確認しますね。

実はこの補足資料、途中で執筆に飽きてとりあえず雑にかきあげて放置していたものだったんですが、最近何故かはてぶが伸びたみたいなので雑な説明とか間違いがないか見直してちょうど修正しておこうかと思っていたところでした。なのでとてもありがたいです。

c-bata commented 6 years ago

ご指摘いただいた通りですね。ありがとうございました。

できれば正規表現のコンパイルはroute()の中で行い、match()の中ではしないほうがいいでしょう。

おそらくお気づきだとは思うのですが、このあたりはあくまで解説目的のコードなのでシンプルさをとって対応しなかったという事情もあります。 ここはおそらく今後も今のまま(Router#add()メソッドではcompileしない方針)にすると思います。 と思っていたんですが、コードの長さ自体はそれほど影響がないしこれぐらいは対象の聴き手レベルを考えるとこれぐらいはやっちゃっていい気がしてきました。

c-bata commented 6 years ago

https://github.com/c-bata/webframework-in-python/commit/28364d9e92fd16dbe1d7ab2d60ad6e7c6e400553 にてルーティングの説明を修正しました