플라스크 프레임 워크 구현 클래스
주형
<! 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 = ' {{([A-ZA-Z0-9 _] + )}} ' 정규식 = re.compile (_pattern) @classmethod DEF 렌더링 (CLS, 템플릿 데이터 : 딕셔너리) : HTML = StringIO () (개방 템플릿 인코딩 = 'UTF-8 " ) F :로 위한 라인 에서 : F 시작 = 0 개행 = ' 에 대한 정규 의 : cls.regex.finditer (라인) 개행 + = 라인 [START : matcher.start을 ()] 인쇄 (정합, 정합을 .group (1 )) 키 = matcher.group (1 ) TMP = data.get (키 ' ) 개행 + = STR은 (TMP)이 시작 =matcher.end () 밖의 : 개행 + = 라인 [START :] html.write (개행) 인쇄 (html.getvalue ()) html.close () #模板渲染 파일명 = ' index.html을 ' Template.render (파일명 디)
jinja2
문서화 공식 웹 사이트 HTTPS를 : //jinja.palletsprojects.com/en/2.10.x/ 중국어 HTTP : //docs.jinkan.org/docs/jinja2/ 설치가 jinja2 설치마다 동시 PIP가 markupsafe 설치
템플릿 건설
<! DOCTYPE HTML > < HTML LANG = "EN" > < 선두 > < 메타 캐릭터 = "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 ' 헷 ' , 23이다 ) ( . 7 '자위대 ' , 23 ), ( 1 ' aasf ' , 18 ) ] D = { ' 사용자 목록 ' : 사용자 목록, ' USERCOUNT ' : LEN (사용자 목록)} 인쇄 (template.render (** d))
############### 템플릿 모듈 ################## template.py 제공 로부터 jinja2 오기 환경 PackageLoader, FileSystemLoader의 ENV = 환경 (로더 = PackageLoader ( ' webarch ' , ' 템플릿 ' )) #의 가방 로더 # ENV = 환경 (로더 = FileSystemLoader ( 'webarch / 템플릿')) # 파일 시스템 로더 DEF 렌더링 (이름, 데이터 : 딕셔너리) : " "" 템플릿 렌더링 : 매개 변수 이름 :이 템플릿의 파일 이름을 검색 할 수있는 템플릿 디렉토리 PARAM 데이터 : 데이터 사전 : 반환 : HTML 문자열 "" " 템플릿 = env.get_template (이름) #의 검색 모듈 인덱스입니다.HTML 반환 template.render (** 데이터)
############## 코드가 증가 ################## #은 객체 생성 라우터 IDX = 라우터 () Py를 = 라우터 ( ' / 파이썬 ' ) 사용자 = 라우터 ( ' 사용자 / ' ) #의 등록 App.register (IDX, Py를) App.register (사용자) py.register_preinterceptor (IP) @ user.get (R ' ^ /? $ ' ) DEF의 userhandler ( 요청) 되는 UserList = [ ( . 3 ' TPM ' , 20이다 ), ( . 4 ' 헤트' , 23 ), ( 7 ' 자위대 ' , 23 ), ( 1 ' aasf ' , 18 ) ] D = { ' 사용자 목록 ' : 사용자 목록, ' USERCOUNT ' : LEN (사용자 목록)를} 리턴 렌더링 ( ' index.html을 ' , d)
모듈 형
1 . 패킷 생성 webarch 2 패키지 모듈에 .template.py을 3 . Web.py 새로운 모듈 AttrDict, 라우터, 애플리케이션 클래스되는 4 행 정의, 등록 코드 webarch 핸들러로 정의 / __init__의 평에서 프로젝트의 루트 디렉토리 아래 5. 서버 코드가 시작 내부에 배치 app.py을 구축한다.
拦截器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
总结
完整代码
。。。