zoukankan      html  css  js  c++  java
  • Flask简介及使用

    Flask简介

    ​ Flask是一个基于Python开发并且依赖jinja2模板和Werkzeug WSGI服务的一个微型框架,对于Werkzeug本质是Socket服务端,其用于接收http请求并对请求进行预处理,然后触发Flask框架,开发人员基于Flask框架提供的功能对请求进行相应的处理,并返回给用户,如果要返回给用户复杂的内容时,需要借助jinja2模板来实现对模板的处理,即:将模板和数据进行渲染,将渲染后的字符串返回给用户浏览器。

    ​ “微”(micro) 并不表示你需要把整个 Web 应用塞进单个 Python 文件(虽然确实可以 ),也不意味着 Flask 在功能上有所欠缺。微框架中的“微”意味着 Flask 旨在保持核心简单而易于扩展。Flask 不会替你做出太多决策——比如使用何种数据库。而那些 Flask 所选择的——比如使用何种模板引擎——则很容易替换。除此之外的一切都由可由你掌握。如此,Flask 可以与您珠联璧合。

    ​ 默认情况下,Flask 不包含数据库抽象层、表单验证,或是其它任何已有多种库可以胜任的功能。然而,Flask 支持用扩展来给应用添加这些功能,如同是 Flask 本身实现的一样。众多的扩展提供了数据库集成、表单验证、上传处理、各种各样的开放认证技术等功能。Flask 也许是“微小”的,但它已准备好在需求繁杂的生产环境中投入使用

    wsgiref

    最简单的Web应用就是先把HTML用文件保存好,用一个现成的HTTP服务器软件,接收用户请求,从文件中读取HTML,返回。

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

    正确的做法是底层代码由专门的服务器软件实现,我们用Python专注于生成HTML文档。因为我们不希望接触到TCP连接、HTTP原始请求和响应格式,所以,需要一个统一的接口协议来实现这样的服务器软件,让我们专心用Python编写Web业务。这个接口就是WSGI:Web Server Gateway Interface。而wsgiref模块就是python基于wsgi协议开发的服务模块

    wsgiref简单应用

    from wsgiref.simple_server import make_server
    
    def mya(environ, start_response):
        print(environ)
        start_response('200 OK', [('Content-Type', 'text/html')])
        if environ.get('PATH_INFO') == '/index':
            with open('index.html', 'rb') as f:
                data = f.read()
    
        elif environ.get('PATH_INFO') == '/login':
            with open('login.html', 'rb') as f:
                data = f.read()
    
        else:
            data = b'<h1>Hello, web!</h1>'
        return [data]
    
    
    if __name__ == '__main__':
        myserver = make_server('127.0.0.1', 8011, mya)
        print('监听8011')
        myserver.serve_forever()
    
    <!--index.html-->
    
    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <title>Title</title>
    </head>
    <body>
        <h1>主页</h1>
    </body>
    </html>
    

    两个依赖

    flask 有两个核心依赖库:werkzeugjinja,而 werkzeug 又是两者中更核心的。

    werkzeug 负责核心的逻辑模块,比如路由、请求和应答的封装、WSGI 相关的函数等;jinja负责模板的渲染,主要用来渲染返回给用户的 html 文件内容。

    模板(template)是和 web 框架相对独立的内容,比如 jinja 不是只能用在 web 应用中,而 web 应用也可以不处理模板(比如返回 raw text 或者 json/xml 结构数据,而不是 html 页面)。flask 直接使用 jinja2 而不是把这部分也做成可扩展的看起来有悖它的设计原则,我个人的理解是:flask 是个写网页的 web 框架,不像 flask-restful 可以专门做 json/xml 数据接口,必须提供模板功能,不然用户就无法使用。而如果不绑定一个模板库的话,有三种方法:自己写一个模板引擎、封装一个可扩展的模板层,用户可以自己选择具体的模板引擎、或者让用户自己处理模板。但是这些方法要么增加实现的复杂度,要么增加了使用的复杂度。

    werkzeug

    werkzeug 的定位并不是一个 web 框架,而是 HTTP 和 WSGI 相关的工具集,可以用来编写 web 框架,也可以直接使用它提供的一些帮助函数。

    werkzeug 提供了 python web WSGI 开发相关的功能:

    • 路由处理:怎么根据请求中的 url 找到它的处理函数
    • request 和 response 封装:可以更好地读取 request 的数据,也容易生成响应
    • 一个自带的 WSGI server,可以用来测试环境运行自己的应用

    比如,我们可以使用 werkzeug 编写一个简单的 hello world 的 WSGI app:

    from werkzeug.wrappers import Request, Response
    
    def application(environ, start_response):
        request = Request(environ)
        text = 'Hello %s!' % request.args.get('name', 'World')
        response = Response(text, mimetype='text/plain')
        return response(environ, start_response)
    

    除了和 web WSGI 相关的功能,werkzeug 还实现了很多非常有用的数据结构和函数。比如用来处理一个 key 对应多个值的 MultiDict,不支持修改的字典 ImmutableDict ,可以缓存类属性的 cache_property 等等。

    Jinja2

    官网上,对 Jinja 的 介绍已经很清晰,它就是一个 python 实现的模板引擎,功能非常丰富。

    Jinja 功能比较丰富,支持 unicode 解析、自动 HTML escape 防止 XSS 攻击、继承、变量、过滤器、流程逻辑支持、python 代码逻辑集成等等。具体的功能和使用请参考官网的文档,这里就不介绍了。

    简单使用

    安装

    pip install flask
    

    flask快速使用

    from flask import Flask
    
    # 实例化产生一个Flask对象
    app = Flask(__name__)
    
    # 将 '/'和视图函数hello_workd的对应关系添加到路由中
    @app.route('/') # 1. v=app.route('/') 2. v(hello_world)
    def hello_world():
        return 'Hello World!'
    
    if __name__ == '__main__':
        app.run() # 最终调用了run_simple(),本质是执行wsgi_app(environ, response)
    

    Django与Flask返回值的对比

    返回类型 Django Flask
    重定向 redirect redirect
    字符串 HttpResponse ""
    渲染模板 render render_template(传值必须是关键字传值
    json JsonResponse jsonify
    from flask import Flask,redirect,render_template,jsonify
    app=Flask(__name__)
    
    '''
    redirect
    HttpResponse
    render
    JsonResponse
    '''
    
    @app.route("/index")
    def index():
        # return "12354543"  # 返回字符串
        print("123")
        return redirect("/login")  # 重定向
    
    @app.route("/test")
    def test():
        data={"name":"ada","age":30}
        return render_template("index.html",**data)  # 渲染模板,打散字典传值
    
    @app.route("/login")
    def login():
        data = {"name": "ada", "age": 30}
        return jsonify(data)  # 返回json格式数据
    
    if __name__ == '__main__':
        app.run()
    
  • 相关阅读:
    atitit.js浏览器环境下的全局异常捕获
    atitit.事件驱动的总结attilax
    atitit.事件驱动的总结attilax
    1.1.1. Atitit Cocos2d-JS v3.x的问题
    1.1.1. Atitit Cocos2d-JS v3.x的问题
    Atitit html5 Canvas 如何自适应屏幕大小
    Atitit  如何让精灵控件运动
    Atitit html5 Canvas 如何自适应屏幕大小
    Atitit  如何让精灵控件运动
    atitit.日期,星期,时候的显示方法ISO 8601标准
  • 原文地址:https://www.cnblogs.com/Hades123/p/11761327.html
Copyright © 2011-2022 走看看