web框架的本质

众所周知,对于所有的Web应用,本质上其实就是一个socket服务端,用户的浏览器其实就是一个socket客户端。
  1. #!/usr/bin/env python
  2. #coding:utf-8
  3. import socket
  4. def handle_request(client):
  5. buf = client.recv(1024)
  6. client.send("HTTP/1.1 200 OK\r\n\r\n")
  7. client.send("Hello, Seven")
  8. def main():
  9. sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
  10. sock.bind(('localhost',8000))
  11. sock.listen(5)
  12. while True:
  13. connection, address = sock.accept()
  14. handle_request(connection)
  15. connection.close()
  16. if __name__ == '__main__':
  17. main()

上述通过socket来实现了其本质,而对于真实开发中的python web程序来说,一般会分为两部分:服务器程序和应用程序。服务器程序负责对socket服务器进行封装,并在请求到来时,对请求的各种数据进行整理。应用程序则负责具体的逻辑处理。为了方便应用程序的开发,就出现了众多的Web框架,例如:Django、Flask、web.py 等。不同的框架有不同的开发方式,但是无论如何,开发出的应用程序都要和服务器程序配合,才能为用户提供服务。这样,服务器程序就需要为不同的框架提供不同的支持。这样混乱的局面无论对于服务器还是框架,都是不好的。对服务器来说,需要支持各种不同框架,对框架来说,只有支持它的服务器才能被开发出的应用使用。这时候,标准化就变得尤为重要。我们可以设立一个标准,只要服务器程序支持这个标准,框架也支持这个标准,那么他们就可以配合使用。一旦标准确定,双方各自实现。这样,服务器可以支持更多支持标准的框架,框架也可以使用更多支持标准的服务器。

WSGI(Web Server Gateway Interface)是一种规范,它定义了使用python编写的web app与web server之间接口格式,实现web app与web server间的解耦。

python标准库提供的独立WSGI服务器称为wsgiref。

  1. #!/usr/bin/env python
  2. #coding:utf-8
  3. from wsgiref.simple_server import make_server
  4. def RunServer(environ, start_response):
  5. start_response('200 OK', [('Content-Type', 'text/html')])
  6. return '<h1>Hello, web!</h1>'
  7. if __name__ == '__main__':
  8. httpd = make_server('', 8000, RunServer)
  9. print "Serving HTTP on port 8000..."
  10. httpd.serve_forever()
 

自定义web框架

通过python标准库提供的wsgiref模块开发一个自己的Web框架。

  1. #!/usr/bin/env python
  2. #coding:utf-8
  3. from wsgiref.simple_server import make_server
  4. def index():
  5. return 'index'
  6. def login():
  7. return 'login'
  8. def routers():
  9. urlpatterns = (
  10. ('/index/',index),
  11. ('/login/',login),
  12. )
  13. return urlpatterns
  14. def RunServer(environ, start_response):
  15. start_response('200 OK', [('Content-Type', 'text/html')])
  16. url = environ['PATH_INFO']
  17. urlpatterns = routers()
  18. func = None
  19. for item in urlpatterns:
  20. if item[0] == url:
  21. func = item[1]
  22. break
  23. if func:
  24. return func()
  25. else:
  26. return '404 not found'
  27. if __name__ == '__main__':
  28. httpd = make_server('', 8000, RunServer)
  29. print "Serving HTTP on port 8000..."
  30. httpd.serve_forever()
 
       python中的WEB框架分为:即写Socket又写(处理请求)的WEB框架比如Tornado,
还有就是不写Socket然后自己写处理请求的WEB框架:Django

