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)