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中,函数也是对象,对象和函数的区别并不显著。

  

  

猜你喜欢

转载自www.cnblogs.com/Gaoqiking/p/10751335.html