DIY Python フレームワーク: 4. パス マッピング-1

単純なパス マッピングのみを考慮すると、いくつかの単純な正規表現が関係します。web.py のマッピングはリストを使用しており、各マッピングには 2 つの要素があります。コードを記述しやすいように、辞書を直接使用してください。コンテンツを開始する前に、いくつかの下調べをしましょう。

グローバルトリック

名前を付けたら、同じ名前のクラスがあるかどうかを確認してインスタンスを作成するにはどうすればよいですか?

import inspect

class TestA:
    def info(self):
        print('TestA')
    
def create(cls_name):
    g = globals()
    if cls_name in g:
        if inspect.isclass(g[cls_name]):
            return g[cls_name]()
    return None
    
ta = create('TestA')
tb = create('TestB')
ta.info()
print(tb)

Python では、クラスを定義して変数を追加するたびに、名前マッピングがグローバルに追加され、実行中の検索が容易になります。globals() を使用して、現在のコードに含まれるすべての名前と対応するオブジェクトを返します。したがって、 g['TestA']() と TestA() は同等です。そして、そのようなクラスはグローバルに存在しないため、TestB は None を返します。Inspection.isclass は変数がクラスであるかどうかを判定します。

URL解析

URL の標準形式は次のとおりです。Python の urllib ライブラリには、URL を迅速に解析するのに役立つ urlparse 関数が用意されています。

from urllib.parse import urlparse

url = 'http://www.xyz.com/abc/def;params?a=1&b=2&c=zzz#fragment'
p = urlparse(url)
print('scheme: ' + p.scheme)
print('netloc: ' + p.netloc)
print('path: ' + p.path)
print('params: ' + p.params)
print('query: ' + p.query)
print('fragment: ' + p.fragment)

 実行後は以下のように各パーツの情報が確認できます。

スキーム: http
netloc: www.xyz.com
パス: /abc/def
params: params
クエリ: a=1&b=2&c=zzz
フラグメント: フラグメント

正規表現一致

マッピングでは、パス マッチングのルールを定義し、具体的な実装では正規表現マッチングを使用します。web.py は効率を念頭に置いて設計されており、正規表現のマッチングをキャッシュします。具体的な実装は、ソース コード utils.py の Memoize クラスの実装で確認できます。ここでコードを単純化して、マッピングが ('^/index/name=(.*)&age=(.*)$', 'index') であり、現在入力されているパスが /index/name=ZV&age= であると仮定します。 18. 次のコードを通じてパスのマッチングを完了し、パラメーターを取得できます。

import re

class proxy:
    def __init__(self):
        self.match = None
        
    def __call__(self, match):
        self.match = match
        
def match(pattern, cls, value):
    p = proxy()
    compiled = re.compile(pattern)
    compiled.sub(p.__call__, value)
    cls, args = compiled.sub(cls, value), p.match
    return cls, args

if __name__ == '__main__':
    pattern = '/index/name/(.*)/age/(.*)'
    cls = 'index'
    value = '/index/name/ZV/age/18'
    cls, args = match(pattern, cls, value)
    print('Class:' + cls)
    if args:
        print('Args: ' + str([x for x in args.groups()]))

プログラムの実行結果:

クラス:インデックス
引数: ['ZV', '18']

これらの前提条件を理解した後、次の章で URL マッピング機能をフレームワークに追加します。

おすすめ

転載: blog.csdn.net/panda_lin/article/details/121693377