Flask 是一个使用 Python 编写的轻量级 Web 应用程序框架 。它被归类为 "微框架" (Microframework) ,但这并不意味着它的功能弱小,而是指其核心非常简单且易于扩展。
Flask 的核心思想是提供一个简单而强大的基础,开发者可以根据项目需求自由地选择和添加其他功能库,从而构建出从简单到复杂的任何 Web 应用。
Flask 环境
安装virtualenv
pip install virtualenv

安装Flask
pip install Flask

Flask 应用
应用
from flask import Flask
app = Flask(__name__)
@app.route('/')
def hello_world():
return 'Hello World'
if __name__ == '__main__':
app.run()


调试模式
服务器会在代码修改后自动重新载入,并在发生 错误时提供一个相当有用的调试器。
app.debug = True
app.run()
或者
app.run(debug=True)
Flask 变量规则
from flask import Flask
app = Flask(__name__)
@app.route('/hello/<name>')
def hello_name(name):
return 'Hello %s!' % name
if __name__ == '__main__':
app.run(debug=True)
http://localhost:5000/hello/w3cschool

Flask URL构建
from flask import Flask, redirect, url_for
app = Flask(__name__)
@app.route('/admin')
def hello_admin():
return 'Hello Admin'
@app.route('/guest/<guest>')
def hello_guest(guest):
return 'Hello %s as Guest' % guest
@app.route('/user/<name>')
def hello_user(name):
if name == 'admin':
return redirect(url_for('hello_admin'))
else:
return redirect(url_for('hello_guest', guest=name))
if __name__ == '__main__':
app.run(debug=True)
http://localhost:5000/user/admin

Flask HTTP方法
from flask import Flask, redirect, url_for, request, render_template
app = Flask(__name__)
@app.route('/')
def index():
return render_template("login.html")
@app.route('/success/<name>')
def success(name):
return 'welcome %s' % name
@app.route('/login', methods=['POST', 'GET'])
def login():
if request.method == 'POST':
print(1)
user = request.form['nm']
return redirect(url_for('success', name=user))
else:
print(2)
user = request.args.get('nm')
return redirect(url_for('success', name=user))
if __name__ == '__main__':
app.run()
login.html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<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>


Flask 模板
hello.html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
我的模板html内容
<br/>{{ my_str }}
<br/>{{ my_int }}
<br/>{{ my_array }}
<br/>{{ my_dict }}
</body>
</html>
from flask import Flask, render_template
from flask import redirect, url_for, request
app = Flask(__name__)
@app.route('/')
def index():
return render_template("login.html")
@app.route('/success/<name>')
def success(name):
my_int = 18
my_str = 'curry'
my_list = [1, 5, 4, 3, 2]
my_dict = {
'name': 'durant',
'age': 28
}
# render_template方法:渲染模板
# 参数1: 模板名称 参数n: 传到模板里的数据
return render_template('hello.html',
my_int=my_int,
my_str=my_str,
my_list=my_list,
my_dict=my_dict)
@app.route('/login', methods=['POST', 'GET'])
def login():
if request.method == 'POST':
print(1)
user = request.form['nm']
return redirect(url_for('success', name=user))
else:
print(2)
user = request.args.get('nm')
return redirect(url_for('success', name=user))
if __name__ == '__main__':
app.run()
Flask 静态文件
hello.js
function sayHello() {
alert("Hello World")
}
hello.html
<!DOCTYPE html>
<html lang="en">
<head>
<script type="text/javascript" src="{{ url_for('static', filename = 'hello.js') }}"></script>
</head>
<body>
<input type="button" onclick="sayHello()" value="Say Hello"/>
</body>
from flask import Flask, render_template
from flask import redirect, url_for, request
app = Flask(__name__)
@app.route('/')
def index():
return render_template("login.html")
@app.route('/success/<name>')
def success(name):
my_int = 18
my_str = 'curry'
my_list = [1, 5, 4, 3, 2]
my_dict = {
'name': 'durant',
'age': 28
}
# render_template方法:渲染模板
# 参数1: 模板名称 参数n: 传到模板里的数据
return render_template('hello.html',
my_int=my_int,
my_str=my_str,
my_list=my_list,
my_dict=my_dict)
@app.route('/login', methods=['POST', 'GET'])
def login():
if request.method == 'POST':
print(1)
user = request.form['nm']
return redirect(url_for('success', name=user))
else:
print(2)
user = request.args.get('nm')
return redirect(url_for('success', name=user))
if __name__ == '__main__':
app.run()


