• Flask初探之WSGI



    Flask是一个使用 Python 编写的轻量级 Web 应用框架。较其他同类型框架更为灵活、轻便、安全且容易上手。它可以很好地结合MVC模式进行开发,小型团队在短时间内就可以完成功能丰富的中小型网站。另外,Flask还有很强的定制性,用户可以根据自己的需求来添加相应的功能,在保持核心功能的同时实现丰富的功能扩展。Flask强大的插件库也可以让用户实现个性化的网站定制,开发出功能强大的网站。

    Flask 的三个特点:轻量级灵活定制型强。接下来将用5篇来介绍Flask原理,难度由浅入深。

    flask demo

    首先以最快的的方法跑一个最简单的Flask程序。
    app.py

    import time
    from flask import Flask 
    
    # 实例化一个Flask类,app代表着flask程序。
    app = Flask(__name__)
    
    # 向flask实例添加一个路由
    @app.route('/')
    def hello_world():
        return 'Hello World!'
    

    运行flask

    flask run
    

    访问127.0.0.1:5000

    从flask中导入Flask类,然后实例化Flask类得到一个应用程序:app。
    在实例化Flask时,传入了一个参数__name__,该参数代表文件名,本例中就是app。传入参数主要为了定位文件,可以通过传入这个名字确定程序的根目录,以便获得静态文件和模板文件的目录。

    微框架

    在官方介绍中, Flask被称为微框架,那么这里的是什么意思呢?

    这里的并不意味着 Flask 功能简陋,而是指其保留核心且易于扩展。有许多 Web程序不需要后台管理、用户认证、权限管理,有些甚至不需要表单或数据库,所以 Flask 并没有内置这类功能,而是把这些功能都交给扩展或用户自己实现。

    正因为如此,从只需要渲染模板的小项目到需要各种功能的大项目,Flask 几乎能够适应各种情况。 Flask的这一设计理念正印证了《Zen of Python 》里的这一句Simple is better than complex

    WSGI

    Flask作为一个web框架,WSGI是必须要实现的组件。那么什么是WSGI?在web框架中的作用又是什么?
    web框架分为两个部分,分别是:

    1. 服务端程序:接收客户端发送的请求
    2. 应用程序:处理客户端的请求

    WSGI:Web Server Gateway Interface 网站服务网关接口,一种网络请求的规范,服务端程序就是实现了WSGI规范的程序。Flask是处理客户端请求的应用程序。
    两者的关系如下:

    为什么需要服务端程序?难道不可以直接将请求发送给应用端吗?
    因为在处理请求时不希望接触到TCP连接、HTTP原始请求、请求定位等底层数据处理,所以需要一个统一的接口帮助我们来处理这些的数据,让我们专心用Python编写Web业务。这个接口就是WSGI:Web Server Gateway Interface。WSGI定义了一种规范,将请求原始数据处理好,以固定的格式传递给应用程序。凡是实现了WSGI规范的程序都可以称之为服务器程序。

    应用程序如何工作?
    当一个请求过来之后服务端程序将请求解析,并根据请求的内容调用处理函数,这里处理函数就是应用程序。应用程序接收到参数,处理并返回结果。

    从请求数据格式的角度来看
    HTTP请求到我们的Web程序之间,有一个转换过程——从Http报文到WSGI 规定的数据格式。实现了WSGI的程序则可以视为客户端请求和我们的Web程序之间沟通的桥梁。
    数据格式的转化如下:

    WSGI工作细节

    python自带的一个简单的wsgi服务,通过该服务来探究WSGI的工作细节。
    wsgi_simple.py

    # 从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 wsgi!</h1>']
    
    # 创建一个服务器,IP地址为空,端口是8080,处理函数是application:
    httpd = make_server('', 8080, application)
    print ("Serving HTTP on port 8080...")
    
    # 开始监听HTTP请求:
    httpd.serve_forever()
    

    访问127.0.0.1:8080

    根据WSGI的规定,应用程序必须是一个可调用对象(call able object)。
    WSGI务器启动后会监听本机的对应端口。当接收到请求时,将请求报文解析为一个 environ字典, 同时提供一个设置服务器状态和各种返回头标志的函数start_response,将environstart_response作为参数,调用应用端程序真正处理请求。
    参数:可调用对象接收两个参数

    1. environ 包含了请求的所有信息的字典
    2. start_response 通知服务器响应状态并设置各种标头

    返回:可迭代对象

    在上例中application就是应用程序,它是一个函数,也可以是方法或类。接受的参数是wsgiref服务端程序提供的environstart_response,返回值是一个字节串,可迭代对象。

    总结一下web框架两个组件的功能:
    服务端程序:

    1. 监听本机端口
    2. 将请求解析成字典
    3. 调用应用程序,将结果返回给请求方

    应用程序:

    1. 接受environstart_response两个参数
    2. 设置返回状态和返回头部信息
  • 相关阅读:
    CoreOS 手动更新
    阿里云ECS安装 CoreOS
    CoreOS 手动升级篇
    WARNING: REMOTE HOST IDENTIFICATION HAS CHANGED!
    Microsoft.NETCore.App 版本不一致导致的运行失败
    设计模式之观察者模式
    设计模式之策略模式
    树的广度优先遍历和深度优先遍历(递归非递归、Java实现)
    设计模式之组合模式
    设计模式之外观模式
  • 原文地址:https://www.cnblogs.com/goldsunshine/p/15890689.html
Copyright © 2020-2023  润新知