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

  

  

python web开发 编写web框架的更多相关文章

  1. 关于web开发前端h5框架的选择

    关于web开发前端h5框架的选择 看了很多移动版框架都是基于app混合式开发的,不是单独h5网站的基于h5开发的web框架从组件丰富度,兼容性,相关教程来说bootstrap还是最好的react和vu ...

  2. PHP做Web开发的MVC框架(Smarty使用说明 )

    PHP做Web开发的MVC框架(Smarty使用说明 ) 一.Smarty简明教程 1.安装演示 下载最新版本的Smarty-3.1.12,然后解压下载的文件.接下来演示Smarty自带的demo例子 ...

  3. Python Web 开发的十个框架【转载】

    Python 是一门动态.面向对象语言.其最初就是作为一门面向对象语言设计的,并且在后期又加入了一些更高级的特性.除了语言本身的设计目的之外,Python标准 库也是值得大家称赞的,Python甚至还 ...

  4. 六十一 Web开发 使用Web框架

    由于用Python开发一个Web框架十分容易,所以Python有上百个开源的Web框架.这里我们先不讨论各种Web框架的优缺点,直接选择一个比较流行的Web框架——Flask来使用. 用Flask编写 ...

  5. web开发-MVC IoC 框架(转)

    随着Web应用的商业逻辑包含逐渐复杂的公式分析计算.决策支持等,使客户机越 来越不堪重负,因此将系统的商业分离出来.单独形成一部分,这样三层结构产生了. 其中‘层’是逻辑上的划分. 三层体系结构是将整 ...

  6. 一个C#开发编写Java框架的心路历程

    前言 这一篇絮絮叨叨,逻辑不太清晰的编写Java框架的的一个过程,主要描述我作为一个java初学者,在编写Java框架时的一些心得感悟. 因为我是C#的开发者,所以,在编写Java框架时,或多或少会带 ...

  7. Python Web开发:使用Django框架创建HolleWorld项目

    开发环境搭建 Python环境安装 下载地址:https://www.python.org/downloads// Django安装 打开Windows CMD输入pip install django ...

  8. python web开发——c2 flask框架和flask_script

    重定向/error 通过flask中的redirect方法和自定义的newpath函数.redirect_demo函数实现重定向: #coding:utf-8 from flask import Fl ...

  9. 15款加速 Web 开发的 JavaScript 框架

    JavaScript 可以通过多种方式来创建交互式的网站和 Web 应用程序.利用 JavaScript,可以让你移动 HTML 元素,创建各种各样的自定义动画,给你的访问者更好的终端用户体验. 对于 ...

随机推荐

  1. sudo详细介绍

    目录参数所在/etc/sudoers 1.Host_Alias定义主机别名 例:Host_Alias   FILESERVERS = fs1,fs2 #注意“=”号两边要有空格隔开 ***由于现今li ...

  2. 在 CentOS7 上配置 nginx 虚拟主机

    创建配置文件保存目录,其中 sites-available 用来实际保存配置文件,sites-enabled 用来保存符号链接 : mkdir /etc/nginx/sites-available m ...

  3. 关于python从Oracle中读取数据中文全是问号的问题

    import os os.environ['NLS_LANG'] = 'SIMPLIFIED CHINESE_CHINA.UTF8' 问题搞定

  4. 06006_redis数据存储类型——String

    1.概述 (1)字符串类型是Redis中最为基础的数据存储类型,它在Redis中是二进制安全的,这意味着该类型可以接受任何格式的数据,如JPEG图像数据或Json对象描述信息等: (2)在Redis中 ...

  5. oracle rac下调节redo log file 文件大小

    rac下调节redo log file 文件大小 (1)查看当前日志信息: select * from v$logfile; (步骤2中得路径能够在这里MEMBER列看到,redo文件名称自己命名.比 ...

  6. 学艺不精而惭愧--论C++模板类的使用

    自己断断续续地使用C++也有一段时间了.有些时候产生了自满的情绪.觉得自己对C++的语言特性已经知道的几乎相同了,在语法方面没有什么难倒我的地方了,如今所要做的是依据实际问题编敲代码,问题的难点在于算 ...

  7. 菜鸟nginx源代码剖析数据结构篇(九) 内存池ngx_pool_t

    菜鸟nginx源代码剖析数据结构篇(九) 内存池ngx_pool_t Author:Echo Chen(陈斌) Email:chenb19870707@gmail.com Blog:Blog.csdn ...

  8. HDU 1015.Safecracker【暴力枚举】【8月17】

    Safecracker Problem Description === Op tech briefing, 2002/11/02 06:42 CST ===  "The item is lo ...

  9. 谷歌浏览器 —— 快捷键(vimium:像使用 vim 一样操作当前页面)

    Chrome 键盘快捷键 拷贝当前页面内的某链接: 首先输入 y(进入 yank 模式),输入 f,为当前页面内的全部超链接编号,然后输入待拷贝的链接编号,即可将该链接复制到粘贴板: 1. 使用 vi ...

  10. Oracle 11G R2 RAC中的scan ip 的用途和基本原理

    Oracle 11G R2 RAC增加了scan ip功能,在11.2之前,client链接数据库的时候要用vip,假如你的cluster有4个节点,那么客户端的tnsnames.ora中就对应有四个 ...