python flask框架(SSTI模板注入前置知识)

什么是flask

flask是一个采用python语言编写的web框架

WSGI工具箱采用Werkzeug,模板引擎使用Jinjia2。

python虚拟环境搭建

  • 需要venv(python的虚拟环境)

创建venv环境安装flask

1
apt install python3-venv

在opt目录下创建虚拟环境运行flask

1
2
cd /opt
python3 -m venv flask1

如何运行真实环境和虚拟环境下的.py文件

真实环境:

1
python3 demo.py

虚拟环境:

方法一

1
/opt/flask1/bin/python3 demo.py

方法二(激活虚拟环境)(退出虚拟环境的命令是:deactivate)

1
2
3
cd flask1
source ./bin/activate
python3 demo.py

安装flask框架

在虚拟环境下安装flask框架

1
2
3
cd /opt/flask1
source ./bin/activate
pip install flask

测试是否安装成功

1
2
3
python3
>>> import flask
>>> quit()

flask的应用

一个简单的python演示程序

功能:当访问网站根路径时会输出“hello benben”

1
2
3
4
5
6
7
8
9
10
11
12
13
from flask import Flask //导入Flask类
app = Flask(__name__) //创建一个Flask应用程序实例。 这里的__name__是一个特殊的全局变量。

@app.route("/") //定义一个路由“/”(根路径)。当用户访问根路径时,hello函数将会被调用。
def hello():
return "hello benben"

@app.route("/dazhuang") //定义路由"/dazhuang",同理
def dazhuang():
return "hello dazhuang"

if __name__ == '__main__': //代码块用于确保只有在直接运行这个脚本时才启动 Flask 服务器。
app.run() //这里的run方法里面可以带参数。例:app.run(host='0.0.0.0',port='8081',debug=True)
  1. 当一个 Python 文件(模块)被直接执行时,__name__ 的值将会是字符串 "__main__"。这意味着这个模块是主程序,它正在被直接运行。
  2. 当一个 Python 文件(模块)被导入到其他模块中时,__name__ 的值将是该模块的名称(不包括文件扩展名)。这意味着这个模块是作为一个库或模块被导入到其他代码中使用的。

在opt目录下编写如下代码并命名为“demo.py”,在python虚拟环境运行

1
python3 demo.py

image-20231007190114289

然后访问127.0.0.1:5000(flask默认在5000端口运行)

image-20231007185956336

image-20231007190010527

flask变量及方法

例:

在下面的示例中,route() 装饰器的规则参数包含一个附加到 URL ‘/hello’ 变量部分。 因此,如果 http://localhost:5000/hello/TutorialsPoint 在浏览器中作为 URL 输入,**’TutorialPoint’** 将作为参数提供给 hello() 函数。

1
2
3
4
5
6
7
8
9
from flask import Flask
app = Flask(__name__)

@app.route('/hello/<name>')
def hello(name):
return "hello %s" % name

if __name__ == "__main__":
app.run(debug=True)

参数传递过程:

url中的 -> hello(name) -> 第6行的name -> %s

除了默认的字符串变量部分,还可以使用以下转换器构造规则

  • int 接受整数
  • float 针对浮点值
  • path 接受斜杠作为目录分隔符

参考: [Flask - 变量规则 (w3schools.cn)](https://w3schools.cn/flask/flask_variable_rules.html#:~:text=Flask – 变量规则 可以通过向规则参数添加可变部分来动态构建 URL。 这个可变部分被标记为 。,在浏览器中作为 URL 输入, ‘TutorialPoint’ 将作为参数提供给 hello () 函数。)

flask-http方法(get、post传参)

w3cschools.cn的一个例子:

默认情况下,Flask 路由响应 GET 请求。 但是,可以通过向 route() 装饰器提供方法参数来更改此首选项。

为了演示 POST 方法在 URL 路由中的使用,首先让我们创建一个 HTML 表单并使用 POST 方法将表单数据发送到 URL。

将以下脚本保存为 login.html

1
2
3
4
5
6
7
8
9
<html>
<body>
<form action = "http://localhost:5000/login" method = "post">
<p>Enter Name:</p>
<p><input type = "text" name = "nm" /></p>
<p><input type = "submit" value = "submit" /></p>
</form>
</body>
</html>

现在在python shell中输入以下脚本:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
from flask import Flask, redirect, url_for, request
app = Flask(__name__)

@app.route('/success/<name>')
def success(name):
return 'welcome %s' % name

@app.route('/login',methods = ['POST', 'GET'])
def login():
if request.method == 'POST':
user = request.form['nm']
return redirect(url_for('success',name = user))
else:
user = request.args.get('nm')
return redirect(url_for('success',name = user))

if __name__ == '__main__':
app.run(debug = True)

表单数据被发布到表单标签的 action 子句中的 URL。

http://localhost/login 映射到 login() 函数。 由于服务器已通过POST方法接收数据,从表单数据中获取的’nm’参数的值通过以下方式获取 −

1
user = request.form['nm']

它作为可变部分传递给 ‘/success’ URL。 浏览器在窗口中显示一条Welcome消息

login.html中将method参数改为**’GET’,然后在浏览器中再次打开。 服务器上接收的数据是通过GET** 方法。 “nm”参数的值现在通过以下方式获得 −

1
User = request.args.get(‘nm’)

flask - 模板

详细的介绍:Flask - 模板 (w3schools.cn)

以下是一个例子:

  当运行如下代码时,Flask 将尝试在 templates 文件夹中查找 HTML 文件,该文件夹与此脚本所在的文件夹相同。

 - application folder
  - hello.py
  - templates
  - hello.html

 

1
2
3
4
5
6
7
8
9
 from flask import Flask
 app = Flask(__name__)
 
 @app.route('/')
 def index():
  return render_template(‘hello.html’)
 
 if __name__ == '__main__':
  app.run(debug = True)

  render_template() 函数可以呈现 HTML 文件

术语**”网络模板系统”**是指设计一个可以动态插入可变数据的HTML脚本。 Web 模板系统由模板引擎、某种数据源和模板处理器组成。

Flask 使用 jinja2 模板引擎。 Web 模板包含用于变量和表达式(在本例中为 Python 表达式)的 HTML 语法散布占位符,这些占位符在呈现模板时被替换值。

再来看一个例子:

以下代码在模板文件夹中保存为 hello.html

1
2
3
4
5
6
7
8
<!doctype html>
<html>
<body>

<h1>Hello {{ name }}!</h1>

</body>
</html>

然后用python3运行以下代码:

1
2
3
4
5
6
7
8
9
from flask import Flask, render_template
app = Flask(__name__)

@app.route('/hello/<user>')
def hello_name(user):
return render_template('hello.html', name = user)

if __name__ == '__main__':
app.run(debug = True)

当开发服务器开始运行时,打开浏览器并输入 URL 作为 − http://localhost:5000/hello/mvl

URL 的 variable 部分会插入到 占位符处。

image-20231008195716264