Django之wsgi协议应用,基于wsgiref模块DIY一个web框架

时间:2021-2-20 作者:admin

1、web框架

Web框架(Web framework)是一种开发框架,用来支持动态网站、网络应用和网络服务的开发。这大多数的web框架提供了一套开发和部署网站的方式,也为web行为提供了一套通用的方法。web框架已经实现了很多功能,开发人员使用框架提供的方法并且完成自己的业务逻辑,就能快速开发web应用了。浏览器和服务器的是基于HTTP协议进行通信的。也可以说web框架就是在以上十几行代码基础张扩展出来的,有很多简单方便使用的方法,大大提高了开发的效率。

2、web应用背景

了解了HTTP协议和HTML文档,我们其实就明白了一个Web应用的本质就是:

  • 浏览器发送一个HTTP请求;

  • 服务器收到请求,生成一个HTML文档;

  • 服务器把HTML文档作为HTTP响应的Body发送给浏览器;

  • 浏览器收到HTTP响应,从HTTP Body取出HTML文档并显示。

3、WSGI协议

最简单的Web应用就是先把HTML用文件保存好,用一个现成的HTTP服务器软件,接收用户请求,从文件中读取HTML,返回。Apache、Nginx、Lighttpd等这些常见的静态服务器就是干这件事情的。

如果要动态生成HTML,就需要把上述步骤自己来实现。不过,接受HTTP请求、解析HTTP请求、发送HTTP响应都是苦力活,如果我们自己来写这些底层代码,还没开始写动态HTML呢,就得花个把月去读HTTP规范。

正确的做法是底层代码由专门的服务器软件实现,我们用Python专注于生成HTML文档。因为我们不希望接触到TCP连接、HTTP原始请求和响应格式,所以,需要一个统一的接口,让我们专心用Python编写Web业务。

这个接口就是WSGI:Web Server Gateway Interface。

WSGI,(Web Server Gateway Interface),是一种实现 python 解析的Web服务器网关接口标准/协议,Web服务器和Web应用程序或框架之间的一种简单而通用的接口。

4、wsgiref模块

wsgiref模块就是python基于wsgi协议开发的服务模块,它是用纯Python编写的WSGI服务器的参考实现。所谓“参考实现”是指该实现完全符合WSGI标准,但是不考虑任何运行效率,仅供开发和测试使用。

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  wsgiref !</h1>']


httpd = make_server('', 8081, application)

print('Serving HTTP on port 8081...')
# 开始监听HTTP请求:
httpd.serve_forever()

Django之wsgi协议应用,基于wsgiref模块DIY一个web框架

5、DIY一个web框架

为了做出一个动态网站,我们需要扩展功能,比如用户访问url的路径是login时提供一个登录页面,路径是index时响应一个首页面。
Django之wsgi协议应用,基于wsgiref模块DIY一个web框架

5.1 启动文件:manage.py

from wsgiref.simple_server import make_server
from views import *
from urls import urlpatterns


def application(environ, start_response):
    # print("environ",environ)
    start_response('200 OK', [('Content-Type', 'text/html')])
    # 获取当前请求路径
    print("PATH_INFO",environ.get("PATH_INFO"))
    path=environ.get("PATH_INFO")
    # 分支
    func = None
    for item in urlpatterns:
        if path == item[0]:
            func = item[1]
            break
    if not func:
        ret = notFound(environ)
    else:
        ret = func(environ)
    return [ret]


httpd = make_server('', 8080, application)
# 开始监听HTTP请求:
httpd.serve_forever()

5.2 url控制文件:urls.py

from views import *

urlpatterns = [
    ("/login", login),
    ("/home", home),
]

5.3 视图文件:views.py

# 视图函数
def home(environ):
    with open("templates/home.html", "rb") as f:
        data = f.read()
    return data


def login(environ):
    with open("templates/login.html", "rb") as f:
        data = f.read()
    return data


def notFound(environ):
    return b"<h1>404...</h1>"

5.4 模板文件Templates

login.html:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
<form action="http://127.0.0.1:8080/home" method="post">
    用户名 <input type="text" name="user" placeholder="user">
    密码 <input type="password" name="pwd"  placeholder="pwd">
    <input type="submit">
</form>
</body>
</html>

home.html:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
<h3> GOOD JOB!! This is home!</h3>
</body>
</html>

5.5 启动web框架,请求访问

  • 启动 manage.py 文件,监听8080端口
    Django之wsgi协议应用,基于wsgiref模块DIY一个web框架

  • 访问 http://127.0.0.1:8080/login
    Django之wsgi协议应用,基于wsgiref模块DIY一个web框架

  • 登录后自动跳转 home 页, http://127.0.0.1:8080/home
    Django之wsgi协议应用,基于wsgiref模块DIY一个web框架

5.6 框架应用

到这里,pyyuan这个包就是一个web框架,当这个框架的基础上,添加业务功能就很简单了,比如,我们添加一个查看时间的页面,只需要完成两部即可:

(1) 在urls.py中添加:

("/timer", timer),

(2) 在views.py中添加:

def timer(request):
    import datetime
    now=datetime.datetime.now().strftime("%Y-%m-%d %X")
    return now.encode()

是不是很简单!,有了web框架,再也不用从创建socket开始一行行码代码了!哈哈哈哈

至此,感叹一句,Django 框架真香 !!!

声明:本文内容由互联网用户自发贡献自行上传,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任。如果您发现有涉嫌版权的内容,欢迎进行举报,并提供相关证据,工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。