python web开发 编写web框架
参考链接:https://www.liaoxuefeng.com/wiki/0014316089557264a6b348958f449949df42a6d3a2e542c000/001432339008728d0ddbe19ee594980be3f0644a9371894000
解释:https://blog.csdn.net/qq_38801354/article/details/73008111
重写web框架的好处
1)可以直接这样写
#处理带参数的URL/blog/{id}可以这么写: @get('/blog/{id}') def get_blog(id): pass #处理query_string参数可以通过关键字参数**kw或者命名关键字参数接收:(这个还不太懂) @get('/api/comments') def api_comments(*, page='1'): pass #对于函数的返回值,不一定是web.Response对象,可以是str、bytes或dict。 #所以如果希望渲染模板,我们可以这么返回一个dict: return { '__template__': 'index.html', 'data': '...' }
而不是需要使用aiohttp时必须的一些步骤
#直接使用aiohttp import asyncio from aiohttp import web async def index(request): await asyncio.sleep(0.5) return web.Response(body=b'<h1>Index</h1>') #--------------------------------------------------看这个 async def hello(request):#使用async关键字添加协程装饰器 await asyncio.sleep(0.5) #对request参数进行操作,获取响应的操作 text = '<h1>hello, %s!</h1>' % request.match_info['name'] #构造reponse对象并返回 return web.Response(body=text.encode('utf-8')) async def init(loop): app = web.Application(loop=loop) app.router.add_route('GET', '/', index) app.router.add_route('GET', '/hello/{name}', hello) srv = await loop.create_server(app.make_handler(), '127.0.0.1', 8000) print('Server started at http://127.0.0.1:8000...') return srv loop = asyncio.get_event_loop() loop.run_until_complete(init(loop)) loop.run_forever()
所以,自定义的web框架能封装上面的一些步骤,让你只需要编写函数就好了
2)可以对模块进行单独测试,不然,需要你模拟一个浏览器请求即request才可以实现
开始编写Web框架
第一步:以aiohttp框架为基础去编写
@get和@post
Http定义了与服务器交互的不同方法,最基本的方法有4种,分别是GET,POST,PUT,DELETE。URL全称是资源描述符,我们可以这样认为:一个URL地址,它用于描述一个网络上的资源,而HTTP中的GET,POST,PUT,DELETE就对应着对这个资源的查,改,增,删4个操作。 建议: 1、get方式的安全性较Post方式要差些,包含机密信息的话,建议用Post数据提交方式; 2、在做数据查询时,建议用Get方式;而在做数据添加、修改或删除时,建议用Post方式;
把一个函数映射(相当于绑定)为一个URL处理函数
第二步:定义RequestHandler
使用者编写的URL处理函数不一定是一个coroutine,因此我们用RequestHandler()来封装一个URL处理函数(不懂)
RequestHandler 目的就是从URL函数中分析其需要接收的参数,从request中获取必要的参数,调用URL函数。
RequestHandler
是一个类,创建的时候定义了 __call__() 方法,因此可以将其实例视为函数。
关于Call方法的作用:https://www.cnblogs.com/superxuezhazha/p/5793536.html
#一个类实例也可以变成一个可调用对象,只需要实现一个特殊方法__call__()。 #我们把 Person 类变成一个可调用对象: class Person(object): def __init__(self, name, gender): self.name = name self.gender = gender def __call__(self, friend): print 'My name is %s...' % self.name print 'My friend is %s...' % friend #现在可以对 Person 实例直接调用: >>> p = Person('Bob', 'male')#__init__中传入的参数是干这样的事情的,类似于初始化 >>> p('Tim')#然后用实例来调用 My name is Bob... My friend is Tim... #单看 p('Tim') 你无法确定 p 是一个函数还是一个类实例,所以,在Python中,函数也是对象,对象和函数的区别并不显著。