python/web框架

web框架

Web框架本质

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


1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

#!/usr/bin/env python

#coding:utf-8

  

import socket

  

def handle_request(client):

    buf = client.recv(1024)

    client.send("HTTP/1.1 200 OK\r\n\r\n")

    client.send("Hello, Seven")

  

def main():

    sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)

    sock.bind((‘localhost‘,8000))

    sock.listen(5)

  

    while True:

        connection, address = sock.accept()

        handle_request(connection)

        connection.close()

  

if __name__ == ‘__main__‘:

    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

2

3

4

5

6

7

8

9

10

11

12

from wsgiref.simple_server import make_server

 

 

def RunServer(environ, start_response):

    start_response(‘200 OK‘, [(‘Content-Type‘‘text/html‘)])

    return [bytes(‘<h1>Hello, web!</h1>‘, encoding=‘utf-8‘), ]

 

 

if __name__ == ‘__main__‘:

    httpd = make_server(‘‘, 8000, RunServer)

    print("Serving HTTP on port 8000...")

    httpd.serve_forever()

自定义Web框架

一、框架

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


1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

#!/usr/bin/env python

#coding:utf-8

from wsgiref.simple_server import make_server

 

def index():

    return ‘index‘

 

def login():

    return ‘login‘

 

def routers():

     

    urlpatterns = (

        (‘/index/‘,index),

        (‘/login/‘,login),

    )

     

    return urlpatterns

 

