zoukankan      html  css  js  c++  java
  • 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()  # 持续监听

     前端访问效果为:

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

  • 相关阅读:
    一个喜欢研究车的80后开车人,自己的经验和感受
    35岁前务必成功的12级跳(男女通用) 转
    如何注册ocx文件
    plsql连接oracle数据库
    float过后 高度无法自适应的解决方法
    Mysql 中文中繁杂的字 插入报错的 解决方案
    power designer 教程
    表单文本框输入时提示文字消失
    diskpart分盘代码
    linux svn 中文 https://my.oschina.net/VASKS/blog/659236
  • 原文地址:https://www.cnblogs.com/huizaia/p/11956211.html
Copyright © 2011-2022 走看看