wsgiref模块

学习django框架之前,可以先学习一下wsgiref模块,熟悉前后端交互。

一.先介绍下wsgiref模块

WSGI(Web Server Gateway Interface)是一种规范,它定义了使用python编写的web app(应用程序)与web server(socket服务端)之间接口格式,实现web app与web server间的解耦。

通俗的说:当规范建立后,程序就不再重复编写web server(socket服务端),而是直接使用现成的实现WSGI的模块(例如:wsgiref、uwsgi、werkzeug),从而让程序员更加专注与业务代码

与其重复造轮子,不如直接用现成的。

Python的wsgiref是基于WSGI规范封装的模块,我们可以在这个模块基础上开发我们的web server。

接下来我们引用wsgiref来编写一个web服务器

#_author:leo gao
#encoding:utf-8

from wsgiref.simple_server import make_server


def run_server(environ, start_response):
    """
    当有用户在浏览器上访问:http://127.0.0.1:8000/, 立即执行该函数并将函数的返回值返回给用户浏览器
    :param environ: 请求相关内容,比如浏览器类型、版本、来源地址、url等
    :param start_response: 响应相关
    :return:
    """

    start_response('200 OK', [('Content-Type', 'text/html;charset=utf-8')])

    return [bytes('hhhh', encoding="utf-8"), ]

if __name__ == '__main__':

    httpd = make_server('localhost', 8001, run_server)  # socket连接
    print('----已连接至8001----')
    httpd.serve_forever()  # 持续监听

前端访问效果为:

接下来有个需求如果我想要通过输入不同的路径去访问不同的页面怎么实现呢?

在environ中有一个字段:"PATH_INFO",这个键对应的值就是输入的路径

#_author:leo gao
#encoding:utf-8

from wsgiref.simple_server import make_server

def run_server(environ, start_response):
    """
    当有用户在浏览器上访问:http://127.0.0.1:8000/, 立即执行该函数并将函数的返回值返回给用户浏览器
    :param environ: 请求相关内容,比如浏览器类型、版本、来源地址、url等
    :param start_response: 响应相关
    :return:
    """

    start_response('200 OK', [('Content-Type', 'text/html;charset=utf-8')])

    if environ['PATH_INFO'] == '/login':
        with open('login.html', 'rb') as f:
            data = f.read()
        return [data]

    if environ['PATH_INFO'] == '/favicon.ico':
        with open('favicon.ico', 'rb') as f :
            data = f.read()
        return [data]

    elif environ['PATH_INFO'] == '/index':
        with open('index.html', 'rb') as f:
            data = f.read()
        return [data]

if __name__ == '__main__':

    httpd = make_server('localhost', 8030, run_server)  # socket连接
    print('----已连接至8001----')
    httpd.serve_forever()  # 持续监听

前端访问效果为:

功能是实现了,但是如果需要跳转的页面很多,全放在run_server中会不会显得很累赘?这样我们把跳转各个页面的逻辑封装成各个方法。

#_author:leo gao
#encoding:utf-8

from wsgiref.simple_server import make_server


def login():
    with open('login.html', 'r') as f:
        data = f.read()
    return data


def index():
    with open('index.html', 'r') as f:
        data = f.read()
    return data


def fav():
    with open('favicon.ico', 'r') as f:
        data = f.read()
    return data


def run_server(environ, start_response):
    """
    当有用户在浏览器上访问:http://127.0.0.1:8000/, 立即执行该函数并将函数的返回值返回给用户浏览器
    :param environ: 请求相关内容,比如浏览器类型、版本、来源地址、url等
    :param start_response: 响应相关
    :return:
    """

url_pattern = [
        ("/login", login),
        ("/index", index),
        ("fav", fav)
    ]
    
    # 方案一
    for i in url_pattern:
        print(environ.get('PATH_INFO'))
        if i[0] == environ.get('PATH_INFO'):
            return [bytes(i[1](), encoding='utf-8'), ]
    else:
            return [b'404']

    # 方案二
    func = None
    for item in url_pattern:
        if item[0] == environ.get('PATH_INFO'):
            func = item[1]
            break
    if func:
        return [bytes(func(), encoding="utf-8"), ]
    else:
        return [bytes('404 not found.', encoding="utf-8"), ]

if __name__ == '__main__':

    httpd = make_server('localhost', 8040, run_server)  # socket连接
    print('----已连接至8001----')
    httpd.serve_forever()  # 持续监听

 前端访问效果为:

请尊重作者劳动成果,有需要请转载,标明出处!!!  

原文地址:https://www.cnblogs.com/huizaia/p/11956211.html