def RunServer(environ, start_response):

    start_response(‘200 OK‘, [(‘Content-Type‘‘text/html‘)])

    url = environ[‘PATH_INFO‘]

    urlpatterns = routers()

    func = None

    for item in urlpatterns:

        if item[0== url:

            func = item[1]

            break

    if func:

        return func()

    else:

        return ‘404 not found‘

     

if __name__ == ‘__main__‘:

    httpd = make_server(‘‘, 8000, RunServer)

    print "Serving HTTP on port 8000..."

    httpd.serve_forever()

2、模板引擎

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

 index.html

 login.html


1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

#!/usr/bin/env python

# -*- coding:utf-8 -*-

 

from wsgiref.simple_server import make_server

 

 

def index():

    # return ‘index‘

    = open(‘index.html‘)

    data = f.read()

    return data

 

 

def login():

    # return ‘login‘

    = open(‘login.html‘)

    data = f.read()

    return data

 

 

def routers():

 

    urlpatterns = (

        (‘/index/‘, index),

        (‘/login/‘, login),

    )

 

    return urlpatterns

 

 

def run_server(environ, start_response):

    start_response(‘200 OK‘, [(‘Content-Type‘‘text/html‘)])

    url = environ[‘PATH_INFO‘]

    urlpatterns = routers()

    func = None

    for item in urlpatterns:

        if item[0== url:

            func = item[1]

            break

    if func:

        return func()

    else:

        return ‘404 not found‘

 

 

if __name__ == ‘__main__‘:

    httpd = make_server(‘‘, 8000, run_server)

    print "Serving HTTP on port 8000..."

    httpd.serve_forever()

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

  • 自定义一套特殊的语法,进行替换
  • 使用开源工具jinja2,遵循其指定语法

 index.html


1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

#!/usr/bin/env python

# -*- coding:utf-8 -*-

 

from wsgiref.simple_server import make_server

from jinja2 import Template

 

 

def index():

    # return ‘index‘

 

    # template = Template(‘Hello {{ name }}!‘)

    # result = template.render(name=‘John Doe‘)

 

    = open(‘index.html‘)

    result = f.read()

    template = Template(result)

    data = template.render(name=‘John Doe‘, user_list=[‘alex‘‘eric‘])

    return data.encode(‘utf-8‘)

 

 

def login():

    # return ‘login‘

    = open(‘login.html‘)

    data = f.read()

    return data

 

 

def routers():

 

    urlpatterns = (

        (‘/index/‘, index),

        (‘/login/‘, login),

    )

 

    return urlpatterns

 

 

def run_server(environ, start_response):

    start_response(‘200 OK‘, [(‘Content-Type‘‘text/html‘)])

    url = environ[‘PATH_INFO‘]

    urlpatterns = routers()

    func = None

    for item in urlpatterns:

        if item[0== url:

            func = item[1]

            break

    if func:

        return func()

    else:

        return ‘404 not found‘

 

 

if __name__ == ‘__main__‘:

    httpd = make_server(‘‘, 8000, run_server)

    print "Serving HTTP on port 8000..."

    httpd.serve_forever()

遵循jinja2的语法规则,其内部会对指定的语法进行相应的替换,从而达到动态的返回内容,对于模板引擎的本质,参考另外一篇博客:http://www.cnblogs.com/wupeiqi/p/4592637.html

时间: 2024-08-11 05:44:07

python/web框架的相关文章

Python web 框架 Sanci如何使用?

本文和大家分享的主要是python web 框架 Sanci 相关内容,一起来看看吧,希望对大家学习python有所帮助. Sanic 是一个和类Flask 的基于Python3.5+的web框架,它编写的代码速度特别快. 除了像Flask 以外,Sanic 还支持以异步请求的方式处理请求.这意味着你可以使用新的 async/await 语法,编写非阻塞的快速的代码. 既然它说速度特别快,我们先看下官方提供的 基准测试结果. Sanic基准测试 这个测试的程序运行在 AWS 实例上,系统是Ubu

python web框架分析和学习篇_彭友

分析篇: 刚好到网上搜到了一篇<浅谈Python web框架>,里面系统的分析了五种主流的Python框架,现在python的主流框架有Django.Pylons&TurboGears&repose.bfg.Tornado&web.py&Bottle&Flask和Quixote.它从宏观角度分析了这五种框架的优劣,看完之后我们决定选择Django,因为: Django: 概述:可谓是python框架里面最大的一家,它是里面文档最完善.市场占有率最高.招聘

Python Web框架之Django初探(一)

Python Web框架之Django初探 Django是一个开放源代码的Web应用框架,由Python写成.采用了MVC的框架模式,即模型M,视图V和控制器C.它最初是被开发来用于管理劳伦斯出版集团旗下的一些以新闻内容为主的网站的,即是CMS(内容管理系统)软件.并于2005年7月在BSD许可证下发布.这套框架是以比利时的吉普赛爵士吉他手Django Reinhardt来命名的. Django可以运行在Apache,Nginx上,也可以运行在支持WSGI,FastCGI的服务器上.支持多种数据

微型 Python Web 框架 Bottle

Bottle 是一个非常小巧但高效的微型 Python Web 框架, 它被设计为仅仅只有一个文件的Python模块, 并且除Python标准库外, 它不依赖于任何第三方模块. 路由(Routing): 将请求映射到函数, 可以创建十分优雅的 URL 模板(Templates): Pythonic 并且快速的 Python 内置模板引擎, 同时还支持 mako, jinja2, cheetah 等第三方模板引擎 工具集(Utilites): 快速的读取 form 数据, 上传文件, 访问 coo

浅谈五大Python Web框架

http://www.csdn.net/article/2011-02-17/292058 导读:作者飞龙写了一篇<浅谈Python Web框架>,文中他介绍了几个Python Web框架和自己对选择框架的分析.在他看来,用Django来快速开发一些Web运用是很不错的选择.以下是文章内容: 说到Web Framework,Ruby的世界Rails一统江湖,而Python则是一个百花齐放的世界,各种micro-framework.framework不可胜数,不完全列表见: http://wik

异步非阻塞IO的Python Web框架--Tornado

Tornado的全称是Torado Web Server,从名字上就可知它可用作Web服务器,但同时它也是一个Python Web的开发框架.最初是在FriendFeed公司的网站上使用,FaceBook收购之后便进行了开源. 作为Web框架,是一个轻量级的Web框架,类似于另一个Python web 框架Web.py,其拥有异步非阻塞IO的处理方式. 作为Web服务器,Tornado有较为出色的抗负载能力,官方用nginx反向代理的方式部署Tornado和其它Python web应用框架进行对

微型 Python Web 框架: Bottle

微型 Python Web 框架: Bottle 在 19/09/11 07:04 PM 由 COSTONY 发表 Bottle 是一个非常小巧但高效的微型 Python Web 框架,它被设计为仅仅只有一个文件的Python模块,并且除Python标准库外,它不依赖于任何第三方模块. 路由(Routing):将请求映射到函数,可以创建十分优雅的 URL 模板(Templates):Pythonic 并且快速的 Python 内置模板引擎,同时还支持 mako, jinja2, cheetah

Python Web框架Tornado的异步处理代码示例

1. What is Tornado Tornado是一个轻量级但高性能的Python web框架,与另一个流行的Python web框架Django相比,tornado不提供操作数据库的ORM接口及严格的MVC开发模式,但可以提供基本的web server功能,故它是轻量级的:它借助non-blocking and event-driven的I/O模型(epoll或kqueue)实现了一套异步网络库,故它是高性能的. Tornado的轻量级+高性能特性使得它特别适用于提供web api的场合,

浅谈Python web框架

一.Python web框架 Web Framework,Ruby的世界Rails一统江湖,而Python则是一个百花齐放的世界,各种micro-framework.framework不可胜数,不完全列表见: 官网相关的链接:http://wiki.python.org/moin/WebFrameworks 虽然另一大脚本语言PHP也有不少框架,但远没有Python这么夸张,也正是因为Python Web Framework(Python Web开发框架,以下简称Python框架)太多,所以在P

Python Web框架Tornado的异步处理代码演示样例

1. What is Tornado Tornado是一个轻量级但高性能的Python web框架,与还有一个流行的Python web框架Django相比.tornado不提供操作数据库的ORM接口及严格的MVC开发模式,但能够提供主要的web server功能.故它是轻量级的:它借助non-blocking and event-driven的I/O模型(epoll或kqueue)实现了一套异步网络库,故它是高性能的. Tornado的轻量级+高性能特性使得它特别适用于提供web api的场合