Python的WEB框架有

Django、Tornado、Flask 等多种

,Django相较与其他WEB框架其优势为:

大而全,框架本身集成了ORM、模型绑定、模板引擎、缓存、Session等诸多功能。

3、WEB框架

MVC
Model     View           Controller
数据库     模板文件        业务处理

MTV
Model Template View
数据库 模板文件 业务处理

(对于所有的Web应用,本质上其实就是一个socket服务端,用户的浏览器其实就是一个socket客户端。)

  1. #!/usr/bin/env python
  2. #coding:utf-8
  3.  
  4. import socket
  5.  
  6. def handle_request(client):
  7. buf = client.recv(1024)
  8. client.send("HTTP/1.1 200 OK\r\n\r\n")
  9. client.send("Hello, Seven")
  10.  
  11. def main():
  12. sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
  13. sock.bind(('localhost',8000))
  14. sock.listen(5)
  15.  
  16. while True:
  17. connection, address = sock.accept()
  18. handle_request(connection)
  19. connection.close()
  20.  
  21. if __name__ == '__main__':
  22. main()
  23.  
  24. 上述通过socket来实现其本质,而对于真实开发中的web程序来说分两部分
    服务端和应用程序,
    1、服务器程序负责对socket服务器进行封装,并在请求到来时,对请求的各种数据进行整理
    2、应用程序则负责具体的逻辑处理。
    为了方便应用程序的开发,就出现了众多的Web框架,例如:DjangoFlaskweb.py 等。不同的框架有不同的开发方式,
    但是无论如何,开发出的应用程序都要和服务器程序配合,才能为用户提供服务。这样,服务器程序就需要为不同的框架提供不同的支持。
    这样混乱的局面无论对于服务器还是框架,都是不好的。对服务器来说,需要支持各种不同框架,对框架来说,只有支持它的服务器才能被开发出的应用使用
    。这时候,标准化就变得尤为重要。我们可以设立一个标准,只要服务器程序支持这个标准,框架也支持这个标准,那么他们就可以配合使用。一旦标准确定
    ,双方各自实现。这样,服务器可以支持更多支持标准的框架,框架也可以使用更多支持标准的服务器。

WSGI(Web Server Gateway Interface)是一种规范,它定义了使用

python编写的web app与web server之间接口格式,实现web app与web server间的解耦。

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

  1. from wsgiref.simple_server import make_server
  2.  
  3. def RunServer(environ, start_response):
  4. start_response('200 OK', [('Content-Type', 'text/html')])
  5. return [bytes('<h1>Hello, web!</h1>', encoding='utf-8'), ]
  6.  
  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.  
  5. def index():
  6. return 'index'
  7.  
  8. def login():
  9. return 'login'
  10.  
  11. def routers():
  12.  
  13. urlpatterns = (
  14. ('/index/',index),
  15. ('/login/',login),
  16. )
  17.  
  18. return urlpatterns
  19.  
  20. def RunServer(environ, start_response):
  21. start_response('200 OK', [('Content-Type', 'text/html')])
  22. url = environ['PATH_INFO']
  23. urlpatterns = routers()
  24. func = None
  25. for item in urlpatterns:
  26. if item[0] == url:
  27. func = item[1]
  28. break
  29. if func:
  30. return func()
  31. else:
  32. return '404 not found'
  33.  
  34. if __name__ == '__main__':
  35. httpd = make_server('', 8000, RunServer)
  36. print "Serving HTTP on port 8000..."
  37. httpd.serve_forever()

2、模板引擎

在上一步骤中,对于所有的login、index均返回给用户浏览器一个简单的字符串,在现实的Web请求中一般会返回一个复杂的符合HTML规则的字符串,所以我们一般将要返回给用户的HTML写在指定文件中,然后再返回。如:

  1. <!DOCTYPE html>
  2. <html>
  3. <head lang="en">
  4. <meta charset="UTF-8">
  5. <title></title>
  6. </head>
  7. <body>
  8. <h1>Index</h1>
  9.  
  10. </body>
  11. </html>
  1. <!DOCTYPE html>
  2. <html>
  3. <head lang="en">
  4. <meta charset="UTF-8">
  5. <title></title>
  6. </head>
  7. <body>
  8. <form>
  9. <input type="text" />
  10. <input type="text" />
  11. <input type="submit" />
  12. </form>
  13. </body>
  14. </html>

对于上述代码,虽然可以返回给用户HTML的内容以现实复杂的页面,但是还是存在问题:如何给用户返回动态内容?

  • 自定义一套特殊的语法,进行替换
  • 使用开源工具jinja2,遵循其指定语
  1. <!DOCTYPE html>
  2. <html>
  3. <head lang="en">
  4. <meta charset="UTF-8">
  5. <title></title>
  6. </head>
  7. <body>
  8. <h1>{{name}}</h1>
  9.  
  10. <ul>
  11. {% for item in user_list %}
  12. <li>{{item}}</li>
  13. {% endfor %}
  14. </ul>
  15.  
  16. </body>
  17. </html>
  18.  
  1. #!/usr/bin/env python
  2. # -*- coding:utf-8 -*-
  3.  
  4. from wsgiref.simple_server import make_server
  5. from jinja2 import Template
  6.  
  7. def index():
  8. # return 'index'
  9.  
  10. # template = Template('Hello {{ name }}!')
  11. # result = template.render(name='John Doe')
  12.  
  13. f = open('index.html')
  14. result = f.read()
  15. template = Template(result)
  16. data = template.render(name='John Doe', user_list=['alex', 'eric'])
  17. return data.encode('utf-8')
  18.  
  19. def login():
  20. # return 'login'
  21. f = open('login.html')
  22. data = f.read()
  23. return data
  24.  
  25. def routers():
  26.  
  27. urlpatterns = (
  28. ('/index/', index),
  29. ('/login/', login),
  30. )
  31.  
  32. return urlpatterns
  33.  
  34. def run_server(environ, start_response):
  35. start_response('200 OK', [('Content-Type', 'text/html')])
  36. url = environ['PATH_INFO']
  37. urlpatterns = routers()
  38. func = None
  39. for item in urlpatterns:
  40. if item[0] == url:
  41. func = item[1]
  42. break
  43. if func:
  44. return func()
  45. else:
  46. return '404 not found'
  47.  
  48. if __name__ == '__main__':
  49. httpd = make_server('', 8000, run_server)
  50. print "Serving HTTP on port 8000..."
  51. httpd.serve_forever()
  1.  
  1.  

