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

一、http传输请求头参数

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

 1   print(type(request.headers))
 2     """
 3     Host: 127.0.0.1:5000
 4     User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:60.0) Gecko/20100101 Firefox/60.0
 5     Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
 6     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
 7     Accept-Encoding: gzip, deflate
 8     Referer: http://127.0.0.1:5000/home
 9     Content-Type: application/x-www-form-urlencoded
10     Content-Length: 26
11     Cookie: csrftoken=vDIozqveCEfArdYXlM6goHVlSQEn7h4bDygNphL2Feas60DiM2di0jlqKfxo7xhA
12     Connection: keep-alive
13     Upgrade-Insecure-Requests: 1
14     Cache-Control: max-age=0
15     """
 

二、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参数:

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

三、Flask中request.json参数

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

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

四、Flask中的session管理

  Flask中的session是flask自带的模块

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

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

  实例:

 1 from datetime import timedelta
 2 from flask import Flask, session, request, render_template, redirect
 3 
 4 app = Flask(__name__)
 5 # 随机创建一个session的key
 6 app.secret_key = "#$%^&*#$%^&#$%2213123^&"
 7 # 调试模式
 8 app.debug = True
 9 # 更改session的名字
10 app.session_cookie_name = "I am Not Session"
11 
12 
13 # 设置session的过期时间,15秒
14 # app.permanent_session_lifetime = 15
15 
16 
17 @app.route("/login", methods=["POST", "GET"])
18 def login():
19     if request.method == "GET":
20         return render_template("login.html")
21     else:
22         uname = request.form.get("username")
23         pwd = request.form.get("pwd")
24 
25         if uname == "123" and pwd == "123":
26             # 设置session
27             session["username"] = uname
28             return "200 OK"
29         else:
30             return "登录失败!"
31 
32 
33 @app.route("/detail")
34 def detail():
35     # 验证session设置是否成功
36     if session.get("username"):
37         return render_template("index.html")
38     else:
39         return redirect("/login")
40 
41 
42 if __name__ == '__main__':
43     app.run("0.0.0.0", 9527)

  HTML文件:

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

五、Flask中模板语法(if,for语法数据处理)

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

 1 from flask import Flask, render_template
 2 
 3 STUDENT = {'name': 'Old', 'age': 38, 'gender': ''}
 4 
 5 STUDENT_LIST = [
 6     {'name': 'Old', 'age': 38, 'gender': ''},
 7     {'name': 'Boy', 'age': 73, 'gender': ''},
 8     {'name': 'EDU', 'age': 84, 'gender': ''}
 9 ]
