zoukankan      html  css  js  c++  java
  • Flask基础之session验证与模板渲染语法(jinja2)

    1.http传输请求头参数

    request.headres 之 请求头中数据显示:

    print(type(request.headers))
        """
        Host: 127.0.0.1:5000
        User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:60.0) Gecko/20100101 Firefox/60.0
        Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
        Accept-Language: zh-CN,zh;q=0.8,zh-TW;q=0.7,zh-HK;q=0.5,en-US;q=0.3,en;q=0.2
        Accept-Encoding: gzip, deflate
        Referer: http://127.0.0.1:5000/home
        Content-Type: application/x-www-form-urlencoded
        Content-Length: 26
        Cookie: csrftoken=vDIozqveCEfArdYXlM6goHVlSQEn7h4bDygNphL2Feas60DiM2di0jlqKfxo7xhA
        Connection: keep-alive
        Upgrade-Insecure-Requests: 1
        Cache-Control: max-age=0
        """
    

    2.Flask中request.data参数处理

    request.data 之 如果处理不了的就变成字符串儿存在data里面

    request 是基于 mimetype 进行处理的

    mimetype的类型 以及 字符串儿 : http://www.w3school.com.cn/media/media_mimeref.asp

    如果不属于上述类型的描述,request就会将无法处理的参数转为Json存入到 data 中

    其实我们可以将 request.data , json.loads 同样可以拿到里面的参数

    其他request参数:

    request.获取各种路径之这些方法没必要记,但是要知道它存在
    
    
        # 获取当前的url路径
        print(request.path)# /req
        # 当前url路径的上一级路径
        print(request.script_root) #
        # 当前url的全部路径
        print(request.url) # http://127.0.0.1:5000/req
        # 当前url的路径的上一级全部路径
        print(request.url_root ) # http://127.0.0.1:5000/
    

    3.Flask中request.json参数

    request.json 数据在提交数据时,需要指定参数的格式是json格式

    如果在请求中写入了 "application/json" 使用 request.json 则返回json解析数据, 否则返回 None

    4.Flask中的session管理

    Flask中的session是flask自带的模块

    session生成机制:先创建一个字典,再secret_key + 时间戳 + flask内置签名 加密 形成

    • secret_key :可以任意指定一个加密字符串
    • 时间戳:保存session的过期时间
    • 签名:内置签名,应用于session加密

      实例:

    from datetime import timedelta
    from flask import Flask, session, request, render_template, redirect
    
    app = Flask(__name__)
    # 随机创建一个session的key
    app.secret_key = "#$%^&*#$%^&#$%2213123^&"
    # 调试模式
    app.debug = True
    # 更改session的名字
    app.session_cookie_name = "I am Not Session"
    
    
    # 设置session的过期时间,15秒
    # app.permanent_session_lifetime = 15
    
    
    @app.route("/login", methods=["POST", "GET"])
    def login():
        if request.method == "GET":
            return render_template("login.html")
        else:
            uname = request.form.get("username")
            pwd = request.form.get("pwd")
    
            if uname == "123" and pwd == "123":
                # 设置session
                session["username"] = uname
                return "200 OK"
            else:
                return "登录失败!"
    
    
    @app.route("/detail")
    def detail():
        # 验证session设置是否成功
        if session.get("username"):
            return render_template("index.html")
        else:
            return redirect("/login")
    
    
    if __name__ == '__main__':
        app.run("0.0.0.0", 9527)
    

      HTML文件:

    ...
    <form action="" method="post" enctype="multipart/form-data">
        用户名:<input type="text" name="username">
        密码:<input type="password" name="pwd">
        <input type="submit" value="提交">
    </form>
    ...
    

    5.Flask中模板语法(if,for语法数据处理)

      falsk模板语法是基于jinja2语法实现

    from flask import Flask, render_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': '女'},
    }
    
    app = Flask(__name__)
    app.debug = True
    
    @app.route("/index")
    def index():
        return render_template("index1.html",
                               stu_info=STUDENT,
                               stu_list=STUDENT_LIST,
                               sd=STUDENT_DICT)
    
    
    if __name__ == '__main__':
        # 定义访问ip与port
        app.run("0.0.0.0", 9527)
    

      HTML文件:

    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <title>Title</title>
    </head>
    <body>
    {# 普通字典数据处理 #}
    {{ stu_info }}
    <table border="1ps">
        <tr>
            <td>name</td>
            <td>age</td>
            <td>gender</td>
        </tr>
        <tr>
            <td>{{ stu_info.name }}</td>
            <td>{{ stu_info.age }}</td>
            <td>{{ stu_info.gender }}</td>
    
        </tr>
    </table>
    {# 列表中嵌套字典数据的处理 #}
    <hr>
    {{ stu_list }}
    <table border="1ps">
        <tr>
            <td>name</td>
            <td>age</td>
            <td>gender</td>
        </tr>
        {% for foo in stu_list %}
        <tr>
            <td>{{ foo.name }}</td>
            <td>{{ foo.age }}</td>
            {% if foo.gender != "男" and foo.gender != "女" %}
                <td>女</td>
            {% else %}
                <td>{{ foo.gender }}</td>
            {% endif %}
        </tr>
        {% endfor %}
    </table>
    {# 字典数据类型处理 #}
    <hr>
    {{ sd }}
    <table border="1ps">
        <tr>
            <td>name</td>
            <td>age</td>
            <td>gender</td>
        </tr>
        {% for k,v in sd.items() %}
            <tr>
                <td>{{ v.name }}</td>
                <td>{{ v.age }}</td>
                <td>{{ v.gender }}</td>
            </tr>
        {% endfor %}
    </table>
    
    
    </body>
    </html>
    

    6.Flask中模板语法(自定义函数方法)

    通过定义全局变量的方法,不需要导入则可以直接在模板中使用:

    from flask import Flask, render_template  #装饰自定义方法
    
    app = Flask(__name__)
    app.debug = True
    
    
    # 自定义方法,这里装饰的函数是一个全局变量
    @app.template_global()
    def ab(a, b):
        return a + b
    @app.template_filter()  # 定义全局模板函数
    def a_b_c_sum(a, b, c):
        return a + b + c
    @app.route("/index")
    def index():
        return render_template("index1.html")
    
    
    if __name__ == '__main__':
        # 定义访问ip与port
        app.run("0.0.0.0", 9527)
    

    HTML文件:输出结果3

    ...
    <body>
    
    <h3>自定义的方法ab</h3>
    输出结果:{{ ab(1,2) }}
    <br>
        {{ 1 | a_b_c_sum(197,2) }}
    </body> </html>
    

    7.Flask中模板语法(后端创建标签)

    7.1 后端通过Markup方法实现标签:

    后端创建一个字符串标签,通过Markup指定字符串是一个标签,否则前端则会显示一个字符串

    from flask import Flask, render_template, Markup
    
    app = Flask(__name__)
    app.debug = True
    
    
    @app.route("/index")
    def index():
        # Markup标签转义,字符串转换成标签
        my_in = Markup("<input type='text' name='uname'>")
        return render_template("index1.html", m=my_in)
    
    
    if __name__ == '__main__':
        # 定义访问ip与port
        app.run("0.0.0.0", 9527)
    

    HTML文件:

    ...
    <body>
    
    <hr>通过后端代码创建一个标签:
    输入框:{{ m }}
    
    </body>
    </html>
    

    7.2 前端通过safe过滤器实现标签:

    from flask import Flask, render_template
    
    app = Flask(__name__)
    app.debug = True
    
    
    @app.route("/index")
    def index():
        my_in = "<input type='text' name='uname'>"
        return render_template("index1.html", m=my_in)
    
    
    if __name__ == '__main__':
        # 定义访问ip与port
        app.run("0.0.0.0", 9527)
    

      HTML文件:

    ...
    <body>
    
    <hr>通过前端过滤器创建一个标签:
    输入框:{{ m | safe }}   
    
    </body>
    </html>
    

    8.Flask中模板语法(macro方法)

    from flask import Flask, render_template
    
    
    app = Flask(__name__)
    app.debug = True
    
    
    @app.route("/index")
    def index():
        return render_template("index1.html")
    
    
    if __name__ == '__main__':
        # 定义访问ip与port
        app.run("0.0.0.0", 9527)
    

    HTML文件:

    mscro是直接在前端实现标签的创建,目前有点鸡肋,没什么用处

    ...
    <body>
    
    <hr>通过macro方式创建一个标签:
    {% macro my_input(na, ny) %}
        <input type="{{ ny }}" name="{{ na }}">
    {% endmacro %}
    
    输入框:{{ my_input("uname", "type") }}
    
    </body>
    </html>
    

    9.Jinja2模板复用 block

    如果我们前端页面有大量重复页面,没必要每次都写,可以使用模板复用的方式复用模板

    前端代码:

    index.html 文件中的内容

    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <title>Title</title>
    </head>
    <body>
        <h2>下面的内容是不一样的</h2>
        {% block content %}
    
        {% endblock %}
        <h2>上面的内容是不一样的,但是下面的内容是一样的</h2>
    </body>
    </html>
    
    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <title>Title</title>
    </head>
    <body>
        <h1>Welcome OldboyEDU</h1>
        <h2>下面的内容是不一样的</h2>
        {% block content %}
    
        {% endblock %}
        <h2>上面的内容是不一样的,但是下面的内容是一样的</h2>
        <h1>OldboyEDU is Good</h1>
    </body>
    </html>
    

    login.html 文件中的内容

    {% extends "index.html" %}
    {% block content %}
        <form>
            用户名:<input type="text" name="user">
            密码:<input type="text" name="pwd">
        </form>
    {% endblock %}
    
    {% extends "index.html" %}
    {% block content %}
        <form>
            用户名:<input type="text" name="user">
            密码:<input type="text" name="pwd">
        </form>
    {% endblock %}
    

    后端代码:

    from flask import Flask
    from flask import render_template
    
    app = Flask(__name__)
    
    
    @app.route("/login")
    def login():
        return render_template("login.html")
    
    
    @app.route("/home")
    def home():
        return render_template("home.html")
    
    
    app.run("0.0.0.0", 5000, debug=True)
    

    10.Jinja2模板语言的模块引用 include

    include模板语法:就是将 login.html 当成一个模块,加载到 index.html 页面中

    login.html 文件中的内容:

    <form>
        用户名:<input type="text" name="user">
        密码:<input type="text" name="pwd">
    </form>
    

    index.html 文件中的内容

    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <title>Title</title>
    </head>
    <body>
        <h1>Welcome</h1>
        <h2>下面的内容是不一样的</h2>
        {% include "login.html" %}
        <h2>上面的内容是不一样的,但是下面的内容是一样的</h2>
    </body>
    </html>
    

    后端代码:

    from flask import Flask
    from flask import render_template
    
    app = Flask(__name__)
    
    
    @app.route("/")
    def index():
        return render_template("index.html")
    
    
    app.run("0.0.0.0", 5000, debug=True)
    
  • 相关阅读:
    (转)elasticsearch5.2.2 压测配置
    (转) Elasticsearch 5.0 安装 Search Guard 5 插件
    (转)设置Sysctl.conf用以提高Linux的性能(最完整的sysctl.conf优化方案)
    分布式搜索elasticsearch配置文件详解
    (转)ActiveMQ的重连机制
    (转)Linux 命令--查看物理CPU个数、核数、逻辑CPU个数
    哈佛大学凌晨4点半的景象
    (转)关于ActiveMQ的配置
    最大似然估计 (Maximum Likelihood Estimation), 交叉熵 (Cross Entropy) 与深度神经网络
    TensorFlow的开源与Hadoop的开源
  • 原文地址:https://www.cnblogs.com/fengqiang626/p/11889230.html
Copyright © 2011-2022 走看看