Django学习篇(web框架的由来)的更多相关文章

  1. 第一篇web框架

    第一篇web框架 http协议 web应用和web框架 主 文 http协议 HTTP简介 HTTP协议是Hyper Text Transfer Protocol(超文本传输协议)的缩写,是用于从万维 ...

  2. [python][django学习篇][3]创建django web的数据库模型

    推荐学习博客:http://pythonzh.cn/post/8/ 博客或者web界面向用户展示内容,它需要从某个地方获取博客内容或者web界面内容,才能够展示出来.通常来说:某个地方指的就是数据库 ...

  3. [Python笔记]第十六篇:web框架之Tornado

    Tornado是一个基于python的web框架,xxxxx 安装 python -m pip install tornado 第一个Tornado程序 安装完毕我们就可以新建一个app.py文件,放 ...

  4. Python学习-day18 Web框架

    众所周知,对于所有的Web应用,本质上其实就是一个socket服务端,用户的浏览器其实就是一个socket客户端. ? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 1 ...

  5. Django基础一Web框架的本质

    我们可以这样理解:所有的Web应用本质上就是一个socket服务端,而用户的浏览器就是一个socket客户端,基于请求做出响应,客户都先请求,服务端做出对应的响应,按照http协议的请求协议发送请求, ...

  6. python django基础一web框架的本质

    web框架的本质就是一个socket服务端,而浏览器就是一个socker客户端,基于请求做出相应,客户端先请求,服务器做出对应响应 按照http协议的请求发送,服务器按照http协议来相应,这样的通信 ...

  7. golang基础学习及web框架

    golang的web框架 web框架百花齐放:对比 Go Web 编程 Go Web Examples Golang 适合做 Web 开发吗? beego beego简介 go-restful gol ...

  8. 【Python之路】第十六篇--Web框架之Tornado

    概述 Tornado 是 FriendFeed 使用的可扩展的非阻塞式 web 服务器及其相关工具的开源版本.这个 Web 框架看起来有些像web.py 或者 Google 的 webapp,不过为了 ...

  9. 【Python之路】第十五篇--Web框架

    Web框架本质 众所周知,对于所有的Web应用,本质上其实就是一个socket服务端,用户的浏览器其实就是一个socket客户端. #!/usr/bin/env python #coding:utf- ...

随机推荐

  1. il8n国际化

    il8n国际化 支持多国语言的web应用,根据客户端系统的语言类型返回对应的界面 方案 为每种语言提供一套相应的资源文件,并以规范化命名的方式保存在特定的目录中,由系统自动根据客户端语言选择适合的资源 ...

  2. [20180806]tune2fs调整保留块百分比.txt

    [20180806]tune2fs调整保留块百分比.txt --//生产系统一台dg磁盘空间满了.我前一阵子已经将*convert参数修改,增加磁盘,但是这个分区里面的数据文件还可以增长,这样依旧存- ...

  3. sql server 转置 和实现随机分配和一串代码的含义拼在一行

    1.sql server 转置很容易搜到方法,一般需要手动写转置的列项,如果多时会比较烦,下面试了省事的方法: --案例需求数据 ----方法一:if object_id('tempdb.dbo.#s ...

  4. windows10不能获取有效IP的问题

    最近我的windows10系统一直不能有效获取IP地址(无论有线还是无线),但手工设置IP后又能正常上网,所以怀疑是某个服务未启动的原因. 查了一下百度,发现还真是,现将解决方案记录如下: 1.打开系 ...

  5. Win7系统system进程句柄数一直增加解决方案

    公司内部最近有个服务端的同事电脑句柄数一开机就一直增加 一台Windows7x64系统16G 其实物理内存使用情况在开机后并没有太大的变化,但虚拟内存占用明显在不停的增加. 我通过“任务管理器”一直也 ...

  6. lvm管理卷之缩减卷大小

    最近刚刚装好了一个系统,但是因为没有分好区,导致home分区过大,所以想把home分区的一大半移动到根分区里面. 1.先说一下我的环境. 安装的是centos6版本的系统,使用的默认文件系统是ext4 ...

  7. mysqld_safe启动服务器总结

    mysqld_safe是服务端工具,用于启动mysqld,并且是mysqld的守护进程,mysqld_safe加&在后台运行$BASEDIR/bin/mysqld_safe & 优点就 ...

  8. Activiti工作流与BPMN2.0规范

    本章内容根据BPMN2.0规范的分类划分为以下部分: 1.启动与结束事件(event) 2.顺序流(Sequence Flow) 3.任务(Task) 4.网关(Gateway) 5.子流程(Subp ...

  9. selenium 初探

    # -*- coding:utf-8 -*- from selenium import webdriver driver = webdriver.Firefox() # 打开firefox浏览器 dr ...

  10. CentOS 7下安装Python3.6.4

    CentOS 7下安装Python3.5 •安装python3.6可能使用的依赖 yum install openssl-devel bzip2-devel expat-devel gdbm-deve ...