Flask 将表单数据发送到模板
@app.route('/student')
def student():
return render_template("student.html")
@app.route('/result', methods=['POST', 'GET'])
def result():
if request.method == 'POST':
result = request.form
return render_template("result.html", result=result)
student.html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<form action="http://localhost:5000/result" method="POST">
<p>Name <input type="text" name="Name"/></p>
<p>Physics <input type="text" name="Physics"/></p>
<p>Chemistry <input type="text" name="chemistry"/></p>
<p>Maths <input type="text" name="Mathematics"/></p>
<p><input type="submit" value="submit"/></p>
</form>
</body>
</html>
result.html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<table border=1>
{% for key, value in result.items() %}
<tr>
<th> {{ key }}</th>
<td> {{ value }}</td>
</tr>
{% endfor %}
</table>
</body>
</html>


Flask 重定向和错误
from flask import Flask, redirect, render_template, request, url_for
app = Flask(__name__)
@app.route('/')
def index():
return render_template("login.html")
@app.route('/login', methods=['GET', 'POST'])
def login():
if request.method == 'POST' and request.form['username'] == 'admin' and request.form['password'] == 'admin':
user = request.form.get('username', 'default_user')
return redirect(url_for('success', name=user))
error = 'Invalid username or password. Please try again!'
return render_template('login.html', error=error)
@app.route('/success/<name>')
def success(name):
my_int = 18
my_str = 'curry'
my_list = [1, 5, 4, 3, 2]
return render_template('hello.html', my_int=my_int, my_str=my_str, my_list=my_list)
@app.route('/student')
def student():
return render_template("student.html")
@app.route('/result', methods=['POST', 'GET'])
def result():
if request.method == 'POST':
result = request.form
return render_template("result.html", result=result)
if __name__ == '__main__':
app.run()
login.html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<form method="post" action="http://localhost:5000/login">
<table>
<tr>
<td>Username</td>
<td><input type='username' name='username'></td>
</tr>
<tr>
<td>Password</td>
<td><input type='password' name='password'></td>
</tr>
<tr>
<td><input type="submit" value="Submit"></td>
</tr>
</table>
</form>
{% if error %}
<p><strong>Error</strong>: {{ error }}</p>
{% endif %}
</body>
</html>
Flask 消息闪现
import os
from flask import Flask, flash, redirect, render_template, request, url_for
app = Flask(__name__)
app.config['SECRET_KEY'] = os.environ.get('SECRET_KEY', 'fallback-key')
@app.route('/')
def index():
return render_template("login.html")
@app.route('/login', methods=['GET', 'POST'])
def login():
if request.method == 'POST' and request.form['username'] == 'admin' and request.form['password'] == 'admin':
flash('You were successfully logged in')
user = request.form.get('username', 'default_user')
return redirect(url_for('success', name=user))
error = 'Invalid username or password. Please try again!'
return render_template('login.html', error=error)
@app.route('/success/<name>')
def success(name):
my_int = 18
my_str = 'curry'
my_list = [1, 5, 4, 3, 2]
return render_template('hello.html', my_int=my_int, my_str=my_str, my_list=my_list)
@app.route('/student')
def student():
return render_template("student.html")
@app.route('/result', methods=['POST', 'GET'])
def result():
if request.method == 'POST':
result = request.form
return render_template("result.html", result=result)
if __name__ == '__main__':
app.run(debug=True)
hello.html
<!DOCTYPE html>
<html lang="en">
<head>
<script type="text/javascript" src="{{ url_for('static', filename = 'hello.js') }}"></script>
</head>
<body>
{% with messages = get_flashed_messages() %}
{% if messages %}
{% for message in messages %}
<p>{{ message }}</p>
{% endfor %}
{% endif %}
{% endwith %}
<input type="button" onclick="sayHello()" value="Say Hello"/>
</body>

