Python从零开始编写轻量级Web框架(2)

编写一个轻量级的Web应用框架

最近阅读了Flask的源码,弄懂了原理之后就想尝试来实现自己的一个Web框架。

因为大部分的实现思路都参照Flask0.1版本,也就是最初版本的思路。所用的基本库是werkzeug

框架的完整代码都放在了Github上,之后会继续更新:https://github.com/jyz0309/WebFrame
求star,球球了T_T

在完成了框架的最基本的GET、POST之后,我们开始编写自己的数据库ORM,目前我只写了支持Mysql的ORM,并且暂时只支持增删改查的最基本的功能,使用pymysql作为底层库。
首先,先定义数据库的连接,这个很简单,直接封装一个connect()函数即可。当然也可以像我一样,在创建类的时候直接连接:

    def __init__(self,name='test',table_name='sqltest',host='localhost',user='******',password='******'):
        self.name = name
        self.table_name = table_name
        self.con = pymysql.connect(host=host,user=user,password=password,database=self.name)
        self.cursor = self.con.cursor()

测试可以连接成功后,接下来的工作就是定义数据库要操作的表的属性,在这里定义了一个类Field来表示表的列名,详细原因在后面说明,首先来看看最基本的增加操作:

    def insert(self,**kwargs):
        #cursor = self.cursor
        condition = ''
        for key in kwargs:
            condition += str(kwargs[key])+','
        condition = condition.rstrip(',') # 处理参数字典,然后插入sql语句中
        sql = "INSERT INTO "+self.table_name+" VALUES ("+condition+");"
        try:
            # 尝试
            self.cursor.execute(sql)
            self.con.commit()
        except:
            # 发出错误
            raise Exception

增加操作是最基础的操作,而且没有对数据库表进行读操作的需求,所以写起来较为简单,基本操作就是通过**kwargs将参数变为元组或者字典,然后对其进行处理,插入到sql语句中执行。
接下来是查询操作,查询函数因为需要将条件写入到函数的参数里,就像这样:

search(x<=1,y==1)

所以需要将表的属性的类Field的运算符重载,也就是__eq__、__lt__、__gt__、__le__、__ge__、__ne__这几个,他们分别对应的是==,<=,>=,<,>,!=这几个符号,这也是为什么要用将表的列名使用类来定义:

class Field(object):
    def isNum(self,value):
        try:
            value + 1
        except TypeError:
            return False
        else:
            return True

    def __init__(self,name):
        self.name = name

    def __eq__(self, other):
        if isinstance(other,str):
            return str(self.name)+'=\''+str(other)+'\''
        else:
            if other == None:
                return str(self.name)+'='+str('null')
            return str(self.name)+'='+str(other)

    def __lt__(self, other):
        if self.isNum(other):
            return str(self.name)+'<'+str(other)
        else:
            raise TypeError

    def __gt__(self, other):
        if self.isNum(other):
            return str(self.name)+'>'+str(other)
        else:
            raise TypeError

    def __le__(self,other):
        if self.isNum(other):
            return str(self.name)+'<='+str(other)
        else:
            raise TypeError

    def __ge__(self,other):
        if self.isNum(other):
            return str(self.name)+'>='+str(other)
        else:
            raise TypeError

    def __ne__(self, other):
        if isinstance(other,str):
            return str(self.name)+'!=\''+str(other)+'\''
        else:
            if other == None:
                return str(self.name)+'='+str('null')
            return str(self.name)+'!='+str(other)

这是类中的运算符重载。
接下来是查询操作的函数:

    def search(self,*args):
        condition = ''
        for i in args:
            condition += i+','
        condition = condition.rstrip(',')
        sql = 'SELECT * FROM '+self.table_name+' WHERE ('+condition+');'
        self.cursor.execute(sql)
        result = self.cursor.fetchall()
        return result

有了查询操作之后,更新和删除操作也就迎刃而解,完整代码在我的GitHub上,GitHub地址在文章开头,各位给个star吧T T

你可能感兴趣的:(Python)