フラスコフレームワークの実装クラス
テンプレート
<!DOCTYPE HTML > < HTML LANG = "EN" のxmlns = "http://www.w3.org/1999/html" > < 頭> < メタ文字コード= "UTF-8" > < タイトル>タイトル</ タイトル> < / ヘッド> < ボディ> < BR >显示数据< \ BR > {{ID}}、{{名前}}、{{年齢}} </ ボディ> </ HTML >
インポート再 から IoがインポートたStringIO、BytesIOの D = { ' ID ':5、' 名称':' トム'、' 年齢':20 } クラステンプレート: _pattern = ' {{([-ZA-Z0-9 _] + )}} ' 正規表現 = re.compile(_pattern) @classmethod DEF レンダリング(CLS、テンプレート、データ:辞書): HTML = たStringIO() (オープンテンプレート、符号付き = 'UTF-8 ' )、F等の: のための行にF: 開始 = 0 改行 = '' のための整合にcls.regex.finditer(ライン): 改行 + = 行の[開始:matcher.start()] プリント(整合、整合.group(1 )) キー = matcher.group(1 ) TMP = data.get(キー、'' ) 改行 + = STR(TMP) 開始 =matcher.end() 他: 改行 + = 行[スタート:] html.write(改行) プリント(html.getvalue()) html.close()#模板渲染 ファイル名= ' index.htmlを' Template.render(ファイル名、 D)
Jinja2の
文書 の公式ウェブサイト:HTTPS //jinja.palletsprojects.com/en/2.10.x/ 中国:HTTP //docs.jinkan.org/docs/jinja2/ インストール Jinja2のインストールPIPを PIPがmarkupsafeをインストール
テンプレートの構築
<!DOCTYPE HTML > < HTML のlang = "EN" > < ヘッド> < メタのcharset = "UTF-8" > < タイトル> Magedu </ タイトル> </ ヘッド> < ボディ> < UL > 显示数据 IDの{%、名前、ユーザリストの%で年齢} < リチウム> {{loop.index}}、{{ID}}、{{名前}}、{{年齢}} </ 李> {%ENDFOR%} </ UL > ボディ> </ HTML >
################# ###################以下ローディングテンプレートコード例 から Jinja2のインポート環境、PackageLoader、FileSystemLoaderの #ENV =環境(ローダー= PackageLoader( 'webarch'、 'テンプレート'))#のバッグローダー ENV =環境(= FileSystemLoaderローダー(' webarch /テンプレート' )) テンプレート = env.get_template(' index.htmlを' ) のUserList = [ ( 3、' TPM '、20である)、 ( 4、' のHet '、23である)、 ( 7、'ASDF '23 )、 ( 1、' aasf '18 ) ] D = { ' ユーザーリスト':ユーザーリスト、' USERCOUNT ' :LEN(ユーザリスト)} プリント(template.render(** D))
############### テンプレートモジュールを提供################## template.py から Jinja2のインポート環境、PackageLoader、FileSystemLoader ENV =環境(ローダ= PackageLoader(' webarch '、' テンプレート')) #のバッグローダー #ENV =環境(ローダ= FileSystemLoader( 'webarch /テンプレート'))#ファイルシステムローダー DEF レンダリング(名前、データ:辞書): " 「」 テンプレートのレンダリング :PARAM名:このテンプレートのファイル名を検索するためのテンプレートディレクトリ のparamデータ:データディクショナリ :リターン:HTML文字列 「」 " テンプレート = env.get_template(名)#の検索モジュールインデックス。HTML リターン template.render(**データ)
############## コード増加################## #は、オブジェクトの作成ルータ IDX = ルーター() のPy =ルータ(' / Pythonの' ) ユーザー =ルータ(' ユーザー/ ' ) #の登録 App.register(IDX、Pyを) App.register(ユーザー) py.register_preinterceptor(IP) @ user.get(R ' ^ /?$ " ) DEFのuserhandler(リクエスト): のUserList = [ ( 3、' TPM '、20である)、 ( 4、' ヘット'23 )、 ( 7 ' ASDF '23 )、 ( 1、' aasf '18 ) ] D = { ' ユーザーリスト':ユーザーリスト、' USERCOUNT ' :LEN(ユーザーリスト)が} を返す(レンダリング' index.htmlを"、D)
モジュラー
1 。パケットwebarch作成 2 このパッケージモジュールに.template.pyを 3 。のAppクラスにWeb.py新しいモジュール、AttrDict、ルータ、 4ルート定義、登録コード、ハンドラの定義をwebarchへ/ __init__のの.pyを中 サーバコードの開始の内部に配置されapp.pyを構築するためのプロジェクトのルートディレクトリの下の5、。
拦截器interceptor
#加入拦截器功能的方式 1、App和Router类直接加入 把拦截器的相关方法、属性分别添加到相关类中 实现简单 2、Mixin App和Router类都需要这个拦截器功能,可以使用Mixin方式、将属性、方法组合进来,但是,App类拦截器适合使用第二种,但是Router的拦截器是每个实例不一样的,所以使用第一种方式实现
def fn(request:Request) -> Request: pass
def fn(request:Request,response:Response) -> Response: pass
IP拦截
#创建Router对象 idx = Router() py = Router('/python') user = Router('/user') #注册 App.register(idx,py) App.register(user) #ip拦截 def ip(request:Request): print(request.remote_addr,'~~~~~') print(type(request.remote_addr)) if request.remote_addr.startswith('192.'): return request else: return None #返回None将截断请求 py.register_preinterceptor(ip)
Json支持
@py.get(r'^/{id}$') def pythonhandler(request): userlist = [ (3, 'tom', 20), (5, 'jerry', 16), (6, 'sam', 23), (8, 'kevin', 18) ] d = {'userlist':userlist,'usercount':len(userlist)} res = Response(json=d) return res
总结
完整代码
。。。