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

网友投稿 329 2022-06-21


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://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文件:

...

用户名:

密码:

...

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文件:

Title

{# 普通字典数据处理 #}

{{ stu_info }}

nameagegender
{{ stu_info.name }}{{ stu_info.age }}{{ stu_info.gender }}

{# 列表中嵌套字典数据的处理 #}


{{ stu_list }}

{% for foo in stu_list %}

{% if foo.gender != "男" and foo.gender != "女" %}

{% else %}

{% endif %}

{% endfor %}

nameagegender
{{ foo.name }}{{ foo.age }}{{ foo.gender }}

{# 字典数据类型处理 #}


{{ sd }}

{% for k,v in sd.items() %}

{% endfor %}

nameagegender
{{ v.name }}{{ v.age }}{{ v.gender }}

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

...

自定义的方法ab

输出结果:{{ ab(1,2) }}


{{ 1 | a_b_c_sum(197,2) }}

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("")

return render_template("index1.html", m=my_in)

if __name__ == '__main__':

# 定义访问ip与port

app.run("0.0.0.0", 9527)

HTML文件:

...


通过后端代码创建一个标签:

输入框:{{ m }}

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

from flask import Flask, render_template

app = Flask(__name__)

app.debug = True

@app.route("/index")

def index():

my_in = ""

return render_template("index1.html", m=my_in)

if __name__ == '__main__':

# 定义访问ip与port

app.run("0.0.0.0", 9527)

HTML文件:

...


通过前端过滤器创建一个标签:

输入框:{{ m | safe }}

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是直接在前端实现标签的创建,目前有点鸡肋,没什么用处

...


通过macro方式创建一个标签:

{% macro my_input(na, ny) %}

{% endmacro %}

输入框:{{ my_input("uname", "type") }}

9.Jinja2模板复用 block

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

前端代码:

index.html 文件中的内容

Title

下面的内容是不一样的

{% block content %}

{% endblock %}

上面的内容是不一样的,但是下面的内容是一样的

Title

Welcome OldboyEDU

下面的内容是不一样的

{% block content %}

{% endblock %}

上面的内容是不一样的,但是下面的内容是一样的

OldboyEDU is Good

login.html 文件中的内容

{% extends "index.html" %}

{% block content %}

用户名:

密码:

{% endblock %}

{% extends "index.html" %}

{% block content %}

用户名:

密码:

{% 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 文件中的内容:

用户名:

密码:

index.html 文件中的内容

Title

Welcome

下面的内容是不一样的

{% include "login.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)


版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:python 初始化__init__()
下一篇:Flask 中内置的 Session 应用(flask连接mysql数据库)
相关文章

 发表评论

暂时没有评论,来抢沙发吧~