完整代码:
https://github.com/yangzhezjgs/Light/tree/master/webapp
jinjia2是什么?
Jinja2是Python下一个被广泛应用的模版引擎,他的设计思想来源于Django的模板引擎,并扩展了其语法和一系列强大的功能。其中最显著的一个是增加了沙箱执行功能和可选的自动转义功能,这对大多应用的安全性来说是非常重要的。
他基于unicode并能在python2.4之后的版本运行,包括python3。
添加了render_template函数,提供了模板支持,并进行了重构将处理函数和wsgi接口分开。
为什么需要模板引擎?
通过向模板中填充数据来生成动态页面,就可以通过不同组合生成不同的页面,使得代码重用性和灵活性大大提高。
代码:
import os
from werkzeug.wrappers import BaseRequest, BaseResponse
from werkzeug.exceptions import HTTPException, MethodNotAllowed, \
NotImplemented, NotFound
from werkzeug.serving import run_simple
from jinja2 import Environment, FileSystemLoader
def render_template(template_name, **context):
template_path = os.path.join(os.getcwd(), 'templates')
jinja_env = Environment(loader=FileSystemLoader(template_path),autoescape=True)
text = jinja_env.get_template(template_name).render(context)
return text
class Request(BaseRequest):
"""Encapsulates a request."""
class Response(BaseResponse):
"""Encapsulates a response."""
class View(object):
"""Baseclass for our views."""
def __init__(self):
self.methods_meta = {
'GET': self.GET,
'POST': self.POST,
'PUT': self.PUT,
'DELETE': self.DELETE,
}
def GET(self):
raise MethodNotAllowed()
POST = DELETE = PUT = GET
def HEAD(self):
return self.GET()
def dispatch_request(self, request, *args, **options):
if request.method in self.methods_meta:
return self.methods_meta[request.method](request, *args, **options)
else:
return '<h1>Unknown or unsupported require method</h1>'
@classmethod
def get_func(cls):
def func(*args, **kwargs):
obj = func.view_class()
return obj.dispatch_request(*args, **kwargs)
func.view_class = cls
return func
class WebApp(object):
"""
An interface to a web.py like application. It works like the web.run
function in web.py
"""
def __init__(self):
self.url_map = {}
def wsgi_app(self,environ,start_response):
req = Request(environ)
response = self.dispatch_request(req)
if response:
response = Response(response,content_type='text/html; charset=UTF-8')
else:
response = Response('<h1>404 Source Not Found<h1>', content_type='text/html; charset=UTF-8', status=404)
return response(environ, start_response)
def __call__(self,environ,start_response):
return self.wsgi_app(environ,start_response)
def dispatch_request(self,req):
try:
url = req.path
view = self.url_map.get(url, None)
if view:
response = view(req)
else:
response = None
except HTTPException as e:
response = e
return response
def add_url_rule(self,urls):
for url in urls:
self.url_map[url['url']] = url['view'].get_func()
def run(self, port=5000, ip='', debug=False):
run_simple(ip, port, self, use_debugger=debug, use_reloader=True)
测试代码:
from webapp import WebApp,View,render_template
class Index(View):
def GET(self,request):
return render_template("index.html",name="world")
class Test(View):
def GET(self,request):
return "test"
urls = [
{
'url':'/',
'view':Index
},
{
'url':'/test',
'view':Test
}
]
app = WebApp()
app.add_url_rule(urls)
app.run()
templates/index.html
<h1>hello {{ name }}</h1>
效果: