文章目录
Flask 框架概述
Flask 是一个用 Python 编写的轻量级 Web 应用框架。它属于微框架类别,因为它不需要太多的框架代码即可开始开发应用程序。Flask 提供了开发者友好的环境,并且非常灵活,适用于构建从小型单页应用到大型复杂网站的各类项目。
Flask 的特点:
-
轻量级:
- 不包含数据库抽象层、表单验证等功能,但可以使用扩展来添加这些功能。
- 很容易上手,对于初学者来说是一个很好的起点。
-
灵活性:
- 开发者可以选择自己需要的功能和工具,如 ORM(对象关系映射)、表单验证等。
- 可以与多种数据库和缓存系统集成。
-
扩展性:
- 通过安装扩展可以很容易地为 Flask 添加新功能,如用户认证、ORM 支持等。
-
调试和开发工具:
- 内置服务器和调试器,便于开发和测试。
- 自动代码重载,当代码发生改变时自动重启服务器。
-
Jinja2 模板引擎:
- 默认使用 Jinja2 作为模板引擎,支持复杂的逻辑控制结构。
-
Werkzeug WSGI 工具包:
- Flask 使用 Werkzeug 作为它的 WSGI 工具包,提供实用的辅助函数和开发服务器。
Flask 的基本结构:
- 路由:用于定义 URL 和处理函数之间的映射。
- 视图函数:处理客户端请求并返回响应。
- 模板:用于生成动态 HTML 页面。
- 静态文件:如 CSS、JavaScript 文件,Flask 有专门的目录来存放这些文件。
如何开始使用 Flask:
-
安装 Flask:
- 使用 pip 安装 Flask:
pip install flask
- 使用 pip 安装 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 的应用场景:
- 小型网站或博客:适合于快速搭建个人博客或小型企业网站。
- API 服务:可以用来构建 RESTful API 服务。
- 原型和概念验证:由于其简单性和灵活性,非常适合快速原型开发。
总结:Flask 是一个非常适合那些希望保持代码简洁且易于维护的开发者的框架。它可以轻松地与其他工具和技术栈集成,非常适合构建高度定制化的 Web 应用程序。
应用案例
让我们构建一个简单的 Flask 应用示例,该应用将实现以下功能:
- 主页显示欢迎消息。
- 用户可以提交表单来注册。
- 注册后,用户的姓名和电子邮件地址会被存储在 SQLite 数据库中。
- 用户可以通过另一个页面查看所有已注册用户的列表。
首先,你需要确保你的环境中已经安装了 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>Home</title>
</head>
<body>
<h1>Welcome to our site!</h1>
<p><a href="{{ url_for('register') }}">Register Now</a></p>
</body>
</html>
templates/register.html
:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Register</title>
</head>
<body>
<h1>Register</h1>
<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">Submit</button>
</form>
</body>
</html>
templates/users.html
:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Users</title>
</head>
<body>
<h1>Registered Users</h1>
<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 扩展来管理用户会话。此外,我们还会添加一些基本的表单验证。
步骤 1: 安装 Flask-Login
首先,你需要安装 Flask-Login 扩展,它可以帮助你处理用户会话和登录状态:
pip install flask-login
步骤 2: 修改 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)
步骤 3: 创建表单验证和登录表单
我们将创建两个新的模板文件:login.html
和 register.html
,并在其中添加基本的表单验证。
templates/login.html
:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Login</title>
</head>
<body>
<h1>Login</h1>
<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">Login</button>
</form>
</body>
</html>
templates/register.html
:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Register</title>
</head>
<body>
<h1>Register</h1>
<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">Register</button>
</form>
</body>
</html>
步骤 4: 测试应用
现在你可以运行 app.py
并通过浏览器访问 http://127.0.0.1:5000/
来测试你的应用。你应该能够注册新用户、登录并查看用户列表。
请注意,为了简化示例,这里没有使用 WTForms 或 Flask-WTF 进行表单验证。如果你想要更严格的表单验证,可以考虑使用这些库。此外,密码哈希和安全性的实现也较为基础,实际部署时需要考虑更多的安全措施,例如使用 HTTPS、更强的密码策略等。
这就是一个基本的 Flask 应用,包括用户注册、登录和会话管理。你可以在此基础上继续扩展更多功能,比如添加更多的安全性检查、增强用户界面、实现用户权限管理等。
————————————————
最后我们放松一下眼睛