2025-03-12
编程
00
请注意,本文编写于 47 天前,最后修改于 45 天前,其中某些信息可能已经过时。

目录

安装
基本概念
基本使用示例
1. 创建一个简单的 Flask 应用
2. 添加更多的路由
3. 使用 HTTP 方法
4. 处理表单数据
5. 使用模板
创建一个简单的模板
6. 处理静态文件
7. 使用蓝图(Blueprints)
创建一个蓝图
8. 错误处理
9. 使用会话(Sessions)
10. 集成数据库
安装 SQLAlchemy
配置数据库
11. 使用 Flask-WTF 进行表单验证
安装 Flask-WTF
配置表单

Flask 是一个使用 Python 编写的轻量级 Web 应用框架。它简单易学,同时具有高度的灵活性和可扩展性。

Flask 适用于构建从小型应用到复杂的 Web 应用的各种项目。

安装

首先,你需要安装 Flask 包。可以通过 pip 来安装:

bash
pip install Flask

基本概念

  • 路由:定义 URL 和视图函数之间的映射。
  • 视图函数:处理请求并返回响应内容的函数。
  • 模板:用于生成 HTML 页面的文件,通常使用 Jinja2 模板引擎。
  • 静态文件:如 CSS、JavaScript 文件等,通常放在 static 目录中。
  • 上下文:包括请求上下文和应用上下文,用于在视图函数中访问请求信息和其他全局变量。

基本使用示例

以下是一些具体的示例,展示了如何使用 Flask 构建基本的 Web 应用程序。

1. 创建一个简单的 Flask 应用

python
from flask import Flask app = Flask(__name__) @app.route('/') def hello_world(): return 'Hello, World!' if __name__ == '__main__': app.run(debug=True)

运行这个脚本后,打开浏览器并访问 http://127.0.0.1:5000/,你将看到 "Hello, World!"。

2. 添加更多的路由

你可以通过定义多个路由来处理不同的 URL 请求。

python
@app.route('/user/<username>') def show_user_profile(username): # 显示用户的个人资料页面 return f'User {username}' @app.route('/post/<int:post_id>') def show_post(post_id): # 显示文章详情页面 return f'Post {post_id}'

3. 使用 HTTP 方法

你可以指定视图函数处理特定的 HTTP 方法(如 GET、POST 等)。

python
from flask import request @app.route('/login', methods=['GET', 'POST']) def login(): if request.method == 'POST': return 'Processing Login' else: return 'Login Form'

4. 处理表单数据

Flask 提供了方便的方法来处理表单数据。

python
from flask import request @app.route('/submit', methods=['POST']) def submit(): name = request.form['name'] email = request.form['email'] return f'Name: {name}, Email: {email}'

对应的 HTML 表单如下:

html
<form action="/submit" method="post"> <label for="name">Name:</label> <input type="text" id="name" name="name"> <label for="email">Email:</label> <input type="email" id="email" name="email"> <button type="submit">Submit</button> </form>

5. 使用模板

Flask 使用 Jinja2 作为模板引擎,可以方便地生成动态 HTML 页面。

创建一个简单的模板

在项目目录下创建一个名为 templates 的文件夹,并在其中创建一个名为 hello.html 的文件:

html
<!doctype html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Hello Page</title> </head> <body> <h1>Hello, {{ name }}!</h1> </body> </html>

然后在你的 Flask 应用中渲染该模板:

python
from flask import render_template @app.route('/hello/') @app.route('/hello/<name>') def hello(name=None): return render_template('hello.html', name=name)

6. 处理静态文件

静态文件(如 CSS、JavaScript 文件)通常放在 static 目录中。你可以通过 /static/ 路径访问这些文件。

例如,在 static/css/style.css 中定义样式:

css
body { background-color: lightblue; }

在模板中引用该样式文件:

html
<link rel="stylesheet" href="{{ url_for('static', filename='css/style.css') }}">

7. 使用蓝图(Blueprints)

蓝图允许你组织大型应用,将不同的功能模块化。

创建一个蓝图

在项目目录下创建一个名为 admin 的文件夹,并在其中创建一个名为 __init__.py 的文件:

python
from flask import Blueprint admin_bp = Blueprint('admin', __name__) @admin_bp.route('/') def admin_index(): return 'Admin Index' # 导入蓝图 def init_app(app): app.register_blueprint(admin_bp, url_prefix='/admin')

在主应用中注册蓝图:

python
from admin import init_app app = Flask(__name__) init_app(app) if __name__ == '__main__': app.run(debug=True)

现在,你可以通过访问 http://127.0.0.1:5000/admin/ 来查看 Admin Index 页面。

8. 错误处理

你可以为特定的 HTTP 错误码定义自定义错误页面。

python
@app.errorhandler(404) def page_not_found(e): return render_template('404.html'), 404

创建一个名为 404.html 的模板:

html
<!doctype html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Page Not Found</title> </head> <body> <h1>Oops! Page Not Found.</h1> </body> </html>

9. 使用会话(Sessions)

Flask 提供了内置的支持来管理用户会话。

python
from flask import session, redirect, url_for @app.route('/login', methods=['GET', 'POST']) def login(): if request.method == 'POST': session['username'] = request.form['username'] return redirect(url_for('index')) return ''' <form method="post"> <p><input type=text name=username> <p><input type=submit value=Login> </form> ''' @app.route('/logout') def logout(): session.pop('username', None) return redirect(url_for('index')) @app.route('/') def index(): if 'username' in session: return f'Logged in as {session["username"]}' return 'You are not logged in'

10. 集成数据库

Flask 可以轻松集成多种数据库,如 SQLite、MySQL、PostgreSQL 等。常用的库是 SQLAlchemy

安装 SQLAlchemy
bash
pip install flask-sqlalchemy
配置数据库
python
from flask import Flask 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) username = db.Column(db.String(20), unique=True, nullable=False) email = db.Column(db.String(120), unique=True, nullable=False) def __repr__(self): return f"User('{self.username}', '{self.email}')" if __name__ == '__main__': with app.app_context(): db.create_all() app.run(debug=True)

11. 使用 Flask-WTF 进行表单验证

Flask-WTF 是一个方便的库,用于处理表单验证。

安装 Flask-WTF
bash
pip install flask-wtf
配置表单
python
from flask_wtf import FlaskForm from wtforms import StringField, SubmitField from wtforms.validators import DataRequired class RegistrationForm(FlaskForm): username = StringField('Username', validators=[DataRequired()]) email = StringField('Email', validators=[DataRequired()]) submit = SubmitField('Sign Up') @app.route('/register', methods=['GET', 'POST']) def register(): form = RegistrationForm() if form.validate_on_submit(): user = User(username=form.username.data, email=form.email.data) db.session.add(user) db.session.commit() return redirect(url_for('index')) return render_template('register.html', form=form)

对应的 HTML 表单如下:

html
<form method="POST"> {{ form.hidden_tag() }} <div> {{ form.username.label }}<br> {{ form.username(size=32) }}<br> {% for error in form.username.errors %} <span style="color: red;">[{{ error }}]</span><br> {% endfor %} </div> <div> {{ form.email.label }}<br> {{ form.email(size=64) }}<br> {% for error in form.email.errors %} <span style="color: red;">[{{ error }}]</span><br> {% endfor %} </div> <div>{{ form.submit() }}</div> </form>