利用python的werkzeug寫的一個簡單的web框架,實作的功能有路由、各種HTTP方法、獲取客戶端傳遞的引數、代碼實時更新、模板引擎等,默認運行在127.0.0.1:5000上,操作模式也盡量向Flask靠攏,
import os from werkzeug.wrappers import Response, Request from werkzeug.serving import run_simple from werkzeug.routing import Map, Rule from werkzeug.exceptions import HTTPException, MethodNotAllowed from jinja2 import Environment, FileSystemLoader """ 定義一個Route類來管理url_map以及請求方式. 并加入__call__函式,使得可以直接對物件使用諸如Route()的操作. __call__函式中再使用裝飾器,這樣操作起來就和Flask一樣了 endpoint使用了對應的函式名. 從引數中獲取并儲存HTTP請求方法 """ class Route: def __init__(self): self.url_map = Map([]) self.endpoint_dict = {} self.methods_list = [] def __call__(self, rules,**kwargs): def wrapper(func): endpoint = func.__name__ self.url_map.add(Rule(rules, endpoint=endpoint)) self.endpoint_dict[endpoint] = func for key, value in kwargs.items(): if key == 'methods': self.methods_list = value return func return wrapper """ 定義了一個Application類 """ class Application(): def __init__(self): self.route = Route()#呼叫Route類 def __call__(self, environ, start_response): return self.application(environ, start_response) def run(self,host='127.0.0.1',port=5000,use_reloader=False):#用run_simple定義一個運行方法,可以自行選擇host和port以及是否進行實時更新代碼 run_simple(host, port, self, use_reloader=use_reloader) return def url_for(self,a):#回傳對應endpoint的url return self.urls.build(a) @Request.application def application(self, request): self.urls = self.bind_to_environ(request.environ) if request.method not in self.route.methods_list:#如果請求方法不正確則回傳MethodNotAllowed頁面 raise MethodNotAllowed try: endpoint, args = self.urls.match()#匹配請求引數 except HTTPException as e:#如果找不到url則回傳404 return e return Response(self.route.endpoint_dict[endpoint](request), mimetype='text/html')#回應請求,型別為'text/html' def bind_to_environ(self, env):#用以系結環境 return self.route.url_map.bind_to_environ(env) def getdata(self, arg, *instead):#獲取資料,如果沒有對應資料則回傳instead的值,類似flask的request.get('ex1','ex2') values = self.urls.match()[1] try: return values[arg] except: if instead[0] or instead[0] == '': values[arg] = instead[0] return values[arg] """ 依然是render_template 將templates檔案夾系結了jinja2的環境 通過獲取templates里html檔案的文本并通過Application里方法回應到客戶端 """ def render_template(template_name, **context): template_path = os.path.join(os.getcwd(), 'templates') jinja_env = Environment(loader=FileSystemLoader(template_path), autoescape=True) t = jinja_env.get_template(template_name) return t.render(context)
測驗代碼
from web import Application,render_template app = Application() @app.route('/',methods=['GET','POST']) def index(request):#這里的func需要帶一個request引數 id = app.getdata('id','abaa')#因為方法都封裝在Application里了,所以使用的時候都得帶上app.的前綴 pid = app.getdata('id','') print('id =',id) print('pid =',pid) return render_template('index.html',aa=id,cc='ddd',list=['1','3','2','4']) @app.route('/id/<int:id>') def id(request): id = app.getdata('id') return ("id is: {id}").format(id=id) @app.route('/current_url') def current_url(request): url = app.url_for("test") return "current url is {url}".format(url=url) @app.route('/testurl') def test(request): return render_template('index.html') app.run(debug=True)
測驗模板
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Title</title> </head> <body> hhhhh<br> <h2>jinja2測驗</h2> {{aa}}<h1>{{cc}}</h1> {% if cc %} {{aa}}<h3>{{list}}</h3> {%endif%} {%for i in list %} {{i}}<br> {%endfor%} </body> </html>
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/143491.html
標籤:Python
上一篇:alglib相關求助