Flask 文件上传
import os
from flask import Flask, render_template, request
from flask import flash, redirect, url_for
from werkzeug.utils import secure_filename
app = Flask(__name__)
app.config['SECRET_KEY'] = os.environ.get('SECRET_KEY', 'fallback-key')
app.config['UPLOAD_FOLDER'] = 'upload/'
@app.route('/upload')
def upload_file():
return render_template('upload.html')
@app.route('/uploader', methods=['GET', 'POST'])
def uploader():
if request.method == 'POST':
f = request.files['file']
print(request.files)
f.save(os.path.join(app.config['UPLOAD_FOLDER'], secure_filename(f.filename)))
return 'file uploaded successfully'
else:
return render_template('upload.html')
@app.route('/')
def index():
return render_template("login.html")
@app.route('/login', methods=['GET', 'POST'])
def login():
if request.method == 'POST' and request.form['username'] == 'admin' and request.form['password'] == 'admin':
flash('You were successfully logged in')
user = request.form.get('username', 'default_user')
return redirect(url_for('success', name=user))
error = 'Invalid username or password. Please try again!'
return render_template('login.html', error=error)
@app.route('/success/<name>')
def success(name):
my_int = 18
my_str = 'curry'
my_list = [1, 5, 4, 3, 2]
return render_template('hello.html', my_int=my_int, my_str=my_str, my_list=my_list)
@app.route('/student')
def student():
return render_template("student.html")
@app.route('/result', methods=['POST', 'GET'])
def result():
if request.method == 'POST':
result = request.form
return render_template("result.html", result=result)
if __name__ == '__main__':
app.run(debug=True)
upload.html
<!DOCTYPE html>
<html lang="en">
<head>
<title>File Upload</title>
</head>
<body>
<form action="http://localhost:5000/uploader" method="POST" enctype="multipart/form-data">
<p><input type="file" name="file"/></p>
<p><input type="submit" value="提交"/></p>
</form>
</body>
</html>

