一、配置flask
在Python环境下使用控制台的pip install命令进行安装
pip install Flask==2.1.0
!!!安装版本必须是2.x以上,否则可能出现错误:cannot import name 'escape' from 'jinja2' (flask 2.x放弃了对jinjia2的支持所以不会出现此问题)
本文中所有操作均基于vscode,如需了解vscode如何配置请参见之前的博客:在VS Code下搭建PyTorch环境https://blog.csdn.net/weixin_37878740/article/details/127069779
二、创建项目
直接新建一个py文件(对,直接新建,不用参照网上什么乱七八糟的改配置文件),在其中输入以下代码:
from flask import Flask #导入Flask包
app = Flask(__name__)
@app.route('/') #设置路由
def hello_world():
return "Hello World"
if __name__ == "__main__": #启动程序
app.run()
按F5启动后用浏览器访问控制台下出现的网址即可。控制台也会实时接显示收到的http命令
其中@app.route和后面的视图函数映射为其主要功能区块,通过更改路由路径即可实现不同路径的不同返回。
@app.route('/Fxxk')
def Fxxk():
return "So, Nivda Fxxk U"
三、参数设置
①Debug模式
启用Debug模式后可以实现实时修改实时查看,否则必须重启项目才能查看修改部分。
有两种启动方法
app.debug = True
app.run()
app.run(debug=True)
看到控制台有以下显示即开启成功
②修改Host和Port
同上可以采用两种方法,这里展示方法2。同时,申请的端口号必须是没有被占据的端口号,比如你申请192.168.1.1就会报错。
app.run(host='127.0.0.2',port=5003,debug=True)
四、URL传参
①直接传参
@app.route('/login/<id>')
def LogIn(id):
return "欢迎回来{}".format(id)
如出现错误:发生异常: SystemExit。可将调试器中的此项关闭
如需要指定类型可以在参数前添加类型指定,如:
@app.route('/login/<int:id>')
def LogIn(id):
return "欢迎回来{}".format(id)
常见的类型如下:
string | 字符串型,但是不能接受/ |
int | 整型 |
float | 浮点型 |
path | 字符串路径,可以接受/ |
uuid | UUID类型,有一组32位的16进制数据构成 |
any | 备选值中的任何类型,类似于枚举,示例:<any(a,b,c):type> |
②Request传参
需要导入request包
from flask import request
@app.route('/book/list')
def book_list():
page = request.args.get("page",default=1,type=int) #参数名,默认参数,参数类型
return "您要查看的是{}页".format(page)
五、渲染HTML文件
①渲染静态文件
新建一个html文件,按照惯例建议存放在工程文件目录下的templates文件夹下。
在Python代码中需要导入render_template,随后在视图映射函数中将返回修改为:
@app.route('/')
def hello_world():
return render_template("index.html")
函数会自动在templates文件夹下查找同名的文件并渲染返回给浏览器 。
②渲染动态文件
获取参数的方式与第四章URL传参一致,但是需要使用render_template进行参数传递,即在页面后面将参数赋值给页面即可
@app.route('/login/<id>')
def LogIn(id):
return render_template("login.html",id = id)
随后在页面中也需要进行相应的操作,使用双花括号括住需要的变量名即可
<html lang="en">
<head>
<meta charset="UTF-8">
<title>∞</title>
</head>
<body>
<h1>您登录的账号为:{{id}}</h1>
</body>
</html>
③访问自定义类型
如果需要通过自定义类型传递数据的话,仅需要将类作为参数传递给html,然后在html中使用类型名.属性名的方法访问即可。
class User:
def __init__(self,username,email):
self.username=username
self.email=email
@app.route('/IKUN')
def LogIn():
user = User(username="iKun",email="JNTM@kun.com")
return render_template("login.html",user=user)
<h1>您的账号为:{{user.username}}</h1>
<h1>您的邮箱为:{{user.email}}</h1>
但如果传递的是Json字典的话,则在HTML文件中可以使用两种方法对其进行访问:
①类型名.属性名
②类型名['属性名']
user = {
"username":"iKun",
"email":"JNTM@kun.com"
}
<h1>您的账号为:{{user['username']}}</h1>
<h1>您的邮箱为:{{user.email}}</h1>
④过滤器
过滤器可以在HTML页面中进行一些检查的数据处理,使用过滤器需要借助管道操作符 | ,来实现,在HTML中做如下修改
<h1>您的账号长度为{{user.username|length}}</h1>
Jinja2具体过滤器的种类以及功效请参见HTML专题(别点了,还没写呢)
自定义过滤器:过滤器的本质是python代码,所以也可以在python文件中进行自行编写,定义方法如下:
def Datefomat(value,format="%Y年%m月%d日 %H:%M"):
return value.strftime(format)
value为需要处理的值,必不可少,其他的看需求自行定义。
随后使用app.add_template_filter将该过滤器添加到模板中,参数1为函数名,参数2为在HTML中调用的名称。
app.add_template_filter(Datefomat,"dformat")
随后在HTML中和普通过滤器一样调用即可。
<h1>当前时间为:{{Now|dformat}}</h1>
⑤控制语句
Jinja2模板中包含两组控制语句:if-else和for。
{ % if 条件 % }
接实现的HTML
{ % elif 条件 % }
接实现的HTML
{ % else 条件 % }
接实现的HTML
{ % endif % }
注意:必须要有endif结尾,否则会报错
{% for book in books %}
<div>图书名称{{book.name}},作者{{book.author}}</div>
{% endfor %}
同样需要结尾收束,且不能中途中断。
⑥加载静态文件
静态文件需置于static文件夹下,可在控件中使用文件路径的方式进行加载。这里以图片为例。
将图片路径作为网页参数传递。
@app.route('/Img')
def LoadImg():
imgId = request.args.get("id",type=str)
return render_template("Loader.html",imgId = imgId)
HTML中以url_for进行加载,第一个参数默认为static
<img src="{{url_for('static',filename=imgId)}}" alt="">
同时也可加载js脚本
<scrip src="{{url_for("static",filename='js/my.js')}}"/>