zoukankan      html  css  js  c++  java
  • 初识Flask框架,以及Flask中的模板语言jinjia2和Flask内置的Session

    一、web框架的对比

      首先我们先来看下比较火的web框架

      1.Django:

      优点:大而全,所有组件都是组织内部开发高度定制化,教科书级别的框架

      缺点:大到浪费资源,请求的时候需要的资源较高

      2.Flask:

      优势:小而精,组件只有session,第三方机构强烈支持Flask,非常多的三方组件,简单至极

      缺陷:由于三方组件的关系,稳定性相对较差  Flask-session

      3.Sanic

      优势:异步IO非阻塞,原生WebSocket,小而精,组件只有Session,第三方机构强烈支持非常多的三方组件

      缺陷:复杂度太高

      扩展:

      QPS = 请求每秒钟的次数

      时间片:CPU工作一次的时间单位

    二、Flask的安装与启动

      1.首先是安装Flask,在python中直接输入安装代码即可

    pip install Flask

      

      2.启动Flask

      三行启动Flask

    from flask import Flask
    app = Flask(__name__)
    app.run()

      

      六行代码启动Flask在前端输出Hello Flask

    from flask import Flask
    app = Flask(__name__)
    @app.route("/")
    def index():
        return "Hello Flask"
    app.run()

    ##############
    其中@app.route("/")是这是当前访问路径,设置访问路径有两种方式这是第一种

    def index()是视图函数


    三、关于Flask响应

    1.Response三贱客:
    
        1.return HTTPResponse  对应的Flask是  return "Hello"
        2.return render       对应的Flask是  return render_template("index.html")
        3.return redircet      对应的Flask是  return redircet("/index")
        4.return send_file("文件路径")
        打开并返回文件内容,会在响应头中加入Content-Type:文件格式+Content-Length:文件大小(bytes类型)
        5.return jsonify({key:value})
        返回一个客户端可以识别的json格式字符串 会在响应头中加入Content-Type:application/json

    四、关于Flask的请求

      比较特殊,首先导入request,其中request是公共变量

    from flask import request

      

      如何从request中获取我们需要的数据

    1.request.args    获取URL中的数据
    
    2.request.form    获取FormData中的数据
    
    3.request.values    获取args+form
    
    4.request.data        字节流,获取请求体中的原始数据
    
    5.request.json          字典请求体中带有Content-Type:application/json将请求体中的数据        
                                   反序列化到json中,但是在data中依然存储着原始数据bytes  
    
    6.request.files          获取FormData中的文件数据 request.files.get("文件")
    
    7.request.files.save    保存文件(默认提交的文件名)
    
    8.request.method        获取当前的请求方式

    五、了解了这么多,是不是该写个前端试下了。Flask中默认的模板语言是jinja2

      1.先来看下jinja2的模板渲染所使用的for

    {% for foo in list %}
    {% endfor %}

      2.jinja2模板语言中的if

    {% if 判断语句%}
    
    {% elif 判断语句%}
    
    {% else %}
    
    {% endif %}

      接下来我们把一些数据在前端生成表格

      准备数据

    STUDENT = {'name': 'Old', 'age': 38, 'gender': ''},
    
    STUDENT_LIST = [
        {'name': 'Old', 'age': 38, 'gender': ''},
        {'name': 'Boy', 'age': 73, 'gender': ''},
        {'name': 'NB', 'age': 84, 'gender': ''}
    ]
    
    STUDENT_DICT = {
        1: {'name': 'Old', 'age': 38, 'gender': ''},
        2: {'name': 'Boy', 'age': 73, 'gender': ''},
        3: {'name': 'NB', 'age': 84, 'gender': ''},
    }

      1.使用STUDENT字典传递至前端

      后端

    @app.route("/student")
    def index():
        return render_template("student.html", student=STUDENT)

      前端

    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <title>test</title>
    </head>
    <body>
    <div>{{ student }}</div>
    <table border="1px">
        <tr>
            <td>{{ student.name }}</td>
            <td>{{ student["age"] }}</td>
            <td>{{ student.get("gender") }}</td>
        </tr>
    </table>
    </body>
    </html>

      2.STUDENT_LIST列表传入前端jinja2模板的操作

      后端

    @app.route("/student_list")
    def student_list():
        return render_template("student_list.html", student=STUDENT_LIST)

      

      前端

    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <title>test</title>
    </head>
    <body>
    <div>{{ student }}</div>
    <table border="1xp">
        {% for foo in student %}
            <tr>
                <td>{{ foo }}</td>
                <td>{{ foo.name }}</td>
                <td>{{ foo.get("age") }}</td>
                <td>{{ foo["gender"] }}</td>
            </tr>
        {% endfor %}
    </table>
    </body>
    </html>

      如果需要循环遍历的话,jinja2给我们的方案是

    {% for foo in student %}
            <tr>
                <td>{{ foo }}</td>
            </tr>
        {% endfor %}

    上述代码中的foo就是列表中的每个字典,再用各种取值方式取出值即可

      3.STUDENT_DICT字典传入前端jinja2模板

      后端

    @app.route("/student_dict")
    def student_dict():
        return render_template("student_dict.html", student=STUDENT_DICT)

      

      前端

    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <title>test</title>
    </head>
    <body>
    <table>
        {% for foo in student %}
            <tr>
                <td>{{ foo }}</td>
                <td>{{ student.get(foo).name }}</td>
                <td>{{ student[foo].get("age") }}</td>
                <td>{{ student[foo]["gender"] }}</td>
            </tr>
        {% endfor %}
    </table>
    </body>
    </html>

    在遍历字典的时候,foo其实是相当于拿出了字典中的key

      4.结合所有的字符串全部传递到前端jinja2模板中去

      后端

    @app.route("/allstudent")
    def all_student():
        return render_template("all_student.html", student=STUDENT ,
                               student_list = STUDENT_LIST,
                               student_dict= STUDENT_DICT)

      

      前端

    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <title>test</title>
    </head>
    <body>
    <div> _____________________________________</div>
     student
    <div>{{ student }}</div>
    <table border="1px">
        <tr>
            <td>{{ student.name }}</td>
            <td>{{ student["age"] }}</td>
            <td>{{ student.get("gender") }}</td>
        </tr>
    </table>
    <div> _____________________________________</div>
    student_list
    <div>{{ student_list }}</div>
    <table border="1xp">
        {% for foo in student_list %}
            <tr>
                <td>{{ foo }}</td>
                <td>{{ foo.name }}</td>
                <td>{{ foo.get("age") }}</td>
                <td>{{ foo["gender"] }}</td>
            </tr>
        {% endfor %}
    </table>
    <div> _____________________________________</div>
    student_dict
    <div>{{ student_dict }}</div>
    <table border="1xp">
        {% for foo in student_dict %}
            <tr>
                <td>{{ foo }}</td>
                <td>{{ student_dict.get(foo).name }}</td>
                <td>{{ student_dict[foo].get("age") }}</td>
                <td>{{ student_dict[foo]["gender"] }}</td>
            </tr>
        {% endfor %}
    </table>
    </body>
    </html>

    这里可以看出来,render_template中可以传递多个关键字

      5.jinja2模板语言中的宏定义

      前端代码

    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <title>Title</title>
    </head>
    <body>
    
    <h1>jinja2模板语言中的宏定义</h1>
    
    {% macro type_text(name,type) %}
        <input type="{{ type }}" name="{{ name }}" value="{{ name }}">
    {% endmacro %}
    
    <h2>在下方是使用宏来生成input标签</h2>
    
    {{ type_text("one","text") }}
    {{ type_text("two","text") }}
    
    </body>
    </html>

    但是一般很少应用的到

    六、Flask中内置的Session

      Flask中的Session非常的奇怪,他会将你的SessionID存放在客户端的Cookie中,使用也很奇怪

      1.Flask中session是需要secret_key的

    from flask import session
    app = Flask(__name__)
    app.secret_key = "DragonFire"

      secret_key实际上是用来加密字符串的,如果在实例化的app中没有secret_key那么开启session一定会抛出异常

      2.session的正确食用方法,哈哈哈

      

    @app.route("/login", methods=["GET", "POST"])
    def login():
        if request.method == "POST":
            if request.form["username"] == USER["username"] and request.form["password"] == USER["password"]:
                session["user"] = USER["username"]
                return redirect("/student_list")
            return render_template("login.html", msg="用户名密码错误")
    
        return render_template("login.html", msg=None)  # 如果前端Jinja2模板中使用了msg,这里就算是传递None也要出现msg

    session["user"] = USER["username"]这样用就代表这个请求带上来的session中保存了一个user = name如果想要验证session的话,就用这种方法吧

    3.cookies种的session是什么

    cookies中的session存储的是通过secret_key,通过这个key从Flask程序的内存中找到用户对应的session信息

    4.怎么用session进行验证

    @app.route("/student_list")
    def student():
        if session.get("user"):
            return render_template("student_list.html", student=STUDENT_DICT)
    
        return redirect("/login")
  • 相关阅读:
    寻找丢失的微服务-HAProxy热加载问题的发现与分析 原创: 单既喜 一点大数据技术团队 4月8日 在一点资讯的容器计算平台中,我们通过HAProxy进行Marathon服务发现。本文记录HAProxy服务热加载后某微服务50%概率失效的问题。设计3组对比实验,验证了陈旧配置的HAProxy在Reload时没有退出进而导致微服务丢失,并给出了解决方案. Keywords:HAProxy热加
    SEQ!org.apache.hadoop.io.LongWritable
    Discretized Streams: A Fault-Tolerant Model for Scalable Stream Processing
    Flume+NG+Performance+Measurements
    读写不同的线程
    flume 诞生背景 数据同步
    制定一套良好的健模式、语法和命名约定是高效稳定的解决方案和技术混乱的分水岭
    语义化 版本模式
    a
    基础数据结构 对应 基础api
  • 原文地址:https://www.cnblogs.com/guchenxu/p/10696638.html
Copyright © 2011-2022 走看看