zoukankan      html  css  js  c++  java
  • Flask框架第一篇.Flask框架基础

    1. Flask简介

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

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

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

    2.Flask和Django对比

     Django框架Flask框架
      Admin(基于Model) 原生无
      Model 原生无
      Form 原生无
      Session 有(但颠覆认知)
      教科书式框架 轻量级框架(以简单为基准 开发 一切从简 能省则省)
    优势 组件全,功能全,教科书 轻,快
    劣势 占用资源,创建复杂度较高 先天不足,第三方组件稳定性较差

    3.安装

    pip install flask
    #注意: 不要使用工具中的插件创建 Flask项目

    4 Flask依赖包

    4.1 jinjia2

    • 模板语言,就是Django中的 templates

    https://www.cnblogs.com/DragonFire/p/9259999.html

    就是django中的template
    #  {{ }}  引用或执行
    #  {% %}  逻辑代码
    STUDENT = {'name': 'Old', 'age': 38, 'gender': ''}  #注意:后面加 , 会报错
    ​
    STUDENT_LIST = [
        {'name': 'Old', 'age': 38, 'gender': ''},
        {'name': 'Boy', 'age': 73, 'gender': ''},
        {'name': 'EDU', 'age': 84, 'gender': ''}
    ]
    ​
    STUDENT_DICT = {
        1: {'name': 'Old', 'age': 38, 'gender': ''},
        2: {'name': 'Boy', 'age': 73, 'gender': ''},
        3: {'name': 'EDU', 'age': 84, 'gender': ''},
    }
    ​
    ​
    from flask import Flask, render_template
    ​
    app = Flask(__name__)
    ​
    # app.config["DEBUG"] = True
    app.debug = True
    ​
    @app.route("/")
    def home():
        return render_template("stu.html",stu=STUDENT,stu_list=STUDENT_LIST,stu_dict=STUDENT_DICT)
    ​
    if __name__ == "__main__":
        app.run("0.0.0.0",9527)
    View Code
    {{ stu }}
    <table border="1">
        <tr>
            <th>name</th>
            <th>age</th>
            <th>gender</th>
        </tr>
        <tr>
            <td>{{ stu.name }}</td>
            <td>{{ stu["age"] }}</td>
            <td>{{ stu.get("gender") }}</td>
        </tr>
    </table>
    View Code

    {{ stu_list }}
    <table border="1">
        <tr>
            <th>name</th>
            <th>age</th>
            <th>gender</th>
        </tr>
        
        {% for student in stu_list %}
        <tr>
            <td>{{ student.name }}</td>
            <td>{{ student["age"] }}</td>
            <td>
                {% if student.get("gender") != "" and student.get("gender") != "" %}
                    未知
                {% else %}
                    {{ student.get("gender") }}
                {% endif %}
            </td>
        </tr>
        {% endfor %}
    View Code

    # 法一:
    {{ stu_dict }}
    <table border="1">
        <tr>
            <th>id</th>
            <th>name</th>
            <th>age</th>
            <th>gender</th>
        </tr>
    ​
        {% for skey in stu_dict %}
        <tr>
            <td>{{ skey }}</td>
            <td>{{ stu_dict[skey].get("name") }}</td>
            <td>{{ stu_dict.get(skey).get("age") }}</td>
            <td>
                1
            </td>
        </tr>
        {% endfor %}
    </table># 法二:
    {{ stu_dict }}
    <table border="1">
        <tr>
            <th>id</th>
            <th>name</th>
            <th>age</th>
            <th>gender</th>
        </tr>
    ​
        {% for skey,svalue in stu_dict.items() %}
        <tr>
            <td>{{ skey }}</td>
            <td>{{ svalue.get("name") }}</td>
            <td>{{ svalue.get("age") }}</td>
            <td>
                1
            </td>
        </tr>
        {% endfor %}
    </table>
    View Code

    jianjia2的特殊用法

    from flask import Flask, render_template,Markup
    ​
    app = Flask(__name__)
    ​
    # app.config["DEBUG"] = True
    app.debug = True
    ​
    @app.route("/")
    def home():
        return render_template("stu.html",stu=STUDENT,stu_list=STUDENT_LIST,stu_dict=STUDENT_DICT)
    ​
    ​
    @app.template_global()
    def ab(a,b):
        return a+b
    ​
    @app.template_global()
    def my_input(na,ty):
        s = f"<input type='submit' value='后端返回的按钮'>"
        return Markup(s)
    ​
    @app.route("/a")
    def home2():
        inp = Markup("<input type='submit' value='后端返回的按钮'>")
        return render_template("a.html",btn=inp)
    ​
    if __name__ == "__main__":
        app.run("0.0.0.0",9527)
        {{ ab(2,7) }}
    ​
    ​
        {% macro my_input(na,ty) %}
            <input type="{{ ty }}" name="{{ na }}">
        {% endmacro %}
    ​
        {{ my_input("username","text") }}
    ​
        {{ btn }}
    View Code

    4.2 werkzeug

    • Werkzeug是一个WSGI工具包,他可以作为一个Web框架的底层库。这里稍微说一下, werkzeug 不是一个web服务器,也不是一个web框架,而是一个工具包,官方的介绍说是一个 WSGI 工具包,它可以作为一个 Web 框架的底层库,因为它封装好了很多 Web 框架的东西,例如 Request,Response 等等

      代码示例:

      from werkzeug.wrappers import Request, Response
      ​
      @Request.application
      def hello(request):
          return Response('Hello World!')
      ​
      if __name__ == '__main__':
          from werkzeug.serving import run_simple
          run_simple('localhost', 4000, hello)
      View Code
     
  • 相关阅读:
    转载:备份HyperV时需要避免的六大错误
    职场必读blog
    sps 2010 出错记录
    MySQL的一些常用命令
    JS 常用 函数
    批处理 启动/关闭 VMware服务
    SQL Server 复制 发布订阅(SQL Server 数据同步)
    JBoss7 入门指南
    SQLServer 数据库 远程备份
    QuickFix/J
  • 原文地址:https://www.cnblogs.com/lilinyuan5474/p/15568714.html
Copyright © 2011-2022 走看看