• 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()  # 持续监听

     前端访问效果为:

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

  • 相关阅读:
    linux试题
    linux常用脚本
    nagios
    lvs/nginx/haproxy 负载均衡优缺点分析讲解
    一次SSLPeerUnverifiedException,SSLHandshakeException问题的分析
    [转]【安卓笔记】AsyncTask源码剖析
    linux下查看进程占用端口和端口占用进程命令
    which framework or library is best to use WebRTC
    [转]svn diff 替代工具
    [转]使用Subversion进行版本控制
  • 原文地址:https://www.cnblogs.com/huizaia/p/11956211.html
Copyright © 2020-2023  润新知