Flask 是一个用 Python 编写的轻量级 Web 应用框架。它属于微框架类别,因为它不需要太多的框架代码即可开始开发应用程序。Flask 提供了开发者友好的环境,并且非常灵活,适用于构建从小型单页应用到大型复杂网站的各类项目。
轻量级:
灵活性:
扩展性:
调试和开发工具:
Jinja2 模板引擎:
Werkzeug WSGI 工具包:
安装 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()
运行应用:
http://127.0.0.1:5000/
即可看到 “Hello, World!”。总结:Flask 是一个非常适合那些希望保持代码简洁且易于维护的开发者的框架。它可以轻松地与其他工具和技术栈集成,非常适合构建高度定制化的 Web 应用程序。
让我们构建一个简单的 Flask 应用示例,该应用将实现以下功能:
首先,你需要确保你的环境中已经安装了 Flask 和相关依赖。如果还没有安装,你可以使用以下命令安装 Flask 和 Flask-SQLAlchemy 扩展:
pip install flask flask-sqlalchemy
接下来,我们创建一个名为 app.py
的文件,其中包含 Flask 应用的核心代码。
from flask import Flask, render_template, request, redirect, url_for
from flask_sqlalchemy import SQLAlchemy
app = Flask(__name__)
app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:///site.db'
db = SQLAlchemy(app)
class User(db.Model):
id = db.Column(db.Integer, primary_key=True)
name = db.Column(db.String(50), nullable=False)
email = db.Column(db.String(120), unique=True, nullable=False)
@app.route('/')
def home():
return render_template('home.html')
@app.route('/register', methods=['GET', 'POST'])
def register():
if request.method == 'POST':
name = request.form['name']
email = request.form['email']
user = User(name=name, email=email)
db.session.add(user)
db.session.commit()
return redirect(url_for('users'))
return render_template('register.html')
@app.route('/users')
def users():
users = User.query.all()
return render_template('users.html', users=users)
if __name__ == '__main__':
db.create_all()
app.run(debug=True)
在这个例子中,我们创建了一个简单的 Flask 应用,它包括三个路由:
/
: 显示主页。/register
: 处理用户注册的表单提交,并将数据保存到数据库。/users
: 显示所有用户的列表。接下来,我们需要创建三个 HTML 模板文件:home.html
, register.html
, 和 users.html
。这些文件将位于 templates
文件夹中。
templates/home.html
:DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Hometitle>
head>
<body>
<h1>Welcome to our site!h1>
<p><a href="{{ url_for('register') }}">Register Nowa>p>
body>
html>
templates/register.html
:DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Registertitle>
head>
<body>
<h1>Registerh1>
<form method="post" action="{{ url_for('register') }}">
<label for="name">Name:label>
<input type="text" id="name" name="name" required>
<br>
<label for="email">Email:label>
<input type="email" id="email" name="email" required>
<br>
<button type="submit">Submitbutton>
form>
body>
html>
templates/users.html
:DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Userstitle>
head>
<body>
<h1>Registered Usersh1>
<ul>
{% for user in users %}
<li>{{ user.name }} - {{ user.email }}li>
{% endfor %}
ul>
body>
html>
现在,你可以运行 app.py
并通过浏览器访问 http://127.0.0.1:5000/
来查看你的 Flask 应用。
这个简单的应用演示了如何使用 Flask 创建基本的路由、表单处理以及如何与数据库交互。你可以在此基础上进一步扩展功能,例如增加登录认证、更复杂的表单验证等。
我们可以进一步扩展应用的功能。这次我们将添加用户登录功能,并使用 Flask-Login 扩展来管理用户会话。此外,我们还会添加一些基本的表单验证。
首先,你需要安装 Flask-Login 扩展,它可以帮助你处理用户会话和登录状态:
pip install flask-login
app.py
接下来,我们修改 app.py
文件以添加登录功能:
from flask import Flask, render_template, request, redirect, url_for, flash
from flask_sqlalchemy import SQLAlchemy
from flask_login import LoginManager, UserMixin, login_user, login_required, logout_user, current_user
from werkzeug.security import generate_password_hash, check_password_hash
app = Flask(__name__)
app.config['SECRET_KEY'] = 'your-secret-key' # 设置一个安全的密钥
app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:///site.db'
db = SQLAlchemy(app)
login_manager = LoginManager(app)
login_manager.login_view = 'login' # 设置登录页面的端点名称
class User(UserMixin, db.Model):
id = db.Column(db.Integer, primary_key=True)
name = db.Column(db.String(50), nullable=False)
email = db.Column(db.String(120), unique=True, nullable=False)
password = db.Column(db.String(128), nullable=False)
@login_manager.user_loader
def load_user(user_id):
return User.query.get(int(user_id))
@app.route('/')
def home():
return render_template('home.html')
@app.route('/register', methods=['GET', 'POST'])
def register():
if request.method == 'POST':
name = request.form['name']
email = request.form['email']
password = request.form['password']
hashed_password = generate_password_hash(password, method='sha256')
new_user = User(name=name, email=email, password=hashed_password)
db.session.add(new_user)
db.session.commit()
flash('Your account has been created! You are now able to log in', 'success')
return redirect(url_for('login'))
return render_template('register.html')
@app.route('/login', methods=['GET', 'POST'])
def login():
if request.method == 'POST':
email = request.form['email']
password = request.form['password']
user = User.query.filter_by(email=email).first()
if user and check_password_hash(user.password, password):
login_user(user)
next_page = request.args.get('next')
return redirect(next_page) if next_page else redirect(url_for('home'))
else:
flash('Login Unsuccessful. Please check email and password', 'danger')
return render_template('login.html')
@app.route('/logout')
@login_required
def logout():
logout_user()
return redirect(url_for('home'))
@app.route('/users')
@login_required
def users():
users = User.query.all()
return render_template('users.html', users=users)
if __name__ == '__main__':
db.create_all()
app.run(debug=True)
我们将创建两个新的模板文件:login.html
和 register.html
,并在其中添加基本的表单验证。
templates/login.html
:DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Logintitle>
head>
<body>
<h1>Loginh1>
<form method="post" action="{{ url_for('login') }}">
<label for="email">Email:label>
<input type="email" id="email" name="email" required>
<br>
<label for="password">Password:label>
<input type="password" id="password" name="password" required>
<br>
<button type="submit">Loginbutton>
form>
body>
html>
templates/register.html
:DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Registertitle>
head>
<body>
<h1>Registerh1>
<form method="post" action="{{ url_for('register') }}">
<label for="name">Name:label>
<input type="text" id="name" name="name" required>
<br>
<label for="email">Email:label>
<input type="email" id="email" name="email" required>
<br>
<label for="password">Password:label>
<input type="password" id="password" name="password" required>
<br>
<button type="submit">Registerbutton>
form>
body>
html>
现在你可以运行 app.py
并通过浏览器访问 http://127.0.0.1:5000/
来测试你的应用。你应该能够注册新用户、登录并查看用户列表。
请注意,为了简化示例,这里没有使用 WTForms 或 Flask-WTF 进行表单验证。如果你想要更严格的表单验证,可以考虑使用这些库。此外,密码哈希和安全性的实现也较为基础,实际部署时需要考虑更多的安全措施,例如使用 HTTPS、更强的密码策略等。
这就是一个基本的 Flask 应用,包括用户注册、登录和会话管理。你可以在此基础上继续扩展更多功能,比如添加更多的安全性检查、增强用户界面、实现用户权限管理等。
————————————————
最后我们放松一下眼睛