mini-web框架-路由(支持正则)-url编码
2018-03-22 17:00
253 查看
mini web框架-路由功能(支持正则表达式参数)
dynamic/my_web.py
import pymysql import time import os import re template_root = "./templates" # 用来存放url路由映射 # url_route = { # "/index.py":index_func, # "/center.py":center_func # } g_url_route = dict() def route(url): def set_func(func): # 添加键值对,key是需要访问的url,value是当这个url需要访问的时候,需要调用的函数引用 g_url_route[url]=func def call_func(file_name): return func(file_name) return call_func return set_func @route(r"/index.html") def index(file_name, url=None): """返回index.html需要的页面内容""" # return "hahha" + os.getcwd() # for test 路径问题 try: file_name = file_name.replace(".py", ".html") f = open(template_root + file_name) except Exception as ret: return "%s" % ret else: content = f.read() f.close() # data_from_mysql = "暂时没有数据,请等待学习mysql吧,学习完mysql之后,这里就可以放入mysql查询到的数据了" db = pymysql.connect(host='localhost',port=3306,user='root',password='mysql',database='stock_db',charset='utf8') cursor = db.cursor() sql = """select * from info;""" cursor.execute(sql) data_from_mysql = cursor.fetchall() cursor.close() db.close() html_template = """ <tr> <td>%d</td> <td>%s</td> <td>%s</td> <td>%s</td> <td>%s</td> <td>%s</td> <td>%s</td> <td>%s</td> <td> <input type="button" value="添加" id="toAdd" name="toAdd" systemidvaule="%s"> </td> </tr>""" html = "" for info in data_from_mysql: html += html_template % (info[0], info[1], info[2], info[3], info[4], info[5], info[6], info[7], info[1]) content = re.sub(r"\{%content%\}", html, content) return content @route(r"/center.html") def center(file_name, url=None): """返回center.html需要的页面内容""" # return "hahha" + os.getcwd() # for test 路径问题 try: file_name = file_name.replace(".py", ".html") f = open(template_root + file_name) except Exception as ret: return "%s" % ret else: content = f.read() f.close() # data_from_mysql = "暂时没有数据,,,,~~~~(>_<)~~~~ " db = pymysql.connect(host='localhost',port=3306,user='root',password='mysql',database='stock_db',charset='utf8') cursor = db.cursor() sql = """select i.code,i.short,i.chg,i.turnover,i.price,i.highs,j.note_info from info as i inner join focus as j on i.id=j.info_id;""" cursor.execute(sql) data_from_mysql = cursor.fetchall() cursor.close() db.close() # 格式化输出请求的内容 html_template = """ <tr> <td>%s</td> <td>%s</td> <td>%s</td> <td>%s</td> <td>%s</td> <td>%s</td> <td>%s</td> <td> <a type="button" class="btn btn-default btn-xs" href="/update/%s.html"> <span class="glyphicon glyphicon-star" aria-hidden="true"></span> 修改 </a> </td> <td> <input type="button" value="删除" id="toDel" name="toDel" systemidvaule="%s"> </td> </tr> """ html = "" # 拼接请求的数据 for info in data_from_mysql: html += html_template % (info[0], info[1], info[2], info[3], info[4], info[5], info[6], info[0], info[0]) # 用查询出的数据替换模板中的占位符 content = re.sub(r"\{%content%\}", html, content) return content # ------- 添加 ------- @route(r"/update/(\d*)\.html") def update(file_name, url): """显示 更新页面的内容""" try: template_file_name = template_root + "/update.html" f = open(template_file_name) except Exception as ret: return "%s,,,没有找到%s" % (ret, template_file_name) else: content = f.read() f.close() ret = re.match(url, file_name) if ret: stock_code = ret.group(1) # 将提取到的股票编码返回到浏览器中,以检查是否能够正确的提取url的数据 return stock_code def application(environ, set_response_headers): status = '200 OK' response_headers = [('Content-Type', 'text/html')] set_response_headers(status, response_headers) file_name = environ['PATH_INFO'] try: for url, func in g_url_route.items(): print(url) ret = re.match(url, file_name) if ret: return func(file_name, url) break else: return "没有访问的页面--->%s" % file_name except Exception as ret: return "%s" % ret else: return str(environ) + '-----404--->%s\n'
g_url_route = dict()字典内存储着路由的映射
key:为正则表达式
value:为请求的信息,包含数据和模板文件
# 用来存放url路由映射 # url_route = { # "r'/index.py'":index', # "r'/center.py'":center, # "r'/update/(\d*)\.html':update # }
闭包与装饰器实现路由
def route(url): def set_func(func): # 添加键值对,key是需要访问的url,value是当这个url需要访问的时候,需要调用的函数引用 g_url_route[url]=func def call_func(file_name): return func(file_name) return call_func return set_func
装饰器支持正则表达式
@route('正则表达式')
...... @route(r"/update/(\d*)\.html") def update(file_name, url): ......
application()函数需要使用正则表达式分析服务器传递过来的请求,并调用相应的函数传递参数和返回值
...... for url, func in g_url_route.items(): ret = re.match(url, file_name) if ret: return func(file_name, url) ......
使用正则表达式匹配出的请求信息在数据库中查询动态数据,与模板文件拼接成响应体返回
...... """ SQL操作 """ for info in data_from_mysql: html += html_template content = re.sub(r"\{%content%\}", html, content) ......
mini-web框架-url编码
导入urllib包import urllib.parse # Python3 url编码 print(urllib.parse.quote("天安门")) # Python3 url解码 print(urllib.parse.unquote("%E5%A4%A9%E5%AE%89%E9%97%A8"))
浏览器url传值默认执行编码操作,所以web框架匹配出的数据需要解码才能使用
...... ret = re.match(url, file_name) if ret: stock_code = ret.group(1) stock_note_info = ret.group(2) stock_note_info = unquote(stock_note_info) ......
相关文章推荐
- Python高级 -- 12 mini_frame框架添加路由、路由支持正则、Log日志功能
- polaris: 一个用go实现的支持restful的web框架
- 装饰器实现Python web框架路由功能
- polaris: 一个用go实现的支持restful的web框架
- 在现有J2EE Web工程的基础上建立对BlazeDS通讯框架支持的3大步骤
- go web框架的路由分析
- python入门(二十六):基于反射模拟Web框架路由系统
- [笔记]架构探险-从零开始写JavaWeb框架-2.2. 之使框架具有aop特性-干货,让框架支持事务处理
- dotweb——go语言的一个微型web框架(三)路由注册
- 从支持异步并发编程的Web后端框架到数据存储服务的分布式一致性哈希路由
- hyk-proxy - 一个支持基于GAE/Seattle/PHP的web proxy框架 (A web proxy framework support implementations on GAE/Seattle/PHP , could be used to break some firewall) - Google Project Hosting
- .NET快速信息化系统开发框架 V3.2 -> Web 用户管理模块编辑界面-组织机构选择支持级联选择
- Router:一款单品、组件化、插件化全支持的路由框架
- 编写GO的WEB开发框架 (八): Session支持及自定义Session
- golang实战使用gin+xorm搭建go语言web框架restgo详解4 路由配置
- Web后台快速开发框架(支持.NET Core2.1,.NET452,.NET40)
- ssm框架中web.xml 中 设置是否启用异步支持 报错
- werkzeug实现简单Python web框架(4):添加orm支持
- day 021 mini_WEB框架_路由
- Golang Web 框架 Beego 路由设置 - 03