FLASK 三剑客 request jinjia2
Flask Web 框架
Django 15
优势 : 组件全 - admin - Model ORM - Forms
教科书式
劣势 : 加载所有组件 - 占用资源较高
重型框架
Flask 3
优势 : 轻如鸿毛 扩展性极强 三方组件全
劣势 : 什么组件都没有
三方组件全 - 版本兼容问题 导致不稳
1.Flask 安装 + 启动
from flask import Flask
app = Flask(__name__)
app.run()
高级启动:
from flask import Flask
app = Flask(__name__)
@app.route("/")
def home():
return "Hello World!"
app.run()
2.Flask Response
1.HttpResponse("HelloWorld") "HelloWorld" 返回字符串
from flask import render_template 默认存放路径 templates
2.render("模板路径") render_template 返回模板
from flask import redirect 重定向
3.redirect("/")
Flask 中的返回特殊封装 2个
1.jsonify 转换标准JSON格式
响应头中加入 Content-type:application/json
在Flask 1.1.1 版本中 加入了 直接返回字典 可以不再使用jsonify了
2.send_file 发送文件
打开并返回文件内容,
自动识别文件类型,
响应头中加入Content-type:文件类型
ps:当浏览器无法识别Content-type时,会下载文件
3.Flask Request
假登录
405 请求方式不被允许 - GET请求可以 POST请求 405 Method Not Allowed
Form表单 - FormData
f orm - 表单
from flask import request 公共对象
1.request.form 获取FormData中的数据 - Form表单
2.request.args # 获取URL中的参数
3.request.files # 获取FormData中的文件数据
print(request.url) # 获取访问路径
print(request.method) # 获取请求方式
print(request.path) # 路由地址 /login
print(request.values) # Form 和 Args 中的数据
# 综合获取 X
print(request.args.get("id")) # 获取URL中的参数
print(request.args["id"]) # 获取URL中的参数
print(request.args.to_dict()) # 获取URL中的参数 转换成 字典
print(request.environ) # 获取请求原始信息
print(request.base_url) # 获取URL头,不包含参数
print(request.json) # 毁三观 1 请求头中 Content-type:application/json 数据序列化 request.json
print(request.data) # 毁三观 2 请求头中 Content-type 不包含 Form or data #####Content-type 位于 network all header
print(request.headers) # 请求头中的数据
4.Jinja2
{{}} 引用 or 执行
{%%} 逻辑语法 if else for
5.Flask中的Session 不是三方组件 //Flask-Session
from flask import session
session 交由客户端保管机制
# eyJ1c2VybmFtZSI6IjEyMyJ9.XSVpHA.W0NfiCmW-lsTV0mvQI7mx2mf1Wo
# .eJyrViotTi3KS8xNVbJSMjQyVtKBCxhiiBhhiBhjiJhgiJhiiJhBRWoBMFYkPg.XSVsaA.9merwNdTg3ZkZrdTumYRG7x8x7Y
# .eJyrViotTi3KS8xNVbJSMjQyVtKBCxhiiBhhiBhjiJhgiJhiiJhBRWoBMFYkPg.XSVsvg.6OqcN7CR6nrT2BtE-w1kBAr3xPo
# .eJxNzL0OgCAMBOB36exAoRTjs7jwUzcdNEzGdxckMV1u-e7uhnrJecRdYIG1eqS5pWCB6RccZDGtlQSjIvsRBxtbwZEmN8gZ21czK6JBiamtQhZF_qPAuR-WookH-dQO_WYiPC-8zDp8.XSVtLw.7I-z1bsqiWFln3cipbrVOpEE33g
反序列化机制 -
当客户端发起请求 - request 带上 Cookie - Cookie中有session的加密字符串 - Flask 收到Session加密字符串 - 通过secret_key解密session的加密字符串 - 获得 {username:123}
序列化机制 - 开启session - session["username"] = uname
先创建一个字典 {username:123} 接下来 通过secret_key + 时间戳 + 签名 加密 形成
# eyJ1c2VybmFtZSI6IjEyMyJ9.XSVpHA.W0NfiCmW-lsTV0mvQI7mx2mf1Wo session的加密字符串
代码
from flask import Flask, render_template, redirect, jsonify, send_file app = Flask(__name__) @app.route("/") def home(): return "Hello World!" @app.route("/index") def index(): return render_template("index.html") @app.route("/reback") def reback(): return redirect("/index") @app.route("/json") def my_jsonify(): # return jsonify({"a":1}) return {"k":"v"} @app.route("/my_file") def my_file(): return send_file("1.rar") app.run()
2
import os
from flask import Flask, render_template,request
app = Flask(__name__)
# app.config["DEBUG"] = True
app.debug = True
@app.route("/login",methods=["POST","GET"])
def login():
if request.method == "GET": # 请求方式
print(request.url) # 获取访问路径
print(request.method) # 获取请求方式
print(request.path) # 路由地址 /login
print(request.values) # 可以获取URL中的参数 也可以获取 FormData中的数据
# 综合获取 X
print(request.args.get("id")) # 获取URL中的参数
print(request.args["id"]) # 获取URL中的参数
print(request.args.to_dict()) # 获取URL中的参数 转换成 字典
print(request.environ) # 获取请求原始信息
print(request.base_url) # 获取URL头,不包含参数
print(request.json) # 毁三观 1 请求头中 Content-type:application/json 数据序列化 request.json
print(request.data) # 毁三观 2 请求头中 Content-type 不包含 Form or data
print(request.headers) # 请求头中的数据
return render_template("login.html")
if request.method == "POST":
print(request.headers)
print(request.values.to_dict()) # 可以获取URL中的参数
# print(request.form.to_dict())
username = request.form.get("username")
password = request.form["pwd"]
print(request.form)
# print(request.json) # 毁三观 1 请求头中 Content-type:application/json 数据序列化 request.json
# print(request.data) # 毁三观 2 请求头中 Content-type 不包含 Form or data 原始请求体数据
print(request.files.get("my_file"))
my_file = request.files.get("my_file")
# fp = os.path.join("templates",my_file.filename)
my_file.save(my_file.filename)
if username == "123" and password == "456":
return "登录成功"
else:
return "登录失败"
if __name__ == '__main__':
app.run()
3
from flask import Flask,render_template,Markup
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.config["DEBUG"] = True
@app.template_global()
def ab(a,b):
return a+b #定义了一个公共函数
@app.route("/index")
def index():
my_in = Markup("<input type='text' name='uname'>")
return render_template("index.html",
stu_info=STUDENT,
stu_list=STUDENT_LIST,
sd=STUDENT_DICT,m = my_in)
if __name__ == '__main__':
app.run("0.0.0.0",9527)
4
from datetime import timedelta
from flask import Flask,session,request,render_template,redirect
app = Flask(__name__)
app.secret_key = "#$%^&*#$%^&#$%2213123^&"
app.debug = True
app.session_cookie_name = "I am Not Session"
# app.testing = True
# app.permanent_session_lifetime = 15
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.route("/login",methods=["POST","GET"])
def login():
if request.method == "GET":
return render_template("login.html")
uname = request.form.get("username")
pwd = request.form.get("pwd")
if uname == "123" and pwd == "123":
session["username"] = "先帝"
session["12e1"] = "创业"
session["asdfas"] = "未半"
session["username3"] = "挂了"
session["username4"] = "此城"
session["username5"] = "益州"
session["username6"] = "疲弊"
return "200 OK"
else:
return "失败"
@app.route("/detail")
def detail():
# session["u"]
if session.get("username"):
return render_template("index.html",
stu_info=STUDENT,
stu_list=STUDENT_LIST,
sd=STUDENT_DICT)
else:
return redirect("/login")
if __name__ == '__main__':
app.run("0.0.0.0",9527)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 | login <! DOCTYPE html> < html lang="en"> < head > < meta charset="UTF-8"> < title >Title</ title > </ head > < body > < form action="/login?id=1&ids=2" method="post" enctype="multipart/form-data"> 用户名:< input type="text" name="username"> 密码:< input type="password" name="pwd"> < input type="file" name="my_file"> < input type="submit" value="登录"> </ form > </ body > </ html > index <! DOCTYPE html> < html lang="en"> < head > < meta charset="UTF-8"> < title >Title</ title > </ head > < body > {{ stu_info }} < table border="1px"> < tr > < td >name</ td > < td >age</ td > < td >gender</ td > </ tr > < tr > < td >{{ stu_info.name }}</ td > < td >{{ stu_info.get("age") }}</ td > < td >{{ stu_info["gender"] }}</ td > </ tr > </ table > {{ stu_list }} < table border="1px"> < tr > < td >name</ td > < td >age</ td > < td >gender</ td > </ tr > {% for foo in stu_list %} < tr > < td >{{ foo.name }}</ td > < td >{{ foo.get("age") }}</ td > < td >{% if foo["gender"] != "男" and foo["gender"] != "女" %} 女 {% else %} {{ foo["gender"] }} {% endif %} </ td > </ tr > {% endfor %} </ table > {{ sd }} < table border="1px"> < tr > < td >id</ td > < td >name</ td > < td >age</ td > < td >gender</ td > </ tr > {% for id,s in sd.items() %} for 循环 < tr > < td >{{ id }}</ td > < td >{{ s.name }}</ td > < td >{{ s.get("age") }}</ td > < td >{{ s["gender"] }}</ td > #django里只有s. jinjia2里 三种方法都可以 </ tr > {% endfor %} </ table > {#< center >{{ absum(1,2) }}</ center >#} /*{{}}执行函数*/ {#< center >{{ ab(2,2) }}</ center >#} {##} {#{% macro my_input(na,ty) %}#} #macro 宏指令 相当于 def {# < input type="{{ ty }}" name="{{ na }}">#} {#{% endmacro %}#} {##} {#{{ my_input("uname","text") }}#} {#{{ m }}#} </ body > </ html > |
jinjia2语言模板
{{ }}引用接收后端传过来的数据 or 执行函数
{% %} 逻辑 for if 等等 要 跟着 {% end(for/if....) %}
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 深入理解 Mybatis 分库分表执行原理
· 如何打造一个高并发系统?
· .NET Core GC压缩(compact_phase)底层原理浅谈
· 现代计算机视觉入门之:什么是图片特征编码
· .NET 9 new features-C#13新的锁类型和语义
· Spring AI + Ollama 实现 deepseek-r1 的API服务和调用
· 《HelloGitHub》第 106 期
· 数据库服务器 SQL Server 版本升级公告
· 深入理解Mybatis分库分表执行原理
· 使用 Dify + LLM 构建精确任务处理应用