Python日常笔记(37) - 路由(route)

路由(route)

简单来说路由就是一个映射器,利用一个给定的参数来映射到对应的指定路径或者执行函数等等。
改版miniweb服务器
来把前面一章节自定义的一个mini框架改成路由的版本。
mini_frame.py代码:

import os
import re
from pymysql import *

# 测试使用
print(os.path.abspath(__file__))  # 显示当前文件的地址
print(os.getcwd())  # 显示主程序入口的地址

# 定义一个字典来储存方法的引用,key=访问路径,value=函数引用
route_dict = dict()


def route(url):
    def set_func(func):
        # 将所有函数的引用保存到字典中,后续调用
        route_dict[url] = func

        def call_func(*args, **kwargs):
            return func(*args, **kwargs)

        return call_func

    return set_func


@route("/index.py")
def index(info):
    with open(info["template"] + "/index.html", encoding="utf-8") as f:
        content = f.read()

        # 链接数据库
        con = connect(host='localhost', port=3306, database='stock_db', user='root', password='root', charset='utf8')
        cursor = con.cursor()
        sql = "select * from info;"
        cursor.execute(sql)
        # 查询数据
        data_from_mysql = cursor.fetchall()

        html = ""
        # 拼接html
        for tr_data in data_from_mysql:
            print(tr_data)
            html += "<tr>"
            for td_data in tr_data:
                html += f"<td>{td_data}</td>"

            html += """<td>
                        <input type="button" value="添加" id="toAdd" name="toAdd" systemidvaule="000007">
                    </td>
                    """
            html += "</tr>"
        print(html)
        content = re.sub(r"\{%content%\}", html, content)
        cursor.close()
        con.close()

        return content


@route("/center.py")
def center(info):
    with open(info["template"] + "/center.html", encoding="utf-8") as f:
        content = f.read()

        # 链接数据库
        con = connect(host='localhost', port=3306, database='stock_db', user='root', password='root', charset='utf8')
        cursor = con.cursor()
        sql = "select i.code,i.short,i.chg,i.turnover,i.price,i.highs,f.note_info from info as i inner join focus as f on i.id=f.info_id;"
        cursor.execute(sql)
        # 查询数据
        data_from_mysql = cursor.fetchall()

        html = ""
        # 拼接html
        for tr_data in data_from_mysql:
            print(tr_data)
            html += "<tr>"
            for td_data in tr_data:
                html += f"<td>{td_data}</td>"

            html += """<td>
                            <a type="button" class="btn btn-default btn-xs" href="/update/300268.html"> <span class="glyphicon glyphicon-star" aria-hidden="true"></span> 修改 </a>
                        </td>
                        <td>
                            <input type="button" value="删除" id="toDel" name="toDel" systemidvaule="300268">
                        </td>
                    """
            html += "</tr>"
        print(html)
        content = re.sub(r"\{%content%\}", html, content)
        cursor.close()
        con.close()
        return content


def application(environ, start_response):
    start_response('200 OK', [('Content-Type', 'text/html;charset=utf-8')])
    filename = environ["PATH_INFO"]
    # 这里就直接使用文件名来通过字典映射出对应的函数引用执行函数
    try:
        return route_dict[filename](environ["info"])
    except Exception as error:
        print(error)
        return "没有找到该资源"

源码查看地址:https://gitee.com/duchaochen/pythonnotecode.git

作者:阿超
原创公众号:『Python日常笔记』,专注于 Python爬虫等技术栈和有益的程序人生,会将一些平时的日常笔记都慢慢整理起来,也期待你的关注和阿超一起学习,公众号回复【1024】优质资源。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章