欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

Flask基础之session验证与模板渲染语法(jinja2)

程序员文章站 2022-05-27 08:10:17
[TOC] 1.http传输请求头参数 request.headres 之 请求头中数据显示: 2.Flask中request.data参数处理 request.data 之 如果处理不了的就变成字符串儿存在data里面 request 是基于 mimetype 进行处理的 mimetype的类型 ......

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)