zoukankan      html  css  js  c++  java
  • 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中,函数也是对象,对象和函数的区别并不显著。
    

      

      

  • 相关阅读:
    套接字编程,创建套接字socket
    网络编程基本原理
    进一步学习的书籍
    C# 基础备忘录
    二进制转文件以及文件压缩和解压缩
    使用用WCF中的双工(Duplex)模式将广告图片推送到每个Winform客户端机子上
    C#两个日期范围内的间隔
    C#中XML文档注释编译DLL引用到其它项目
    用T4模版生成对应数据库表的实体类
    lodop打印控件需要开启的几个计算机服务
  • 原文地址:https://www.cnblogs.com/Gaoqiking/p/10751335.html
Copyright © 2011-2022 走看看