拆分服务
import os
from flask import Flask, render_template, request, flash, redirect, url_for
def create_login_app():
app = Flask(__name__)
app.config['SECRET_KEY'] = os.environ.get('SECRET_KEY', 'fallback-key')
@app.route('/')
def index():
return render_template("login.html")
@app.route('/login', methods=['GET', 'POST'])
def login():
if request.method == 'POST' and request.form['username'] == 'admin' and request.form['password'] == 'admin':
flash('You were successfully logged in')
user = request.form.get('username', 'default_user')
return redirect(url_for('success', name=user))
error = 'Invalid username or password. Please try again!'
return render_template('login.html', error=error)
@app.route('/success/<name>')
def success(name):
my_int = 18
my_str = 'curry'
my_list = [1, 5, 4, 3, 2]
return render_template('hello.html', my_int=my_int, my_str=my_str, my_list=my_list)
return app
if __name__ == '__main__':
app = create_login_app()
app.run(port=5001)
login.html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<form method="post" action="http://localhost:5001/login">
<table>
<tr>
<td>Username</td>
<td><input type='username' name='username'></td>
</tr>
<tr>
<td>Password</td>
<td><input type='password' name='password'></td>
</tr>
<tr>
<td><input type="submit" value="Submit"></td>
</tr>
</table>
</form>
{% if error %}
<p><strong>Error</strong>: {{ error }}</p>
{% endif %}
</body>
</html>
from flask import Flask, render_template, request
def create_student_app():
app = Flask(__name__)
@app.route('/')
def student():
return render_template("student.html")
@app.route('/result', methods=['POST', 'GET'])
def result():
if request.method == 'POST':
result = request.form
return render_template("result.html", result=result)
return app
if __name__ == '__main__':
app = create_student_app()
app.run(port=5002)
student.html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<form action="http://localhost:5002/result" method="POST">
<p>Name <input type="text" name="Name"/></p>
<p>Physics <input type="text" name="Physics"/></p>
<p>Chemistry <input type="text" name="chemistry"/></p>
<p>Maths <input type="text" name="Mathematics"/></p>
<p><input type="submit" value="submit"/></p>
</form>
</body>
</html>
import os
from flask import Flask, render_template, request
from werkzeug.utils import secure_filename
def create_upload_app():
app = Flask(__name__)
app.config['UPLOAD_FOLDER'] = 'upload/'
# 确保上传目录存在
if not os.path.exists(app.config['UPLOAD_FOLDER']):
os.makedirs(app.config['UPLOAD_FOLDER'])
@app.route('/')
def upload_file():
return render_template('upload.html')
@app.route('/uploader', methods=['GET', 'POST'])
def uploader():
if request.method == 'POST':
f = request.files['file']
print(request.files)
f.save(os.path.join(app.config['UPLOAD_FOLDER'], secure_filename(f.filename)))
return 'file uploaded successfully'
else:
return render_template('upload.html')
return app
if __name__ == '__main__':
app = create_upload_app()
app.run(port=5003)
student.html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<form action="http://localhost:5002/result" method="POST">
<p>Name <input type="text" name="Name"/></p>
<p>Physics <input type="text" name="Physics"/></p>
<p>Chemistry <input type="text" name="chemistry"/></p>
<p>Maths <input type="text" name="Mathematics"/></p>
<p><input type="submit" value="submit"/></p>
</form>
</body>
</html>
run_all.py
import os
import subprocess
import sys
import time
def run_all_services():
"""
同时运行所有 Flask 服务
"""
# 获取当前目录
current_dir = os.path.dirname(os.path.abspath(__file__))
# 定义要运行的服务
services = [
{
'name': 'Login Service',
'script': 'login.py',
'port': 5001
},
{
'name': 'Student Service',
'script': 'student.py',
'port': 5002
},
{
'name': 'Upload Service',
'script': 'upload.py',
'port': 5003
}
]
processes = []
try:
# 启动所有服务
for service in services:
script_path = os.path.join(current_dir, service['script'])
if os.path.exists(script_path):
print(f"启动 {service['name']} (端口: {service['port']})...")
# 使用 subprocess.Popen 启动进程
process = subprocess.Popen([
sys.executable,
script_path
])
processes.append(process)
print(f"{service['name']} 已启动,PID: {process.pid}")
time.sleep(1) # 稍微延迟以避免端口冲突
else:
print(f"错误: 找不到文件 {service['script']}")
print("\n所有服务已启动:")
for service in services:
print(f" - {service['name']}: http://localhost:{service['port']}")
print("\n按 Ctrl+C 停止所有服务")
# 等待所有进程完成
for process in processes:
process.wait()
except KeyboardInterrupt:
print("\n正在停止所有服务...")
# 终止所有子进程
for process in processes:
if process.poll() is None: # 如果进程还在运行
process.terminate()
try:
process.wait(timeout=5) # 等待最多5秒
except subprocess.TimeoutExpired:
process.kill() # 如果还不能正常退出,则强制杀死
print("所有服务已停止")
if __name__ == '__main__':
run_all_services()
Flask SQLAlchemy
1.安装Flask-SQLAlchemy扩展
pip install flask-sqlalchemy
2.导入SQLAlchemy类
from flask_sqlalchemy import SQLAlchemy
3.创建一个Flask应用程序对象并为要使用的数据库设置URI
app = Flask(__name__)
app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:///students.sqlite3'
4.使用应用程序对象作为参数创建SQLAlchemy类的对象
db = SQLAlchemy(app)
class Students(db.Model):
id = db.Column('student_id', db.Integer, primary_key = True)
name = db.Column(db.String(100))
city = db.Column(db.String(50))
addr = db.Column(db.String(200))
pin = db.Column(db.String(10))
def __init__(self, name, city, addr, pin):
self.name = name
self.city = city
self.addr = addr
self.pin = pin
5.运行**create_all()**方法
db.create_all()
