Web框架

Web框架的本质

Web服务端的本质就是一个socket服务端,而我们的浏览器就是socket客户端。浏览器发送的请求就是一次socket请求。一次请求获得一次响应,然后就断开,这是一个短连接。

import socket

def hand_request(conn):
    #建立接收端
    data = conn.recv(1024)
    conn.send('HTTP/1.1 200 OK\r\n\r\n'.encode('utf-8')) #这里是浏览器解释的内容,先不用知道
    conn.send("<h1>hello word!</h1>".encode('utf-8'))

def main():
    #建立发送端
    server = socket.socket()
    server.bind(("localhost",8000))
    server.listen(5)
    #持续监听
    while True:
        conn,addr = server.accept()
        hand_request(conn)
        conn.close()
if __name__ == "__main__":
    main()

然后打开本机的浏览器访问我们的Web服务。在地址栏输入 http://127.0.0.1:8000/http://localhost:8000/ 之后,浏览器上就会显示服务端返回的内容了。

上述通过socket来实现了其本质,而对于真实开发中的python web程序来说,一般会分为两部分:服务器程序和应用程序。服务器程序负责对socket服务器进行封装,并在请求到来时,对请求的各种数据进行整理。应用程序则负责具体的逻辑处理。为了方便应用程序的开发,就出现了众多的Web框架,例如:Django、Flask、web.py 等。不同的框架有不同的开发方式,但是无论如何,开发出的应用程序都要和服务器程序配合,才能为用户提供服务

WSGI

WSGI(Web Server Gateway Interface),是一种规范。它定义了使用python编写的web app与web server,实现web app与web server间的解耦。其实就是封装了一个socket。

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

# !/usr/bin/env python
# _*_coding:utf-8_*_
from wsgiref.simple_server import make_server

def RunServer(environ, start_response):
    # environ:封装了客户端发来的所有的数据
    # start_response:封装了要返回给用户的数据,响应头和响应状态
    start_response('200 OK', [('Content-Type', 'text/html')])
    # 返回给客户端的内容,用return返回。记得要转成bytes类型
    return ['<h1>Hello, web!</h1>'.encode('utf-8'), ]

if __name__ == '__main__':
    httpd = make_server('', 8000, RunServer)  # 创建服务,不需要我们自己创建socket服务了
    print("Serving HTTP on port 8000...")
    httpd.serve_forever()  # 运行服务

响应不同的url请求

通常我们的请求可能要访问的是网站中的某个页面,比如是这样的形式 http://localhost:8000/data 。这需要在服务端能够区别出不同的请求,然后给客户端返回不同的内容。

environ,封装了客户端发来的所有的数据,现在来找一下请求的数据具体在哪里。
在上面例子中的 RunServer 函数中添加断点,然后Debug模式启动。此时再用上面的url发起请求。

展开 environ 后,可以找到 PATH_INFO 内存放的就是 '/data' ,也就是我们请求的页面。在函数内判断一下 environ['PATH_INFO'] 的值,就可以在里面自定义自己的web框架

自定义Web框架

自己写一个web框架

from wsgiref.simple_server import make_server

def index():
    return 'index'

def login():
    return 'login'

def home():
    return 'home'

def routers():
    urlpatterns = (
        ('/index',index)
        ('/login',login)
        ('/home',home)
    )
    return urlpatterns

def RunServer(environ, start_response):
    # 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)  # 创建服务,不需要我们自己创建socket服务了
    print("Serving HTTP on port 8000...")
    httpd.serve_forever()  # 运行服务
View Code

Web框架

 

MVC框架

 

web_server.py
├─Model
│  └─get_data.py
├─View
│  └─index.html
└─Contraller
    └─account.py

 

MVC(Model View Controller 模型-视图-控制器)的Web架构

MTV框架

另外还有一种,MTV(Model Templates View 模型-模板-视图)。也就是把MVC中的View分成了视图(展现哪些数据)和模板(如何展现)2个部分,而Contorller这个要素由框架自己来实现了,我们需要做的就是把(带正则表达式的)URL对应到视图就可以了,通过这样的URL配置,系统将一个请求发送到一个合适的视图。 Django就是基于这个框架写的

 

posted @ 2018-12-01 19:07  Aline2  阅读(156)  评论(0编辑  收藏  举报