Python 第五阶段 学习记录之--- Web框架

什么是web服务器的原理是什么

Web框架本质

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

#!/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 from wsgiref.simple_server import make_server
 2
 3
 4 def RunServer(environ, start_response):
 5     start_response(‘200 OK‘, [(‘Content-Type‘, ‘text/html‘)])
 6     return [bytes(‘<h1>Hello, web!</h1>‘, encoding=‘utf-8‘), ]
 7
 8
 9 if __name__ == ‘__main__‘:
10     httpd = make_server(‘‘, 8000, RunServer)
11     print("Serving HTTP on port 8000...")
12     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写在指定文件中,然后再返回。如:

<!DOCTYPE html>
<html>
<head lang="en">
    <meta charset="UTF-8">
    <title></title>
</head>
<body>
    <h1>Index</h1>

</body>
</html>
#!/usr/bin/env python
# -*- coding:utf-8 -*-

from wsgiref.simple_server import make_server

def index():
    # return ‘index‘
    f = open(‘index.html‘)
    data = f.read()
    return data

def login():
    # return ‘login‘
    f = 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,遵循其指定语法

 

<!DOCTYPE html>
<html>
<head lang="en">
    <meta charset="UTF-8">
    <title></title>
</head>
<body>
    <h1>{{name}}</h1>

    <ul>
        {% for item in user_list %}
        <li>{{item}}</li>
        {% endfor %}
    </ul>

</body>
</html>

index.html

 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
 8 def index():
 9     # return ‘index‘
10
11     # template = Template(‘Hello {{ name }}!‘)
12     # result = template.render(name=‘John Doe‘)
13
14     f = open(‘index.html‘)
15     result = f.read()
16     template = Template(result)
17     data = template.render(name=‘John Doe‘, user_list=[‘alex‘, ‘eric‘])
18     return data.encode(‘utf-8‘)
19
20
21 def login():
22     # return ‘login‘
23     f = open(‘login.html‘)
24     data = f.read()
25     return data
26
27
28 def routers():
29
30     urlpatterns = (
31         (‘/index/‘, index),
32         (‘/login/‘, login),
33     )
34
35     return urlpatterns
36
37
38 def run_server(environ, start_response):
39     start_response(‘200 OK‘, [(‘Content-Type‘, ‘text/html‘)])
40     url = environ[‘PATH_INFO‘]
41     urlpatterns = routers()
42     func = None
43     for item in urlpatterns:
44         if item[0] == url:
45             func = item[1]
46             break
47     if func:
48         return func()
49     else:
50         return ‘404 not found‘
51
52
53 if __name__ == ‘__main__‘:
54     httpd = make_server(‘‘, 8000, run_server)
55     print "Serving HTTP on port 8000..."
56     httpd.serve_forever()

动态内容

遵循jinja2的语法规则,其内部会对指定的语法进行相应的替换,从而达到动态的返回内容,对于模板引擎的本质那又是什么?

** 下回分解

时间: 2024-10-19 02:22:20

Python 第五阶段 学习记录之--- Web框架的相关文章

Python 第五阶段 学习记录之---Django 基础

Python的WEB框架有Django.Tornado.Flask 等多种,Django相较与其他WEB框架其优势为:大而全,框架本身集成了ORM.模型绑定.模板引擎.缓存.Session等诸多功能. 基本配置 一.创建django程序 终端命令:django-admin startproject sitename IDE创建Django程序时,本质上都是自动执行上述命令 其他常用命令: python manage.py runserver 0.0.0.0 python manage.py st

Python 第五阶段 学习记录之----rabbmit

消息服务器rabbmit RabbitMQ 消息队列 python里有两个Q, threading queue.不同线程间数据交互 进程Queue: 不同进程间交互这个说法是错误的. 这个是用于父进程与子进程间交互.或者同属于同一父进程下多个子进程进行交互. 两个python程序的进程间是无法通信的. 各个独立进程间通信: QQ 要发送消息给 world.1.通过socket,这个需要自己去写很多东西(沾包.收到的是什么需要返回的又是什么--) .2.消息队列, 那两个不同的程序要通信.两台机器

