web框架之利用python的反射模拟小web框架(一)

本文探讨如何使用Python的反射机制来模拟构建一个小规模的Web框架。通过getattr、setattr、hasattr和delattr等反射函数,实现对Web框架中对象属性和方法的动态操作。在webdemo.py作为服务器入口,home.py作为后端控制模块,共同构建Web服务。同时,提到了视图部分(index.html)在框架中的作用。
摘要由CSDN通过智能技术生成

web框架之利用python的反射模拟小web框架(一)

关于反射函数:


getattr(object, name[,default])

获取对象object的属性或者方法,如果存在打印出来,如果不存在,打印出默认值,默认值可选。如果是返回的对象的方法,返回的是方法的引用名称(地址),如果需要调用这个方法,要在后面添加一对括号


setattr(object, name, values)

给对象的属性赋值,若属性不存在,先创建再赋值。只是在该对象的内存空间创建属性并且赋值。并且参数二参数必须是字符串,参数三还可以是lambda函数,相当于在这个对象的内存空间里添加一个函数名称为name的函数(name= lambda x : x+1)


hasattr(object, name)

判断一个容器(对象)里面是否有name属性或者name方法,返回BOOL值,有name特性返回True, 否则返回False。name必须为字符串


delattr(object, name)
删除object对象名为name的属性,name为字符串


关于反射的机制:

针对下面这个例子来说,首先import home,将model文件里的内容(函数名称,在没运行该函数前只是导入了函数名字,可以通过dir()查看,这些函数名字)导入到内存,而getattr,setattr,hasattr只是针对内存里的成员(函数名字)进行操作,也就是说如果用反射函数操作过的对象的内存名称空间在reload操作后,会被覆盖掉重新载入home,总而言之,反射函数操作的是容器在内存中的成员(例如的类属性的名字,对象属性的名字)


web服务器端入口(webdemo.py):

# _*_coding:utf-8_*_
from wsgiref.simple_server import make_server
import home


def RunServer(environ, start_response):
    start_response('200 OK',[('Content-Type','text/html')])
    url = environ['PATH_INFO']
    temp = url.split('/')[1]
    #temp是一个字符串
    is_exist = hasattr(home,temp)
    if is_exist:
        func = getattr(home,temp)
        #返回的只是在home对象的内存里的成员,即func属性的名称,由于该属性是个方法,所以调用时要加括号
        ret = func()
        return ret
    else:
        return '404 not found!!!'

if __name__ == '__main__':
    httpd = make_server('',8001,RunServer)
    print 'Serving HTTP on port 8000'
    httpd.serve_forever()

web后端控制模块(home.py):

# _*_coding:utf-8_*_


def index():
    with open('index.html') as f:
        str = f.readlines()
    return str

视图部分(index.html):

   <!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Test</title>
</head>
<body>
<h1>index</h1>
</body>
</html>
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

JaysenLeo

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值