循序渐进Python3(十二) --0--  web之框架的更多相关文章

  1. 循序渐进Python3(二) -- 数据类型

    数据类型 一.数字(int) Python可以处理任意大小的正负整数,但是实际中跟我们计算机的内存有关,在32位机器上,整数的位数为32位,取值范围为 -2**31-2**31-1,在64位系统上,整 ...

  2. Python爬虫从入门到放弃(十二)之 Scrapy框架的架构和原理

    这一篇文章主要是为了对scrapy框架的工作流程以及各个组件功能的介绍 Scrapy目前已经可以很好的在python3上运行Scrapy使用了Twisted作为框架,Twisted有些特殊的地方是它是 ...

  3. python(十二)下:ORM框架SQLAlchemy使用学习

    此出处:http://blog.csdn.net/fgf00/article/details/52949973 本节内容 ORM介绍 sqlalchemy安装 sqlalchemy基本使用 多外键关联 ...

  4. 第十二章 WEB渗透

    Web技术发展 • 静态WEB• 动态WEB • 应用程序 • 数据库 • 每个人看到的内容不同 • 根据用户输入返回不同结果 WEB攻击面• Network• OS• WEB Server• App ...

  5. odoo10学习笔记十二:web controller

    转载请注明原文地址:https://www.cnblogs.com/ygj0930/p/11189332.html 一:路由 odoo.http.route(route=None, **kw) 装饰器 ...

  6. (十二) web服务与javaweb结合(3)

    一.需求 上一章节虽然将webservice和web项目绑定在了一起,但是还是不能共同一个端口,本章讲解webservice和web项目绑定且共同端口. 二.案例 2.1 创建web工程,并引入依赖 ...

  7. (十二)整合 Shiro 框架,实现用户权限管理

    整合 Shiro 框架,实现用户权限管理 1.Shiro简介 1.1 基础概念 1.2 核心角色 1.3 核心理念 2.SpringBoot整合Shiro 2.1 核心依赖 2.2 Shiro核心配置 ...

  8. 十二、持久层框架(MyBatis)

    一.PageHelper分页插件的使用 PageHelper是一款MyBatis的分页插件,只需要简单的配置,然后直接调用方法就可以. 1.配置PageHelper插件 在mybatis-config ...

  9. Appium+python自动化(四十二)-Appium自动化测试框架综合实践- 寿终正寝完结篇(超详解)

    1.简介 按照上一篇的计划,今天给小伙伴们分享执行测试用例,生成测试报告,以及自动化平台.今天这篇分享讲解完.Appium自动化测试框架就要告一段落了. 2.执行测试用例&报告生成 测试报告, ...

随机推荐

  1. 118、通过solid来定义不同边框的颜色,可以只定义一个边框的颜色

    以下是设置按钮的右边框和底边框颜色为红色,边框大小为3dp,如下图: 在drawable新建一个 buttonstyle.xml的文件,内容如下: <?xml version="1.0 ...

  2. Java 反射 getDeclareFields getModifiers setAccessible(true)

    示例代码: public static Map<String, Object> dtoToMap(Object obj, String pre,            String las ...

  3. mysql中的模糊查询

    转载自:http://www.letuknowit.com/archives/90/ MySQL中实现模糊查询有2种方式:一是用LIKE/NOT LIKE,二是用REGEXP/NOT REGEXP(或 ...

  4. jQuery String Functions

    In today's post, I have put together all jQuery String Functions. Well, I should say that these are ...

  5. shell中判读文件存在的方法

    单个文件较简单 if [[ -f filename ]]; then echo exist fi 文件存在并且有内容 if [[ -s filename ]]; then echo exist fi ...

  6. 安装boost库(Windows)

    1. 下载 官网:http://www.boost.org/ 主页:https://sourceforge.net/projects/boost/ 当前最新版:V1.61.0 2. 编译 首先,生成b ...

  7. 编译WebRTC遇到的问题总结

    唉,本人下载WebRTC的代码都用了几天,真的是惭愧,本来以为很简单的东西,没想到搞了这么久,在下载的过程中,心里骂了无数遍XXX,这鬼东西咋这么难搞.后来终于搞明白了为啥代码总是下载不了,然后又在心 ...

  8. php 正则表达式 将形如 "天," ,"安", "门" 转化为"天、安、门", (仅匹配汉字)

    #!/usr/bin/php<? $rows = file("illwods_deal1.txt"); $goalfile = fopen("illwods_res ...

  9. STL之序列容器deque

    首先看看deque的模板声明: template <class T,  class Alloc = allocator<T>>  // 原本还有个参数BufSize,现在新版本 ...

  10. linux expect命令使用入门

    expect的核心是spawn expect send set   spawn:spawn是进入expect环境后才可以执行的expect内部命令,相当于shell中的内置命令,通过它,调用需要执行的 ...