六狼论坛

 找回密码
 立即注册

QQ登录

只需一步,快速开始

新浪微博账号登陆

只需一步,快速开始

搜索
查看: 64|回复: 0

在Python3.0中处理web请求6-简单的模板引擎

[复制链接]

升级  36%

30

主题

30

主题

30

主题

秀才

Rank: 2

积分
104
 楼主| 发表于 2013-1-15 02:58:57 | 显示全部楼层 |阅读模式
今天放假在家,外面又在下雨,闲来无事,写了个简单的模板引擎,其实也不算什么模板,只是把嵌在html里的python代码解释成嵌入在python里的html代码,仅此而已,代码也很简陋,纯粹个人娱乐
以下是示例代码:
from web.render import SimpleHTMLRenderfrom socketserver import ThreadingMixInfrom wsgiref.simple_server import WSGIServerrender = SimpleHTMLRender("F:/test/")class ThreadingWSGIServer(ThreadingMixIn,WSGIServer):    passdef application(env,start_response):    start_response("200 OK",[("Content-Type","text/html;charset=UTF-8")])    return render.hello(name="phyeas")if __name__=="__main__":    from wsgiref.simple_server import make_server    httpd=make_server('',8080,application,server_class=ThreadingWSGIServer)    print("Http Service on port 8080....")    httpd.handle_request() 需要在F:/test目录下放置一个叫hello.html的文件。文件内容是:
<%def render(name):%>Hello <%=name%>! 当然了,路径和文件名可以自定
输出结果就是 Hello phyeas!(当然可以改成你的名字啦)
运行后将生成一个hello.py文件和hello.pyc文件,前面是由SimpleHTMLRender生成的,后面是导入到程序里python自动编译的结果
核心代码:
def render(self, fpath, *args, **kwargs):        if os.path.exists(fpath[0:-5]+".py") or os.path.exists(fpath[0:-5]+".pyc"):            if os.path.dirname(fpath) not in sys.path:                sys.path.append(os.path.dirname(fpath))            py_f_path=fpath[0:-5]+".py" if os.path.exists(fpath[0:-5]+".py") else fpath[0:-5]+".pyc"            create_new_file=False            if os.stat(fpath).st_mtime>os.stat(py_f_path).st_ctime:#如果html文件的修改时间大于python文件的创建时间,就重新创建                with open(fpath,encoding="UTF-8") as f:                    parseHTML2Py(f)                create_new_file=True            fname=os.path.split(fpath)[1][:-5]#获取文件名             import_statement="import "+fname            if import_statement not in imports or create_new_file:#创建新文件时重新import                exec(import_statement)#导入模块            if fname+"_real_func" not in self.render_functions or create_new_file:#创建新文件时重新绑定函数                self.render_functions[fname+"_real_func"]=eval(fname+".render")#获取出函数绑定            return getattr(self,fname+"_real_func")(*args,**kwargs)        else:            with open(fpath,encoding="UTF-8") as f:                parseHTML2Py(f)            return self.render(fpath,*args,**kwargs) 
您需要登录后才可以回帖 登录 | 立即注册 新浪微博账号登陆

本版积分规则

快速回复 返回顶部 返回列表