Python 第八阶段 学习记录之---算法

算法(Algorithm): 一个计算过程, 解决问题的方法 1.递归的两个特点 - 调用自身 - 结束条件 时间复杂度 - 时间复杂度是用来估计算法运行时间的一个式子(单位) - 一般来说,时间复杂度高的算法比复杂度低的算法快空间复杂度 用来评估算法内存占用大小的一个式子 列表查找: 从列表中查找指定元素 输入:无序 输出:有序顺序查找: 从列表第一个元素开始,顺序进行搜索,直到找到为止. 二分查找: 从有序列表的候选区data[0:n]开始,通过对待查找的值与候选区中间值的比较,可以使候选区

关于在学习python爬虫时的学习记录

最近学习python3爬虫,看的是这位博主的博客,不得不说,是真的厉害,通俗易懂^?_?^ 我要学习的还有很多-从基本的python知识,我就被难倒了- 哎,记录下我的盲点- 花了近一个钟头测试出来的结果. 在爬取相关的html时,text ≠ text[0] 后者是正确的.我一直以为不加的效果也是一样的结果,在我理解看来就是从头开始的,即从0到尾的所有相关的内容,实际上我的理解与相关的python基础不谋而和,可能是爬虫就需要如此的?我就默认好了- 在python中的方法后面的()是不可省去的

Web2py是一个用Python语言编写的免费的开源Web框架

Zope 2是一款基于Python的Web应用框架,是所有Python Web应用程序.工具的鼻祖,是Python家族一个强有力的分支.Zope 2的"对象发布"系统非常适合面向对象开发方法,并且可以减轻开发者的学习曲线,还可以帮助你发现应用程序里一些不好的功能. Web2py是一个用Python语言编写的免费的开源Web框架,旨在敏捷快速的开发Web应用,具有快速.可扩展.安全以及可移植的数据库驱动的应用,遵循LGPLv3开源协议. Web2py提供一站式的解决方案,整个开发过程都可

python学习笔记-Day17 - web框架

web服务器和web客户端之间的网络通信,本质上是 socket的通信, 服务器端运行的是socketServer 客户端运行的是socketClient. 对于python web程序来说,一般来说会分为两部分,服务器程序\应用程序,  (jsp好像也是这样的,让我想起了java的war包,不是太了解,只知道这些war包可以组成jsp上的应用). 服务器程序:负责对socket服务器进行封装,在请求到来的时候,对请求进行整理, 应用程序   : 负责具体的业务逻辑处理, 为了方便应用程序的开发

python学习之路web框架

WEB框架的本质 python的WEB框架分为两大类: 1.自己写socket,自己处理请求 2.基于wsgi(Web Server Gateway Interface WEB服务网关接口),自己处理请求 众所周知,对于所有的Web应用,本质上其实就是一个socket服务端,用户的浏览器其实就是一个socket客户端. 看下面的代码是WEB最本质的WEB框架(自己写的socket,自己处理的请求) #!/usr/bin/env python #coding:utf-8 import socket

Django学习篇(web框架的由来)

Python的WEB框架有 Django.Tornado.Flask 等多种 ,Django相较与其他WEB框架其优势为: 大而全,框架本身集成了ORM.模型绑定.模板引擎.缓存.Session等诸多功能. 基本模式:M    V     C (对于所有的Web应用,本质上其实就是一个socket服务端,用户的浏览器其实就是一个socket客户端.) #!/usr/bin/env python #coding:utf-8 import socket def handle_request(clie

Python实现简易HTTP服务器与MINI WEB框架(利用WSGI实现服务器与框架解耦)

本文描述如果简单实现自定义Web服务器与自定义简易框架,并且不断进行版本迭代,从而清晰的展现服务器与Web框架之间是如何结合.如何配合工作的.以及WSGI是什么. 一.选取一个自定义的服务器版本 参照 https://www.cnblogs.com/leokale-zz/p/11957768.html 中的各种服务器实现版本,我们选择比较简单的多进程版本作为演示版本. 代码如下: import socket import re import multiprocessing def handle_