Python flask框架
python flask框架(SSTI模板注入前置知识)
什么是flask
flask是一个采用python语言编写的web框架
WSGI工具箱采用Werkzeug,模板引擎使用Jinjia2。
python虚拟环境搭建
- 需要venv(python的虚拟环境)
创建venv环境安装flask
1 | apt install python3-venv |
在opt目录下创建虚拟环境运行flask
1 | cd /opt |
如何运行真实环境和虚拟环境下的.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 | cd /opt/flask1 |
测试是否安装成功
1 | python3 |
flask的应用
一个简单的python演示程序
功能:当访问网站根路径时会输出“hello benben”
1 | from flask import Flask //导入Flask类 |
- 当一个 Python 文件(模块)被直接执行时,
__name__
的值将会是字符串"__main__"
。这意味着这个模块是主程序,它正在被直接运行。- 当一个 Python 文件(模块)被导入到其他模块中时,
__name__
的值将是该模块的名称(不包括文件扩展名)。这意味着这个模块是作为一个库或模块被导入到其他代码中使用的。
在opt目录下编写如下代码并命名为“demo.py”,在python虚拟环境运行
1 | python3 demo.py |
然后访问127.0.0.1:5000(flask默认在5000端口运行)
flask变量及方法
例:
在下面的示例中,route() 装饰器的规则参数包含一个附加到 URL ‘/hello’ 的
1 | from flask import Flask |
参数传递过程:
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__)
def success(name):
return 'welcome %s' % name
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
<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__)
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 部分会插入到 占位符处。