生命不息
折腾不止

Django001-框架由来

Siffre阅读(408)

什么是Web框架?

框架(Framework)是指为解决一个开放性的问题而设计的具有一定约束性的支撑结构,使用框架可以帮助你快速开发特定的系统。简单来说,就是不用重复造轮子!

Web应用流程

WEB应用的流程:

  1. 浏览器发送HTTP请求
  2. 服务器接收请求,生成一个HTML文档
  3. 服务器将HTML文档作为HTTP响应的Body传回给浏览器
  4. 浏览器接收HTTP响应,渲染HTML文档

Web应用本质

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

import socket

def handle_request(client):

    buf = client.recv(1024)
    client.send("HTTP/1.1 200 OK\r\n\r\n".encode("utf8"))
    client.send("<h1 style='color:red'>Hello, yuan</h1>".encode("utf8"))

def main():

    sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    sock.bind(('localhost',8001))
    sock.listen(5)

    while True:
        connection, address = sock.accept()
        handle_request(connection)
        connection.close()

if __name__ == '__main__':
    main()

Web框架实现

最基础的Web应用就是:在服务端将HTML保存到文件,用一个现成的HTTP服务器软件来接收用户请求,将文件内的HTML返回给用户(浏览器)。

如果我们想要动态实现上述流程,就要自己动手来写这些繁琐的过程(HTTP请求-解析-响应),由于程序员们都是懒惰的不想写重复的代码,因此,正确的做法是用特定的、封装好的程序为我们自动去实现那些重复的过程。

WSGI (Web Server Gateway Interface)就是我们需要的最简单的服务器软件,有了它我们就可以专心的编写Web业务啦!

以下是web框架实现流程

接下来实现一个简单的Web框架,有助于理解Django框架

编写最简单的Web应用

使用Python内置的WSGI服务器:wsgiref模块

#模块导入
from wsgiref.simple_server import make_server
#创建应用
def application(environ, start_response):
    start_response('200 OK', [('Content-Type', 'text/html')])
    return [b'<h1>Hello, web!</h1>']
#服务器调用应用程序
httpd = make_server('IP', 8080, application)
print('Serving HTTP on port 8000...')
# 开始监听HTTP请求:
httpd.serve_forever()

这里,我们不在需要写那些底层的socket代码,考虑HTTP请求,响应即可

注意:

environ:是一个封装所有HTTP请求信息的dict对象 start_response:发送HTTP响应的函数,由于Header只能发送一次,也就是只能调用一次该函数;该函数接收两个参数:HTTP响应码,一个HTTP Header列表(Header用一个包含两个字符串的元祖表示) return的返回值作为HTTP响应的Body发送给浏览器

Web应用扩展

Web应用路由模拟

根据environ内封装的路径获取对应的响应信息

from wsgiref.simple_server import make_server

def f1():
    f1=open("index1.html","rb")
    data1=f1.read()
    return [data1]

def f2():
    f2=open("index2.html","rb")
    data2=f2.read()
    return [data2]

def application(environ, start_response):
    print(environ['PATH_INFO'])
    path=environ['PATH_INFO']
    start_response('200 OK', [('Content-Type', 'text/html')])

    if path=="/yuan":
        return f1()
    elif path=="/alex":
        return f2()
    else:
        return ["<h1>404</h1>".encode("utf8")]
httpd = make_server('ip', 8502, application)
print('Serving HTTP on port 8084...')
# 开始监听HTTP请求:
httpd.serve_forever()
Web应用数据库及模板
from wsgiref.simple_server import make_server

def f1(req):
    print(req)
    print(req["QUERY_STRING"])

    f1=open("index1.html","rb")
    data1=f1.read()
    return [data1]

def f2(req):

    f2=open("index2.html","rb")
    data2=f2.read()
    return [data2]

import time

def f3(req):        #模版以及数据库

    f3=open("index3.html","rb")
    data3=f3.read()
    times=time.strftime("%Y-%m-%d %X", time.localtime())
    data3=str(data3,"utf8").replace("!time!",str(times))

    return [data3.encode("utf8")]

def routers():

    urlpatterns = (
        ('/yuan',f1),
        ('/alex',f2),
        ("/cur_time",f3)
    )
    return urlpatterns

def application(environ, start_response):

    print(environ['PATH_INFO'])
    path=environ['PATH_INFO']
    start_response('200 OK', [('Content-Type', 'text/html')])

    urlpatterns = routers()
    func = None
    for item in urlpatterns:
        if item[0] == path:
            func = item[1]
            break
    if func:
        return func(environ)
    else:
        return ["<h1>404</h1>".encode("utf8")]
httpd = make_server('', 8518, application)
print('Serving HTTP on port 8084...')
# 开始监听HTTP请求:
httpd.serve_forever()