传参
Flask的本质是渲染网页,是渲染写好的html,css,js。如果我们要进行数据可视化的操作的话,我们就需要把数据传递给html,或者可能一个网页需要用到另外一个网页的信息,比如说登录时,登录需要用户填写信息在登录页面,那么登录后的网页就可能需要显示登录页面时用户填写的信息,那么如何把数据进行一个跨页面的传递呢?
一般渲染传参
app.py代码:
from flask import Flask, render_template, request
app = Flask(__name__)
@app.route("/")
def index():
a = 10
# 定义变量a = 10
return render_template("my_index.html", ra=a)
# ra是a在html文件中的变量名称,名称可以随便起也可以叫rb或a等其他
if __name__ == "__main__":
app.run(debug=True)
# 调试模式开启后 不需要重新运行py文件
# 只需要刷新网页即可看到代码改动的样子
my_index.html代码:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>参数传递到html</title>
</head>
<body>
<h1>
您传的参数是{{ra}}
<!--从python文件传递过来的参数是要用{{}}括起来用的!-->
</h1>
</body>
</html>
网页效果:
一般渲染传参:直接在视图函数里面创建变量a,直接添加到render_template函数中并给a起个在html文件中的别名叫做ra,当然这个别名也可以是其他的名字。
路由渲染传参
app.py代码:
from flask import Flask, render_template, request
app = Flask(__name__)
@app.route("/<int:user_id>")
def index(user_id):
return render_template("my_index.html", id=user_id)
if __name__ == "__main__":
app.run(debug=True)
my_index.html代码:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>路由参数传递到html</title>
</head>
<body>
<h1>
您传的参数是{{id}}
</h1>
</body>
</html>
网页效果:
路由渲染传参:是在路由路径里面加入<数据类型:变量名称>就可以得到对应的变量,然后再通过一般渲染传参的方式传参。若不写数据类型和:,那么默认为string。此外还有float类型。
网页之间传参
app.py代码:
from flask import Flask, render_template, request
app = Flask(__name__)
@app.route("/login")
def login():
return render_template("login.html")
@app.route("/user/", methods=["POST", 'GET'])
def user():
if request.method == "POST":
# 如果请求的方式是POST
form = request.form
# 获取发送POST请求页面的form中的内容
# 这个form是类字典类型 可以用get方法获取属性
return render_template("my_index.html", id=form.get('age'))
if __name__ == "__main__":
app.run(debug=True)
my_index.html代码:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>路由参数传递到html</title>
</head>
<body>
<h1>
您传的参数是{{id}}
</h1>
</body>
</html>
login.html代码:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>登录界面</title>
</head>
<body>
<h1>
图书馆登录界面
</h1>
<form action="{{url_for('user')}}" method="post">
<p>姓名:<input type="text" name="name"></p>
<p>年龄:<input type="text" name="age"></p>
<p><input type="submit" value="提交"></p>
</form>
</body>
</html>
网页效果:
网页之间传参:我们看login.html中是有form组件的,form里面有两个输入框一个叫姓名,一个叫年龄,还有一个叫提交的按钮,当我们按下按钮后,就会向action里的路由发送post请求,这个action里面的路由可以对应到app.py里面的@app.route("/user/"),也就是说按下这个按钮就给我跳到 域名/user/ 这个网址。我们再看app.py里的@app.route("/user/")那一行,有个method,意为方法,默认是GET,只接受获取请求,现在给它多写个POST,意为传递,可接受传递请求。具体解释请看代码注释。
渲染传参但是对象和字典
app.py代码:
from flask import Flask, render_template, request
app = Flask(__name__)
class User:
def __init__(self, name=" ", age=0):
self.name = name
self.age = int(age)
@app.route("/jude/")
def jude():
a = User(name="小王", age=18)
# books = {"西游记": "吴承恩", "水浒传": "施耐庵", "红楼梦": "曹雪芹", "三国演义": "罗贯中"}
books = [
{"name": "西游记",
"person": "吴承恩"},
{"name": "水浒传",
"person": "施耐庵"},
{"name": "红楼梦",
"person": "曹雪芹"},
{"name": "三国演义",
"person": "罗贯中"}
]
return render_template("jude.html", user_a=a, books=books)
if __name__ == "__main__":
app.run(debug=True)
jude.html代码:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>条件判断和循环输出</title>
</head>
<body>
{% if user_a.age >= 18 %}
<h1>
尊敬的{{user_a.name}},您已成年,可阅读本图书室的图书
<!-- 可以通过.来访问对象的属性-->
</h1>
<p>
本图书室的图书有:
</p>
<table border="1"> <!--表格-->
<thead><!--表头-->
<tr>
<td>图书名称</td>
<td>图书作者</td>
</tr>
</thead>
<tbody><!--表体-->
{% for book in books %}
<tr>
<td>{{book.name}}</td>
<td>{{book.person}}</td>
<!-- books里面放的是一堆字典 -->
<!-- book 是字典类型 -->
<!-- 可以通过.来访问字典的属性 -->
</tr>
{% endfor %}
</tbody>
</table>
{% elif user_a.age<18 %}
<h1>尊敬的{{user_a.name}},您未成年,不可阅读本图书室的图书</h1>
{% endif %}
</body>
</html>
网页效果:
渲染传参但是对象和字典:字典和对象传入html文件的方式与一般变量没有区别,主要是在传入html文件后的使用语法。在把字典和对象传入html文件后,我们可以通过.的方式访问字典或者对象的属性,当然也可以通过[]来访问字典的属性,但是.更方便一点
flask在html中的循环和判断语句
在jude.html文件中我们可以看到{% for book in books %},{% if user_a.age >= 18 %}和{% elif user_a.age<18 %}这样的语句,这正是在flask在html中的循环和判断语句,跟Python的循环和判断语句差不多但是要带上{% %}这样的符号,并且不论是循环还是判断都需要一个终止语句,如果是循环那么就是{% endfor %},如果是判断就是{% endif %},这很符合html的风格无论是啥都是有始有终。
html的页码---随记
app.py代码:
from flask import Flask, render_template, request
app = Flask(__name__)
@app.route("/book")
def book_page():
# args: 参数
rpage = request.args.get("page", default=1, type=int)
# 名字叫做 page
# default 初始值为 1 页
# type 是 整型
return f"您获取的网页是第{rpage}页"
if __name__ == "__main__":
app.run(debug=True)
网页效果:
我们根据网址的变化不难发现当我们的page等于几时就会显示第几页。