一、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)