10 
11 STUDENT_DICT = {
12     1: {'name': 'Old', 'age': 38, 'gender': ''},
13     2: {'name': 'Boy', 'age': 73, 'gender': ''},
14     3: {'name': 'EDU', 'age': 84, 'gender': ''},
15 }
16 
17 app = Flask(__name__)
18 app.debug = True
19 
20 @app.route("/index")
21 def index():
22     return render_template("index1.html",
23                            stu_info=STUDENT,
24                            stu_list=STUDENT_LIST,
25                            sd=STUDENT_DICT)
26 
27 
28 if __name__ == '__main__':
29     # 定义访问ip与port
30     app.run("0.0.0.0", 9527)

  HTML文件:

 1 <!DOCTYPE html>
 2 <html lang="en">
 3 <head>
 4     <meta charset="UTF-8">
 5     <title>Title</title>
 6 </head>
 7 <body>
 8 
 9 {# 普通字典数据处理 #}
10 {{ stu_info }}
11 <table border="1ps">
12     <tr>
13         <td>name</td>
14         <td>age</td>
15         <td>gender</td>
16     </tr>
17     <tr>
18         <td>{{ stu_info.name }}</td>
19         <td>{{ stu_info.age }}</td>
20         <td>{{ stu_info.gender }}</td>
21 
22     </tr>
23 </table>
24 
25 {# 列表中嵌套字典数据的处理 #}
26 <hr>
27 {{ stu_list }}
28 <table border="1ps">
29     <tr>
30         <td>name</td>
31         <td>age</td>
32         <td>gender</td>
33     </tr>
34     {% for foo in stu_list %}
35     <tr>
36         <td>{{ foo.name }}</td>
37         <td>{{ foo.age }}</td>
38         {% if foo.gender != "" and foo.gender != "" %}
39             <td>女</td>
40         {% else %}
41             <td>{{ foo.gender }}</td>
42         {% endif %}
43     </tr>
44     {% endfor %}
45 </table>
46 
47 {# 字典数据类型处理 #}
48 <hr>
49 {{ sd }}
50 <table border="1ps">
51     <tr>
52         <td>name</td>
53         <td>age</td>
54         <td>gender</td>
55     </tr>
56     {% for k,v in sd.items() %}
57         <tr>
58             <td>{{ v.name }}</td>
59             <td>{{ v.age }}</td>
60             <td>{{ v.gender }}</td>
61         </tr>
62     {% endfor %}
63 </table>
64 
65 
66 </body>
67 </html>

六、Flask中模板语法(自定义函数方法)

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

 1 from flask import Flask, render_template  #装饰自定义方法
 2 
 3 app = Flask(__name__)
 4 app.debug = True
 5 
 6 
 7 # 自定义方法,这里装饰的函数是一个全局变量
 8 @app.template_global()
 9 def ab(a, b):
10     return a + b
11 
12 
13 @app.template_filter()  # 定义全局模板函数
14 def a_b_c_sum(a, b, c):
15     return a + b + c
16 @app.route("/index")
17 def index():
18     return render_template("index1.html")
19 
20 
21 if __name__ == '__main__':
22     # 定义访问ip与port
23     app.run("0.0.0.0", 9527)

  HTML文件:输出结果3

 1 ...
 2 <body>
 3 
 4 <h3>自定义的方法ab</h3>
 5 输出结果:{{ ab(1,2) }}
 6 
 7 <br>
 8     {{ 1 | a_b_c_sum(197,2) }}
 9 </body> 
10 </html>
 

七、Flask中模板语法(后端创建标签)

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

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

 1 from flask import Flask, render_template, Markup
 2 
 3 app = Flask(__name__)
 4 app.debug = True
 5 
 6 
 7 @app.route("/index")
 8 def index():
 9     # Markup标签转义,字符串转换成标签
10     my_in = Markup("<input type='text' name='uname'>")
11     return render_template("index1.html", m=my_in)
12 
13 
14 if __name__ == '__main__':
15     # 定义访问ip与port
16     app.run("0.0.0.0", 9527)

  HTML文件:

1 ...
2 <body>
3 
4 <hr>通过后端代码创建一个标签:
5 输入框:{{ m }}
6 
7 </body>
8 </html>

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

 1 from flask import Flask, render_template
 2 
 3 app = Flask(__name__)
 4 app.debug = True
 5 
 6 
 7 @app.route("/index")
 8 def index():
 9     my_in = "<input type='text' name='uname'>"
10     return render_template("index1.html", m=my_in)
11 
12 
13 if __name__ == '__main__':
14     # 定义访问ip与port
15     app.run("0.0.0.0", 9527)

  HTML文件:

1 ...
2 <body>
3 
4 <hr>通过前端过滤器创建一个标签:
5 输入框:{{ m | safe }}   
6 
7 </body>
8 </html>
 

八、Flask中模板语法(macro方法)

 1 from flask import Flask, render_template
 2 
 3 
 4 app = Flask(__name__)
 5 app.debug = True
 6 
 7 
 8 @app.route("/index")
 9 def index():
10     return render_template("index1.html")
11 
12 
13 if __name__ == '__main__':
14     # 定义访问ip与port
15     app.run("0.0.0.0", 9527)

  HTML文件:

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

 1 ...
 2 <body>
 3 
 4 <hr>通过macro方式创建一个标签:
 5 {% macro my_input(na, ny) %}
 6     <input type="{{ ny }}" name="{{ na }}">
 7 {% endmacro %}
 8 
 9 输入框:{{ my_input("uname", "type") }}
10 
11 </body>
12 </html>

 九、Jinja2模板复用 block

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

  前端代码:

  index.html 文件中的内容

 1 <!DOCTYPE html>
 2 <html lang="en">
 3 <head>
 4     <meta charset="UTF-8">
 5     <title>Title</title>
 6 </head>
 7 <body>
 8     <h2>下面的内容是不一样的</h2>
 9     {% block content %}
10 
11     {% endblock %}
12     <h2>上面的内容是不一样的,但是下面的内容是一样的</h2>
13 </body>
14 </html>

  login.html 文件中的内容

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

  后端代码:

 1 from flask import Flask
 2 from flask import render_template
 3 
 4 app = Flask(__name__)
 5 
 6 
 7 @app.route("/login")
 8 def login():
 9     return render_template("login.html")
10 
11 
12 @app.route("/home")
13 def home():
14     return render_template("home.html")
15 
16 
17 app.run("0.0.0.0", 5000, debug=True)
 

十、Jinja2模板语言的模块引用 include

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

  login.html 文件中的内容:

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

  index.html 文件中的内容

 1 <!DOCTYPE html>
 2 <html lang="en">
 3 <head>
 4     <meta charset="UTF-8">
 5     <title>Title</title>
 6 </head>
 7 <body>
 8     <h1>Welcome</h1>
 9     <h2>下面的内容是不一样的</h2>
10     {% include "login.html" %}
11     <h2>上面的内容是不一样的,但是下面的内容是一样的</h2>
12 </body>
13 </html>

后端代码:

 1 from flask import Flask
 2 from flask import render_template
 3 
 4 app = Flask(__name__)
 5 
 6 
 7 @app.route("/")
 8 def index():
 9     return render_template("index.html")
10 
11 
12 app.run("0.0.0.0", 5000, debug=True)

猜你喜欢

转载自www.cnblogs.com/zhaohaiyu/p/11891191.html