Flask 进阶教程
Flask 作为一个轻量级的 Python Web 框架,其灵活性使得它适用于多种场景。为了构建大型、可扩展的应用程序,需要掌握一些进阶技巧和概念。本教程将详细介绍 Flask 的进阶功能,包括应用配置、蓝图(Blueprint)、数据库迁移、JWT 身份认证、异步处理、文件上传和处理、以及部署等内容。
1. 应用配置与环境管理
Flask 提供了多种方式来管理应用配置,例如通过配置文件、环境变量等。
配置文件
你可以将配置项放在一个独立的配置文件中,如 config.py
。
示例:config.py
import os
class Config:
SECRET_KEY = os.environ.get('SECRET_KEY') or 'hard_to_guess_string'
SQLALCHEMY_DATABASE_URI = os.environ.get('DATABASE_URL') or 'sqlite:///app.db'
DEBUG = False
TESTING = False
class DevelopmentConfig(Config):
DEBUG = True
class TestingConfig(Config):
TESTING = True
SQLALCHEMY_DATABASE_URI = 'sqlite:///:memory:'
class ProductionConfig(Config):
DEBUG = False
应用配置:
from flask import Flask
from config import DevelopmentConfig
app = Flask(__name__)
app.config.from_object(DevelopmentConfig)
if __name__ == '__main__':
app.run()
2. 蓝图(Blueprint)与模块化
在大型应用中,建议将应用拆分为多个独立的模块,这样可以提高代码的可维护性。Blueprint
是 Flask 提供的用于模块化开发的工具。
示例:使用蓝图
- 定义蓝图
# blog.py
from flask import Blueprint
blog_bp = Blueprint('blog', __name__)
@blog_bp.route('/posts')
def posts():
return "This is the blog posts page"
- 注册蓝图
# app.py
from flask import Flask
from blog import blog_bp
app = Flask(__name__)
app.register_blueprint(blog_bp, url_prefix='/blog')
if __name__ == '__main__':
app.run(debug=True)
详解:
Blueprint
:用于组织应用的路由和视图逻辑。url_prefix
:设置蓝图的 URL 前缀,/blog/posts
将映射到/posts
。
3. 数据库迁移(Flask-Migrate)
在应用中,数据库结构经常需要调整。Flask-Migrate
使用 Alembic 进行数据库迁移,帮助你管理数据库版本。
安装 Flask-Migrate
pip install Flask-Migrate
使用示例
- 初始化数据库迁移
from flask import Flask
from flask_sqlalchemy import SQLAlchemy
from flask_migrate import Migrate
app = Flask(__name__)
app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:///app.db'
db = SQLAlchemy(app)
migrate = Migrate(app, db)
class User(db.Model):
id = db.Column(db.Integer, primary_key=True)
username = db.Column(db.String(128), unique=True)
if __name__ == '__main__':
app.run()
- 执行迁移命令
flask db init
flask db migrate -m "Initial migration"
flask db upgrade
详解:
flask db init
:初始化迁移目录。flask db migrate
:生成迁移文件。flask db upgrade
:将迁移应用到数据库。
4. JWT 身份认证(Flask-JWT-Extended)
在需要保护 API 端点时,使用 JWT(JSON Web Token)是一种常见的方式。Flask-JWT-Extended
是 Flask 中用于实现 JWT 的扩展。
安装 Flask-JWT-Extended
pip install Flask-JWT-Extended
使用示例
- 设置 JWT 身份验证
from flask import Flask, jsonify
from flask_jwt_extended import JWTManager, create_access_token, jwt_required
app = Flask(__name__)
app.config['JWT_SECRET_KEY'] = 'super-secret' # 更换为真实密钥
jwt = JWTManager(app)
@app.route('/login', methods=['POST'])
def login():
# 在真实应用中验证用户凭据
access_token = create_access_token(identity={'username': 'john_doe'})
return jsonify(access_token=access_token)
@app.route('/protected', methods=['GET'])
@jwt_required()
def protected():
return jsonify(message="You have access to this protected endpoint")
if __name__ == '__main__':
app.run(debug=True)
详解:
create_access_token
:生成 JWT 令牌。@jwt_required()
:保护路由,只有有效的 JWT 令牌才能访问。
5. 异步处理与 Flask
从 Flask 2.0 开始,支持异步视图函数,允许在视图中处理异步操作,例如调用异步 I/O 操作。
示例:异步视图
import asyncio
from flask import Flask
app = Flask(__name__)
@app.route('/async')
async def async_view():
await asyncio.sleep(1)
return "This is an async view"
if __name__ == '__main__':
app.run(debug=True)
详解:
async
和await
:用于处理异步任务,如 I/O 操作。- 异步支持:在 Flask 2.0 及更高版本中默认支持异步视图函数。
6. Flask 文件上传和处理
Flask 提供了对文件上传的支持,你可以通过 request.files
来获取上传的文件,并对其进行处理或存储。
文件上传示例
- HTML 文件上传表单
<!DOCTYPE html>
<html>
<head>
<title>File Upload</title>
</head>
<body>
<form action="/upload" method="POST" enctype="multipart/form-data">
<input type="file" name="file">
<input type="submit" value="Upload">
</form>
</body>
</html>
- Flask 文件处理
from flask import Flask, request
app = Flask(__name__)
@app.route('/upload', methods=['POST'])
def upload_file():
if 'file' not in request.files:
return 'No file part'
file = request.files['file']
if file.filename == '':
return 'No selected file'
file.save(f'./uploads/{file.filename}')
return 'File uploaded successfully'
if __name__ == '__main__':
app.run(debug=True)
7. 请求钩子(Request Hooks)
Flask 提供了几个钩子函数,用于在请求的不同阶段执行操作。常用的钩子包括 before_request
、after_request
和 teardown_request
。
示例:请求钩子
from flask import Flask, g, request
app = Flask(__name__)
@app.before_request
def before_request():
g.user = "current_user"
print(f"Before request: {request.method}")
@app.after_request
def after_request(response):
print(f"After request: {response.status}")
return response
@app.route('/')
def index():
return f"Hello, {g.user}"
if __name__ == '__main__':
app.run(debug=True)
详解:
before_request
:在每次请求处理之前执行。after_request
:在视图函数执行后,但在响应返回之前执行。g
对象:用于在请求期间存储临时数据。
8. 部署 Flask 应用
部署到生产环境(使用 Gunicorn)
Flask 自带的开发服务器不适合用于生产环境。可以使用 Gunicorn
或其他 WSGI 服务器来运行 Flask 应用。
安装 Gunicorn
pip install gunicorn
运行 Flask 应用
gunicorn -w 4 app:app
-w 4
:指定 4 个工作进程以处理请求。app:app
:app.py
文件中的 Flask 实例名为app
。
部署到 Docker
Dockerfile 示例
FROM python:3.9
WORKDIR /app
COPY . /app
RUN pip install -r requirements.txt
CMD ["gunicorn", "-w", "4", "app:app"]
构建并运行 Docker 镜像
docker build -t flask-app .
docker run -p 8000:8000 flask-app
9. Flask 扩展生态
Flask 具有丰富的扩展生态,提供了各种功能的插件,以下是几个常用的扩展:
- Flask-SQLAlchemy:用于与数据库进行交互的 ORM 工具。
- Flask-Migrate:提供数据库迁移功能。
- Flask-Login:用于用户认证和会话管理。
- Flask-JWT-Extended:用于基于 JWT 的身份认证。
- Flask-Caching:提供缓存支持。
- Flask-Mail:用于发送电子邮件。
10. Flask 中间件
Flask 支持中间件机制,可以在请求和响应处理过程中拦截并修改请求或响应。中间件可以用于执行日志记录、处理 CORS(跨域资源共享)、进行身份验证等任务。
示例:自定义中间件
from werkzeug.wrappers import Request, Response
class SimpleMiddleware:
def __init__(self, app):
self.app = app
def __call__(self, environ, start_response):
# 请求前逻辑
print("Middleware before request")
request = Request(environ)
# 继续处理请求
response = self.app(environ, start_response)
# 请求后逻辑
print("Middleware after request")
return response
app = Flask(__name__)
app.wsgi_app = SimpleMiddleware(app.wsgi_app)
@app.route('/')
def index():
return "Hello, Flask with Middleware!"
if __name__ == '__main__':
app.run(debug=True)
详解:
__call__
方法接收environ
和start_response
,它是 WSGI 应用的标准调用格式。- 中间件可以在请求处理前和响应处理后执行逻辑。
11. Flask 表单处理(Flask-WTF)
Flask-WTF 是一个集成了 WTForms 的 Flask 扩展,提供了对表单的处理和 CSRF 保护。
安装 Flask-WTF
pip install Flask-WTF
使用示例
- 创建表单
from flask_wtf import FlaskForm
from wtforms import StringField, SubmitField
from wtforms.validators import DataRequired
class NameForm(FlaskForm):
name = StringField('Your Name', validators=[DataRequired()])
submit = SubmitField('Submit')
- 视图处理表单
from flask import Flask, render_template, flash, redirect, url_for
from forms import NameForm
app = Flask(__name__)
app.config['SECRET_KEY'] = 'a_secret_key'
@app.route('/form', methods=['GET', 'POST'])
def form():
form = NameForm()
if form.validate_on_submit():
flash(f'Hello, {form.name.data}!')
return redirect(url_for('form'))
return render_template('form.html', form=form)
if __name__ == '__main__':
app.run(debug=True)
- HTML 模板
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Form Example</title>
</head>
<body>
<form method="POST">
{{ form.hidden_tag() }}
{{ form.name.label }} {{ form.name(size=32) }}
{{ form.submit() }}
</form>
{% with messages = get_flashed_messages() %}
{% if messages %}
<ul>
{% for message in messages %}
<li>{{ message }}</li>
{% endfor %}
</ul>
{% endif %}
{% endwith %}
</body>
</html>
详解:
FlaskForm
:处理表单数据的基类。validate_on_submit
:当表单通过验证后返回True
。flash
:显示临时消息。
12. Flask 与 WebSocket(Flask-SocketIO)
Flask-SocketIO 是 Flask 的扩展,支持 WebSocket 和实时通信。
安装 Flask-SocketIO
pip install Flask-SocketIO
使用示例
- WebSocket 服务器
from flask import Flask, render_template
from flask_socketio import SocketIO, send
app = Flask(__name__)
app.config['SECRET_KEY'] = 'mysecret'
socketio = SocketIO(app)
@app.route('/')
def index():
return render_template('index.html')
@socketio.on('message')
def handle_message(msg):
print('Message received: ' + msg)
send(msg, broadcast=True)
if __name__ == '__main__':
socketio.run(app, debug=True)
- 前端 WebSocket 客户端
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>WebSocket Example</title>
</head>
<body>
<h1>WebSocket Chat</h1>
<input type="text" id="messageInput">
<button onclick="sendMessage()">Send</button>
<ul id="messages"></ul>
<script src="//cdnjs.cloudflare.com/ajax/libs/socket.io/4.0.1/socket.io.js"></script>
<script type="text/javascript">
var socket = io();
socket.on('message', function(msg) {
var li = document.createElement("li");
li.appendChild(document.createTextNode(msg));
document.getElementById("messages").appendChild(li);
});
function sendMessage() {
var msg = document.getElementById("messageInput").value;
socket.send(msg);
}
</script>
</body>
</html>
详解:
SocketIO
:集成 WebSocket 的核心对象。@socketio.on('message')
:监听 WebSocket 消息事件。- 前端 WebSocket 客户端:通过
io()
连接服务器并发送消息。
13. 使用 Celery 实现异步任务队列
Flask 和 Celery 可以组合使用,实现异步任务的处理,比如发送电子邮件、执行耗时的计算等。
安装 Celery
pip install celery
配置 Flask 和 Celery
- 初始化 Celery
from flask import Flask
from celery import Celery
app = Flask(__name__)
app.config['CELERY_BROKER_URL'] = 'redis://localhost:6379/0'
app.config['CELERY_RESULT_BACKEND'] = 'redis://localhost:6379/0'
def make_celery(app):
celery = Celery(app.import_name, broker=app.config['CELERY_BROKER_URL'])
celery.conf.update(app.config)
return celery
celery = make_celery(app)
- 定义异步任务
@celery.task
def send_email(email_address):
# 假设有发送邮件的逻辑
print(f"Sending email to {email_address}")
- 在视图中调用异步任务
@app.route('/send/<email>')
def send(email):
send_email.delay(email)
return f"Email will be sent to {email}"
详解:
celery.task
:定义一个异步任务。delay()
:以异步方式执行任务,而不阻塞主线程。
14. Flask 单元测试
单元测试是确保应用程序正常工作的关键步骤。Flask 提供了测试客户端,用于模拟请求并测试响应。
使用示例
- 编写测试
import unittest
from app import app
class FlaskTestCase(unittest.TestCase):
def setUp(self):
app.config['TESTING'] = True
self.app = app.test_client()
def test_index(self):
rv = self.app.get('/')
assert b'Hello, Flask' in rv.data
if __name__ == '__main__':
unittest.main()
- 运行测试
python -m unittest test_app.py
详解:
setUp
:在测试开始前设置测试环境。test_client
:创建一个 Flask 测试客户端用于模拟 HTTP 请求。
15. 使用 Flask-Admin 构建后台管理系统
在一些应用中,需要一个后台管理系统来管理数据或用户。Flask-Admin
是一个快速构建后台管理面板的扩展,它能够自动为你生成增删改查的界面。
安装 Flask-Admin
pip install Flask-Admin
示例:创建简单的后台管理系统
- 定义模型
from flask import Flask
from flask_sqlalchemy import SQLAlchemy
from flask_admin import Admin
from flask_admin.contrib.sqla import ModelView
app = Flask(__name__)
app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:///admin_example.db'
app.config['SECRET_KEY'] = 'mysecretkey'
db = SQLAlchemy(app)
# 定义模型
class User(db.Model):
id = db.Column(db.Integer, primary_key=True)
name = db.Column(db.String(50))
email = db.Column(db.String(50))
# 初始化数据库
db.create_all()
# 添加 Flask-Admin
admin = Admin(app, name='MyAdmin', template_mode='bootstrap3')
admin.add_view(ModelView(User, db.session))
if __name__ == '__main__':
app.run(debug=True)
- 访问管理面板
启动应用后,访问 http://127.0.0.1:5000/admin
,你会看到一个自动生成的后台管理界面,可以对 User
模型进行增删改查操作。
详解:
Flask-Admin
:用于快速生成管理面板。ModelView
:为数据库模型提供基础的管理视图。
16. Flask 安全性提升
在 Web 开发中,安全性是至关重要的,Flask 也提供了一些内置的安全机制。以下是一些关键的安全性方面的实践。
1. CSRF 保护
跨站请求伪造(CSRF)攻击是一种常见的安全威胁。通过使用 Flask-WTF
提供的 CSRF 保护,你可以避免这种攻击。
启用 CSRF 保护
from flask import Flask
from flask_wtf.csrf import CSRFProtect
app = Flask(__name__)
app.config['SECRET_KEY'] = 'your_secret_key'
csrf = CSRFProtect(app)
在启用 CSRF 后,所有带有表单的 POST 请求必须包含 CSRF 令牌。
2. 密码加密与验证
当存储用户密码时,必须对密码进行加密。可以使用 Werkzeug
提供的 generate_password_hash
和 check_password_hash
方法。
示例:密码加密与验证
from werkzeug.security import generate_password_hash, check_password_hash
# 加密密码
hashed_password = generate_password_hash('mysecretpassword')
# 验证密码
check_password_hash(hashed_password, 'mysecretpassword')
3. 使用 HTTPS
在生产环境中,所有流量应该通过 HTTPS 进行加密,Flask 支持通过 SSL 来启用 HTTPS。
启用 SSL 示例
from flask import Flask
app = Flask(__name__)
if __name__ == '__main__':
app.run(ssl_context=('cert.pem', 'key.pem'))
通过 ssl_context
参数,你可以指定证书文件和密钥文件,从而启用 HTTPS。
17. Flask 与 GraphQL 集成(Flask-GraphQL)
GraphQL 是一种灵活的查询语言,能够精确控制前端需要的数据,避免传统 REST API 的一些弊端。Flask-GraphQL
是用于将 GraphQL 与 Flask 集成的扩展。
安装 Flask-GraphQL
pip install Flask-GraphQL graphene
使用示例
- 定义 GraphQL Schema
import graphene
class User(graphene.ObjectType):
id = graphene.Int()
name = graphene.String()
class Query(graphene.ObjectType):
users = graphene.List(User)
def resolve_users(root, info):
return [
User(id=1, name="John Doe"),
User(id=2, name="Jane Doe")
]
schema = graphene.Schema(query=Query)
- 集成到 Flask
from flask import Flask
from flask_graphql import GraphQLView
app = Flask(__name__)
app.add_url_rule(
'/graphql',
view_func=GraphQLView.as_view(
'graphql',
schema=schema,
graphiql=True # 启用 GraphiQL IDE
)
)
if __name__ == '__main__':
app.run(debug=True)
通过访问 http://127.0.0.1:5000/graphql
,可以通过 GraphiQL UI 来发送查询请求。
GraphQL 查询示例
{
users {
id
name
}
}
18. 扩展 Flask 的日志功能
在大型应用中,日志记录是十分重要的,尤其是在调试和跟踪问题时。Flask 提供了基础的日志支持,并且可以通过 Python 的 logging
模块来扩展日志功能。
示例:配置日志
import logging
from flask import Flask
app = Flask(__name__)
# 设置日志级别
logging.basicConfig(filename='app.log', level=logging.DEBUG)
@app.route('/')
def index():
app.logger.info('This is an info message')
return 'Hello, Flask logging!'
if __name__ == '__main__':
app.run(debug=True)
详解:
app.logger
:Flask 提供的默认日志记录器,可以记录不同级别的信息。logging.basicConfig
:配置日志输出的文件和级别。
通过这种方式,可以将日志写入文件,或者配置其他日志处理器,如远程日志服务器、日志轮转等。
19. 使用 Flask 缓存(Flask-Caching)
缓存可以大幅提升应用性能,特别是在处理一些频繁访问且计算开销较大的请求时。Flask-Caching
提供了方便的缓存支持。
安装 Flask-Caching
pip install Flask-Caching
示例:缓存视图
from flask import Flask
from flask_caching import Cache
app = Flask(__name__)
app.config['CACHE_TYPE'] = 'simple'
cache = Cache(app)
@app.route('/')
@cache.cached(timeout=60)
def index():
return "This is cached for 60 seconds."
if __name__ == '__main__':
app.run(debug=True)
详解:
CACHE_TYPE
:配置缓存类型,如simple
表示使用内存缓存,redis
表示使用 Redis 缓存。@cache.cached(timeout=60)
:缓存装饰器,用于缓存视图的响应。
20. 使用 Flask-Mail 发送电子邮件
在某些应用中,发送电子邮件是常见需求,Flask-Mail
提供了简洁的接口来实现这一功能。
安装 Flask-Mail
pip install Flask-Mail
使用示例
- 配置 Flask-Mail
from flask import Flask
from flask_mail import Mail, Message
app = Flask(__name__)
app.config['MAIL_SERVER'] = 'smtp.example.com'
app.config['MAIL_PORT'] = 587
app.config['MAIL_USE_TLS'] = True
app.config['MAIL_USERNAME'] = 'your-email@example.com'
app.config['MAIL_PASSWORD'] = 'your-password'
mail = Mail(app)
- 发送邮件
@app.route('/send-mail')
def send_mail():
msg = Message("Hello", sender="your-email@example.com", recipients=["to@example.com"])
msg.body = "This is a test email"
mail.send(msg)
return "Mail sent!"
通过配置 MAIL_SERVER
、MAIL_PORT
等参数,Flask 可以通过 SMTP 服务器发送电子邮件。
21. Flask 与 Redis 集成
Redis 是一个高性能的键值对存储系统,广泛用于缓存、消息队列和会话管理中。Flask 可以通过 Flask-Redis
扩展与 Redis 进行集成。
安装 Redis 和 Flask-Redis
pip install redis Flask-Redis
示例:Flask 与 Redis 集成
- 配置 Redis
from flask import Flask
from flask_redis import FlaskRedis
app = Flask(__name__)
app.config['REDIS_URL'] = "redis://localhost:6379/0"
redis_client = FlaskRedis(app)
- 使用 Redis 存储和读取数据
@app.route('/set/<name>')
def set_name(name):
redis_client.set('name', name)
return f'Name set to {name}'
@app.route('/get')
def get_name():
name = redis_client.get('name').decode('utf-8')
return f'Name is {name}'
详解:
FlaskRedis
:Flask-Redis
提供的 Redis 客户端。redis_client.set
和redis_client.get
:用于设置和获取 Redis 中的键值对。
22. 使用 Flask-Migrate 进行数据库迁移
在 Flask 应用开发中,随着数据库结构的变化,数据库迁移是一项非常重要的任务。Flask-Migrate
基于 Alembic,提供了方便的数据库迁移功能。
安装 Flask-Migrate
pip install Flask-Migrate
使用示例
- 配置 Flask-Migrate
from flask import Flask
from flask_sqlalchemy import SQLAlchemy
from flask_migrate import Migrate
app = Flask(__name__)
app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:///migrate_example.db'
db = SQLAlchemy(app)
migrate = Migrate(app, db)
- 创建数据库模型
class User(db.Model):
id = db.Column(db.Integer, primary_key=True)
name = db.Column(db.String(50))
-
迁移命令
-
初始化迁移目录:
bash
flask db init
- 创建迁移脚本:
bash
flask db migrate -m "Initial migration."
- 应用迁移:
bash
flask db upgrade
详解:
flask db migrate
:生成数据库迁移脚本。flask db upgrade
:应用迁移,更新数据库结构。
23. 使用 Flask-RESTful 构建 REST API
Flask-RESTful 是用于构建 REST API 的 Flask 扩展,简化了 API 资源定义和路由处理。
安装 Flask-RESTful
pip install Flask-RESTful
使用示例
- 创建 API
from flask import Flask
from flask_restful import Resource, Api
app = Flask(__name__)
api = Api(app)
class HelloWorld(Resource):
def get(self):
return {'message': 'Hello, World!'}
api.add_resource(HelloWorld, '/')
if __name__ == '__main__':
app.run(debug=True)
- 扩展 API
class User(Resource):
def get(self, user_id):
return {'user_id': user_id}
api.add_resource(User, '/user/<int:user_id>')
详解:
Resource
:每个 API 资源类继承自Resource
。api.add_resource
:定义路由和资源之间的映射。
24. Flask 环境变量管理
在实际开发中,管理应用的环境变量(如数据库连接、API 密钥等)是很常见的需求。可以使用 python-dotenv
来管理这些变量。
安装 python-dotenv
pip install python-dotenv
使用示例
- 创建
.env
文件
FLASK_APP=app.py
FLASK_ENV=development
SECRET_KEY=your_secret_key
- 加载环境变量
from flask import Flask
from dotenv import load_dotenv
import os
load_dotenv()
app = Flask(__name__)
app.config['SECRET_KEY'] = os.getenv('SECRET_KEY')
@app.route('/')
def index():
return f'Secret key is {app.config["SECRET_KEY"]}'
if __name__ == '__main__':
app.run(debug=True)
详解:
load_dotenv
:从.env
文件加载环境变量。os.getenv
:获取指定环境变量的值。
25. 使用 Flask-JWT-Extended 进行 JWT 身份验证
JSON Web Token (JWT) 是一种常见的身份验证机制,Flask-JWT-Extended
可以帮助你在 Flask 中快速实现基于 JWT 的身份验证。
安装 Flask-JWT-Extended
pip install Flask-JWT-Extended
使用示例
- 配置 Flask-JWT-Extended
from flask import Flask, jsonify
from flask_jwt_extended import JWTManager, create_access_token, jwt_required
app = Flask(__name__)
app.config['JWT_SECRET_KEY'] = 'super-secret-key'
jwt = JWTManager(app)
- 创建登录和保护路由
@app.route('/login', methods=['POST'])
def login():
access_token = create_access_token(identity={'username': 'test'})
return jsonify(access_token=access_token)
@app.route('/protected', methods=['GET'])
@jwt_required()
def protected():
return jsonify(message="You are viewing a protected route.")
if __name__ == '__main__':
app.run(debug=True)
详解:
create_access_token
:生成 JWT 令牌。@jwt_required()
:保护路由,使其只能被已认证的用户访问。
26. Flask 自定义错误处理
在生产环境中,自定义错误页面或 API 错误响应是提升用户体验的重要手段。
示例:自定义 404 错误页面
from flask import Flask, render_template
app = Flask(__name__)
@app.errorhandler(404)
def page_not_found(e):
return render_template('404.html'), 404
if __name__ == '__main__':
app.run(debug=True)
详解:
@app.errorhandler(404)
:拦截 404 错误并自定义返回内容。render_template
:返回自定义 HTML 页面。
示例:自定义 API 错误响应
@app.errorhandler(400)
def bad_request(e):
return jsonify(error="Bad request"), 400
详解:
jsonify
:用于 API 返回 JSON 格式的错误消息。- 自定义状态码:第二个参数指定 HTTP 状态码,如 400 表示请求错误。
27. 使用 Flask-Limiter 实现速率限制
在 Web 应用中,为了防止某些 IP 或用户过度访问 API,需要进行速率限制。Flask-Limiter
提供了对 API 或页面访问速率的控制。
安装 Flask-Limiter
pip install Flask-Limiter
使用示例
- 配置 Flask-Limiter
from flask import Flask
from flask_limiter import Limiter
from flask_limiter.util import get_remote_address
app = Flask(__name__)
limiter = Limiter(
get_remote_address,
app=app,
default_limits=["200 per day", "50 per hour"]
)
- 为路由添加速率限制
@app.route('/limited')
@limiter.limit("10 per minute")
def limited():
return "This route is rate limited."
详解:
default_limits
:设置全局默认的速率限制。@limiter.limit
:为特定路由设置速率限制,格式为“次数/时间单位”。
28. 使用 Flask-SQLAlchemy 实现多数据库支持
在某些场景下,可能需要同时连接多个数据库。Flask-SQLAlchemy
支持多个数据库连接。
示例:多数据库配置
app.config['SQLALCHEMY_BINDS'] = {
'users_db': 'sqlite:///users.db',
'products_db': 'sqlite:///products.db'
}
db = SQLAlchemy(app)
class User(db.Model):
__bind_key__ = 'users_db'
id = db.Column(db.Integer, primary_key=True)
name = db.Column(db.String(50))
class Product(db.Model):
__bind_key__ = 'products_db'
id = db.Column(db.Integer, primary_key=True)
name = db.Column(db.String(50))
详解:
SQLALCHEMY_BINDS
:配置多个数据库。__bind_key__
:模型类的__bind_key__
属性指定其连接的数据库。
29. Flask-Celery 实现异步任务队列
在某些情况下,Flask 应用需要处理一些耗时的任务,例如发送电子邮件、生成报告等。Celery
是一个分布式任务队列,可以帮助 Flask 实现异步任务处理。
安装 Celery
pip install celery
示例:Flask 与 Celery 集成
- 配置 Celery
from celery import Celery
from flask import Flask
app = Flask(__name__)
app.config['CELERY_BROKER_URL'] = 'redis://localhost:6379/0'
app.config['CELERY_RESULT_BACKEND'] = 'redis://localhost:6379/0'
def make_celery(app):
celery = Celery(app.import_name, broker=app.config['CELERY_BROKER_URL'])
celery.conf.update(app.config)
return celery
celery = make_celery(app)
- 定义异步任务
@celery.task
def send_email_task(email):
# 假设这里是发送电子邮件的逻辑
print(f"Sending email to {email}")
return 'Email sent!'
@app.route('/send/<email>')
def send_email(email):
send_email_task.delay(email)
return f'Sending email to {email} in background!'
详解:
Celery
:创建任务队列的核心工具。@celery.task
:定义异步任务。delay()
:调用异步任务并在后台运行。
30. 使用 Flask-SocketIO 实现实时通信
WebSocket 可以用于实现实时的双向通信,例如聊天应用或实时通知。Flask-SocketIO
是用于在 Flask 中集成 WebSocket 的扩展。
安装 Flask-SocketIO
pip install Flask-SocketIO
使用示例
- 配置 Flask-SocketIO
from flask import Flask, render_template
from flask_socketio import SocketIO, send
app = Flask(__name__)
app.config['SECRET_KEY'] = 'mysecret'
socketio = SocketIO(app)
@app.route('/')
def index():
return render_template('index.html')
@socketio.on('message')
def handle_message(msg):
print(f"Message: {msg}")
send(f"Received: {msg}", broadcast=True)
if __name__ == '__main__':
socketio.run(app, debug=True)
- 前端代码
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>SocketIO Chat</title>
</head>
<body>
<h1>Chat</h1>
<ul id="messages"></ul>
<input id="message" autocomplete="off"><button onclick="sendMessage()">Send</button>
<script src="//cdnjs.cloudflare.com/ajax/libs/socket.io/4.0.1/socket.io.js"></script>
<script>
var socket = io();
socket.on('message', function(msg) {
var li = document.createElement("li");
li.appendChild(document.createTextNode(msg));
document.getElementById("messages").appendChild(li);
});
function sendMessage() {
var msg = document.getElementById("message").value;
socket.send(msg);
}
</script>
</body>
</html>
详解:
SocketIO
:Flask-SocketIO 提供的实时通信支持。@socketio.on('message')
:处理客户端发送的消息。
31. Flask 与外部 API 集成(例如使用第三方 API)
在实际开发中,很多时候需要与外部 API 集成,如社交登录、天气查询等。可以使用 requests
库来与外部 API 进行交互。
安装 requests
pip install requests
示例:与 GitHub API 集成
import requests
from flask import Flask, jsonify
app = Flask(__name__)
@app.route('/github/<username>')
def github_user(username):
response = requests.get(f'https://api.github.com/users/{username}')
if response.status_code == 200:
user_data = response.json()
return jsonify(user_data)
else:
return jsonify({"error": "User not found"}), 404
if __name__ == '__main__':
app.run(debug=True)
详解:
requests.get
:发送 HTTP GET 请求。response.json()
:将 API 返回的 JSON 数据转换为 Python 字典。
32. 使用 Flask-Uploads 管理文件上传
文件上传是 Web 应用中常见的功能,Flask-Uploads
可以帮助你管理文件上传。
安装 Flask-Uploads
pip install Flask-Uploads
使用示例
- 配置 Flask-Uploads
from flask import Flask, request
from flask_uploads import UploadSet, configure_uploads, IMAGES
app = Flask(__name__)
# 配置上传路径
app.config['UPLOADED_PHOTOS_DEST'] = 'uploads'
photos = UploadSet('photos', IMAGES)
configure_uploads(app, photos)
- 创建文件上传路由
@app.route('/upload', methods=['GET', 'POST'])
def upload():
if request.method == 'POST' and 'photo' in request.files:
filename = photos.save(request.files['photo'])
return f'Photo saved as {filename}'
return '''
<form method="post" enctype="multipart/form-data">
<input type="file" name="photo">
<input type="submit" value="Upload">
</form>
'''
if __name__ == '__main__':
app.run(debug=True)
详解:
UploadSet
:定义允许上传的文件类型,如图片。photos.save
:保存上传的文件到指定目录。
33. 使用 Flask-Principal 实现角色与权限管理
在一些复杂的系统中,不同用户具有不同的权限,可以使用 Flask-Principal
实现基于角色的权限管理。
安装 Flask-Principal
pip install Flask-Principal
使用示例
- 配置 Flask-Principal
from flask import Flask, redirect, url_for
from flask_principal import Principal, Permission, RoleNeed
app = Flask(__name__)
principals = Principal(app)
# 定义权限
admin_permission = Permission(RoleNeed('admin'))
@app.route('/')
def index():
return 'Home Page'
@app.route('/admin')
@admin_permission.require(http_exception=403)
def admin():
return 'Admin Page'
- 模拟用户角色
@app.before_request
def before_request():
# 假设此处设置用户角色,实际应用中应根据用户登录信息设置
if request.endpoint == 'admin':
g.identity = Identity('admin')
详解:
RoleNeed
:定义角色需求。Permission.require
:对路由进行权限检查,未通过则返回指定错误码。
34. 使用 Flask-RESTPlus 构建文档化的 REST API
Flask-RESTPlus
不仅提供 REST API 的支持,还能生成 API 文档(如 Swagger UI)。
安装 Flask-RESTPlus
pip install Flask-RESTPlus
使用示例
- 配置 Flask-RESTPlus
from flask import Flask
from flask_restplus import Api, Resource
app = Flask(__name__)
api = Api(app)
@api.route('/hello')
class HelloWorld(Resource):
def get(self):
return {'message': 'Hello, World!'}
if __name__ == '__main__':
app.run(debug=True)
- 访问 API 文档
启动应用后,访问 http://127.0.0.1:5000/
可以查看自动生成的 Swagger 文档界面。
35. 使用 Flask-SeaSurf 提供 CSRF 保护
在 Web 开发中,防止跨站请求伪造(CSRF)是重要的安全措施,Flask-SeaSurf
可以帮助你实现 CSRF 保护。
安装 Flask-SeaSurf
pip install Flask-SeaSurf
使用示例
- 配置 Flask-SeaSurf
from flask import Flask
from flask_seasurf import SeaSurf
app = Flask(__name__)
csrf = SeaSurf(app)
@app.route('/', methods=['GET', 'POST'])
def index():
return 'CSRF protected page'
if __name__ == '__main__':
app.run(debug=True)
- 自动启用 CSRF 保护
Flask-SeaSurf
会自动为所有非 GET 请求添加 CSRF 保护,确保安全性。
36. 使用 Flask-Caching 实现缓存
缓存可以显著提高应用性能,Flask-Caching
允许你在 Flask 应用中轻松实现缓存。
安装 Flask-Caching
pip install Flask-Caching
示例:配置 Flask-Caching
- 配置缓存
from flask import Flask
from flask_caching import Cache
app = Flask(__name__)
app.config['CACHE_TYPE'] = 'simple'
cache = Cache(app)
- 使用缓存
@app.route('/expensive')
@cache.cached(timeout=60)
def expensive():
# 模拟一个耗时的操作
import time
time.sleep(5)
return 'This is an expensive operation.'
详解:
@cache.cached
:装饰器用于缓存视图函数的结果,timeout
指定缓存的过期时间(秒)。
37. 使用 Flask-Admin 创建后台管理界面
Flask-Admin
提供了一个简单的方式来为 Flask 应用生成后台管理界面。
安装 Flask-Admin
pip install Flask-Admin
示例:配置 Flask-Admin
- 创建管理界面
from flask import Flask
from flask_admin import Admin
from flask_admin.contrib.sqla import ModelView
from flask_sqlalchemy import SQLAlchemy
app = Flask(__name__)
app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:///admin_example.db'
db = SQLAlchemy(app)
admin = Admin(app, name='Admin Dashboard', template_mode='bootstrap3')
class User(db.Model):
id = db.Column(db.Integer, primary_key=True)
name = db.Column(db.String(50))
admin.add_view(ModelView(User, db.session))
if __name__ == '__main__':
app.run(debug=True)
- 访问管理界面
启动应用后,访问 http://127.0.0.1:5000/admin
可以查看后台管理界面。
详解:
ModelView
:自动生成模型的管理界面。admin.add_view
:将视图添加到后台管理界面。
38. 使用 Flask-Security 实现用户认证和授权
Flask-Security
提供了全面的用户认证和授权功能,包括登录、注册、角色管理等。
安装 Flask-Security
pip install Flask-Security
示例:配置 Flask-Security
- 配置 Flask-Security
from flask import Flask
from flask_sqlalchemy import SQLAlchemy
from flask_security import Security, SQLAlchemyUserDatastore, UserMixin, RoleMixin
app = Flask(__name__)
app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:///security_example.db'
app.config['SECRET_KEY'] = 'mysecret'
app.config['SECURITY_REGISTERABLE'] = True
app.config['SECURITY_CONFIRMABLE'] = True
db = SQLAlchemy(app)
class Role(db.Model, RoleMixin):
id = db.Column(db.Integer, primary_key=True)
name = db.Column(db.String(80), unique=True)
description = db.Column(db.String(255))
class User(db.Model, UserMixin):
id = db.Column(db.Integer, primary_key=True)
email = db.Column(db.String(255), unique=True)
password = db.Column(db.String(255))
active = db.Column(db.Boolean())
user_datastore = SQLAlchemyUserDatastore(db, User, Role)
security = Security(app, user_datastore)
- 创建用户认证和授权
@app.route('/login')
def login():
return 'Login page'
@app.route('/admin')
@roles_required('admin')
def admin():
return 'Admin page'
if __name__ == '__main__':
app.run(debug=True)
详解:
SQLAlchemyUserDatastore
:将 SQLAlchemy 用户模型与 Flask-Security 集成。@roles_required
:装饰器用于限制访问特定角色的页面。
39. 使用 Flask-Mail 发送电子邮件
Flask-Mail
允许你在 Flask 应用中发送电子邮件,适用于用户通知、密码重置等功能。
安装 Flask-Mail
pip install Flask-Mail
示例:配置 Flask-Mail
- 配置邮件发送
from flask import Flask, request, render_template_string
from flask_mail import Mail, Message
app = Flask(__name__)
app.config['MAIL_SERVER'] = 'smtp.example.com'
app.config['MAIL_PORT'] = 587
app.config['MAIL_USERNAME'] = 'your_username'
app.config['MAIL_PASSWORD'] = 'your_password'
app.config['MAIL_USE_TLS'] = True
app.config['MAIL_USE_SSL'] = False
mail = Mail(app)
@app.route('/send_email')
def send_email():
msg = Message('Hello', sender='from@example.com', recipients=['to@example.com'])
msg.body = 'This is a test email sent from Flask.'
mail.send(msg)
return 'Email sent!'
详解:
Message
:创建邮件消息。mail.send
:发送邮件。
40. 使用 Flask-Jinja2 进行模板继承和宏
Jinja2
是 Flask 默认的模板引擎,支持模板继承和宏,允许你创建可复用的模板结构。
示例:模板继承
- 创建基础模板
base.html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>{% block title %}My Site{% endblock %}</title>
</head>
<body>
<header>
<h1>My Site</h1>
</header>
<main>
{% block content %}{% endblock %}
</main>
<footer>
<p>Footer content</p>
</footer>
</body>
</html>
- 继承基础模板
{% extends "base.html" %}
{% block title %}Home{% endblock %}
{% block content %}
<h2>Welcome to the home page!</h2>
<p>This is the home page content.</p>
{% endblock %}
详解:
{% extends %}
:继承基础模板。{% block %}
:定义可以被子模板覆盖的块。
41. 使用 Flask-SocketIO 处理 WebSocket 连接
除了实时通信,Flask-SocketIO
还支持 WebSocket 连接,用于双向数据传输。
示例:处理 WebSocket 事件
- 配置 WebSocket 连接
from flask import Flask, render_template
from flask_socketio import SocketIO, emit
app = Flask(__name__)
socketio = SocketIO(app)
@app.route('/')
def index():
return render_template('index.html')
@socketio.on('connect')
def handle_connect():
emit('response', {'data': 'Connected!'})
@socketio.on('message')
def handle_message(message):
emit('response', {'data': f'Received message: {message}'})
if __name__ == '__main__':
socketio.run(app, debug=True)
- 前端 WebSocket 连接
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>WebSocket Example</title>
</head>
<body>
<h1>WebSocket Example</h1>
<button onclick="sendMessage()">Send Message</button>
<p id="response"></p>
<script src="//cdnjs.cloudflare.com/ajax/libs/socket.io/4.0.1/socket.io.js"></script>
<script>
var socket = io();
socket.on('response', function(data) {
document.getElementById('response').innerText = data.data;
});
function sendMessage() {
socket.send('Hello, server!');
}
</script>
</body>
</html>
详解:
emit
:发送消息到客户端或其他事件处理器。@socketio.on('connect')
:处理 WebSocket 连接事件。
42. 使用 Flask-Admin 实现表单处理
Flask-Admin
提供了一个强大的界面来处理模型数据的创建、更新和删除。
示例:配置表单处理
- 创建表单视图
from flask_admin.contrib.sqla import ModelView
class MyModelView(ModelView):
form_columns = ['name', 'description']
column_searchable_list = ['name']
column_filters = ['name']
admin.add_view(MyModelView(User, db.session))
详解:
form_columns
:定义在表单中显示的字段。column_searchable_list
和column_filters
:定义可搜索和过滤的字段。
43. 使用 Flask-SQLAlchemy 实现数据库关系
Flask-SQLAlchemy
支持定义和操作复杂的数据库关系,例如一对多、多对多等。
示例:一对多关系
- 定义模型
class Author(db.Model):
id = db.Column(db.Integer, primary_key=True)
name = db.Column(db.String(50))
books = db.relationship('Book', backref='author', lazy=True)
class Book(db.Model):
id = db.Column(db.Integer, primary_key=True)
title = db.Column(db.String(100))
author_id = db.Column(db.Integer, db.ForeignKey('author.id'), nullable=False)
- 操作关系
@app.route('/add_book')
def add_book():
author = Author.query.first()
book = Book(title='New Book', author=author)
db.session.add(book)
db.session.commit()
return 'Book added!'
详解:
db.relationship
:定义模型之间的关系。db.ForeignKey
:定义外键约束。
44. 使用 Flask-Babel 实现国际化和本地化
Flask-Babel
允许你在 Flask 应用中实现国际化(i18n)和本地化(l10n)。
安装 Flask-Babel
pip install Flask-Babel
示例:配置 Flask-Babel
- 配置国际化
from flask import Flask, request, render_template
from flask_babel import Babel, _
app = Flask(__name__)
app.config['BABEL_DEFAULT_LOCALE'] = 'en'
babel = Babel(app)
@app.route('/')
def index():
return render_template('index.html', greeting=_('Hello'))
@babel.localeselector
def get_locale():
return request.accept_languages.best_match(['en', 'es'])
if __name__ == '__main__':
app.run(debug=True)
- 模板中使用
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>{{ _('Welcome') }}</title>
</head>
<body>
<h1>{{ greeting }}</h1>
</body>
</html>
详解:
_()
:用于标记需要翻译的文本。babel.localeselector
:选择用户的语言设置。
45. 使用 Flask-RESTful 实现 REST API
Flask-RESTful
是 Flask
的扩展,用于构建 REST API。
安装 Flask-RESTful
pip install Flask-RESTful
示例:创建 REST API
- 配置 REST API
from flask import Flask
from flask_restful import Api, Resource
app = Flask(__name__)
api = Api(app)
class HelloWorld(Resource):
def get(self):
return {'message': 'Hello, World!'}
api.add_resource(HelloWorld, '/')
if __name__ == '__main__':
app.run(debug=True)
详解:
Resource
:定义 API 资源。api.add_resource
:将资源添加到 API 路由中。
46. 使用 Flask-Migrate 实现数据库迁移
Flask-Migrate
基于 Alembic
,用于处理数据库迁移和版本控制。
安装 Flask-Migrate
pip install Flask-Migrate
示例:配置 Flask-Migrate
- 配置迁移
from flask import Flask
from flask_sqlalchemy import SQLAlchemy
from flask_migrate import Migrate
app = Flask(__name__)
app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:///migrate_example.db'
db = SQLAlchemy(app)
migrate = Migrate(app, db)
- 创建迁移
flask db init
flask db migrate -m "Initial migration."
flask db upgrade
详解:
flask db init
:初始化迁移仓库。flask db migrate
:创建迁移脚本。flask db upgrade
:应用迁移到数据库。
47. 使用 Flask-RESTPlus 进行 API 文档自动生成
Flask-RESTPlus
提供了自动生成 API 文档的功能,帮助你创建清晰的 API 文档。
示例:创建 API 并生成文档
- 配置 Flask-RESTPlus
from flask import Flask
from flask_restplus import Api, Resource
app = Flask(__name__)
api = Api(app, version='1.0', title='My API', description='A simple API')
ns = api.namespace('items', description='Item operations')
# 定义模型
item_model = api.model('Item', {
'name': api.fields.String(required=True, description='The item name'),
'description': api.fields.String(description='The item description'),
})
# 存储数据
items = []
@ns.route('/')
class ItemList(Resource):
@ns.doc('list_items')
@ns.marshal_list_with(item_model)
def get(self):
return items
@ns.doc('create_item')
@ns.expect(item_model)
@ns.marshal_with(item_model, code=201)
def post(self):
item = api.payload
items.append(item)
return item, 201
if __name__ == '__main__':
app.run(debug=True)
- 访问 API 文档
启动应用后,访问 http://127.0.0.1:5000/
,可以查看 Swagger 自动生成的 API 文档界面。
详解:
Api
:创建 API 文档和路由。marshal_with
:将数据转换为 JSON 格式,并应用模型。expect
:定义请求负载的数据模型。
48. 使用 Flask-Cache 实现更高级的缓存策略
Flask-Cache
提供了更多的缓存后端和策略选择。
示例:配置 Flask-Cache
- 配置 Flask-Cache
from flask import Flask
from flask_caching import Cache
app = Flask(__name__)
app.config['CACHE_TYPE'] = 'redis'
app.config['CACHE_REDIS_URL'] = 'redis://localhost:6379/0'
cache = Cache(app)
- 使用缓存
@app.route('/cached')
@cache.cached(timeout=300)
def cached_view():
# 假设这里有复杂的计算
return 'This view is cached for 5 minutes.'
详解:
CACHE_TYPE
:指定缓存后端,例如 Redis、Memcached。CACHE_REDIS_URL
:Redis 缓存的连接 URL。
49. 使用 Flask-Bootstrap 集成 Bootstrap 前端框架
Flask-Bootstrap
使得在 Flask 应用中集成 Bootstrap 变得更容易。
安装 Flask-Bootstrap
pip install Flask-Bootstrap
示例:集成 Bootstrap
- 配置 Flask-Bootstrap
from flask import Flask
from flask_bootstrap import Bootstrap
app = Flask(__name__)
bootstrap = Bootstrap(app)
- 使用 Bootstrap 模板
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Flask-Bootstrap Example</title>
{{ bootstrap.load_css() }}
</head>
<body>
<div class="container">
<h1>Hello, Flask-Bootstrap!</h1>
<p>This is a Bootstrap-styled page.</p>
</div>
{{ bootstrap.load_js() }}
</body>
</html>
详解:
bootstrap.load_css()
和bootstrap.load_js()
:加载 Bootstrap 的 CSS 和 JavaScript 文件。
50. 使用 Flask-Testing 进行单元测试
Flask-Testing
提供了便捷的工具来测试 Flask 应用。
安装 Flask-Testing
pip install Flask-Testing
示例:编写测试用例
- 编写测试
import unittest
from flask import Flask
from flask_testing import TestCase
app = Flask(__name__)
@app.route('/')
def index():
return 'Hello, World!'
class TestApp(TestCase):
def create_app(self):
return app
def test_index(self):
response = self.client.get('/')
self.assert200(response)
self.assertEqual(response.data, b'Hello, World!')
if __name__ == '__main__':
unittest.main()
详解:
TestCase
:提供测试功能的基类。self.client.get
:发送 GET 请求并获取响应。
51. 使用 Flask-Mail 进行模板化电子邮件
Flask-Mail
允许你发送模板化的电子邮件,提升用户体验。
示例:发送模板化电子邮件
- 配置 Flask-Mail
from flask import Flask, render_template
from flask_mail import Mail, Message
app = Flask(__name__)
app.config['MAIL_SERVER'] = 'smtp.example.com'
app.config['MAIL_PORT'] = 587
app.config['MAIL_USERNAME'] = 'your_username'
app.config['MAIL_PASSWORD'] = 'your_password'
app.config['MAIL_USE_TLS'] = True
mail = Mail(app)
- 发送模板化电子邮件
@app.route('/send_email')
def send_email():
msg = Message('Hello from Flask-Mail', sender='from@example.com', recipients=['to@example.com'])
msg.html = render_template('email_template.html', name='User')
mail.send(msg)
return 'Email sent!'
- 电子邮件模板
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Email Template</title>
</head>
<body>
<h1>Hello {{ name }}!</h1>
<p>This is a test email sent from Flask with a template.</p>
</body>
</html>
详解:
render_template
:渲染 HTML 模板并插入动态数据。
52. 使用 Flask-Principal 实现多角色权限控制
Flask-Principal
允许你实现复杂的权限控制,包括多角色支持。
示例:配置多角色权限
- 配置角色和权限
from flask import Flask
from flask_principal import Principal, RoleNeed, Permission, Identity, identity_loaded
app = Flask(__name__)
app.secret_key = 'supersecretkey'
principals = Principal(app)
admin_permission = Permission(RoleNeed('admin'))
user_permission = Permission(RoleNeed('user'))
@identity_loaded.connect_via(app)
def on_identity_loaded(sender, identity):
if hasattr(identity, 'id'):
identity.provides.add(admin_permission)
identity.provides.add(user_permission)
@app.route('/admin')
@admin_permission.require(http_exception=403)
def admin():
return 'Admin area'
@app.route('/user')
@user_permission.require(http_exception=403)
def user():
return 'User area'
if __name__ == '__main__':
app.run(debug=True)
详解:
identity.provides.add
:为用户身份添加权限。Permission.require
:检查访问权限。
53. 使用 Flask-SQLAlchemy 处理复杂查询
Flask-SQLAlchemy
支持执行复杂的 SQL 查询。
示例:复杂查询
- 定义模型
from flask import Flask
from flask_sqlalchemy import SQLAlchemy
app = Flask(__name__)
app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:///complex_query.db'
db = SQLAlchemy(app)
class Post(db.Model):
id = db.Column(db.Integer, primary_key=True)
title = db.Column(db.String(100))
content = db.Column(db.Text)
author_id = db.Column(db.Integer, db.ForeignKey('author.id'))
author = db.relationship('Author', back_populates='posts')
class Author(db.Model):
id = db.Column(db.Integer, primary_key=True)
name = db.Column(db.String(50))
posts = db.relationship('Post', back_populates='author')
- 执行复杂查询
@app.route('/author_posts/<int:author_id>')
def author_posts(author_id):
author = Author.query.get(author_id)
posts = Post.query.filter_by(author=author).all()
return {'author': author.name, 'posts': [post.title for post in posts]}
详解:
db.relationship
:定义模型之间的关系。filter_by
:根据条件过滤查询结果。
54. 使用 Flask-Migrate 实现复杂数据库迁移
Flask-Migrate
支持复杂的数据库迁移,包括添加索引、修改列类型等。
示例:复杂迁移操作
- 创建迁移
flask db migrate -m "Add new field"
- 编辑迁移脚本
编辑生成的迁移脚本以进行复杂的迁移操作,例如添加索引或修改字段。
from alembic import op
import sqlalchemy as sa
def upgrade():
op.add_column('post', sa.Column('published_date', sa.DateTime(), nullable=True))
op.create_index('ix_post_title', 'post', ['title'], unique=False)
def downgrade():
op.drop_index('ix_post_title', 'post')
op.drop_column('post', 'published_date')
详解:
op.create_index
:创建数据库索引。op.add_column
和op.drop_column
:添加或删除列。
55. 使用 Flask-Babel 实现多语言支持
Flask-Babel
提供了多语言支持,可以为应用程序实现本地化和国际化。
示例:实现多语言支持
- 配置 Flask-Babel
from flask import Flask, render_template
from flask_babel import Babel, _
app = Flask(__name__)
app.config['BABEL_DEFAULT_LOCALE'] = 'en'
babel = Babel(app)
@babel.localeselector
def get_locale():
return request.accept_languages.best_match(['en', 'es'])
@app.route('/')
def index():
return render_template('index.html', greeting=_('Hello'))
if __name__ == '__main__':
app.run(debug=True)
- 翻译文件
使用 pybabel
工具生成和更新翻译文件:
pybabel extract -F babel.cfg -o messages.pot .
pybabel init -i messages.pot -d translations -l es
pybabel update -i messages.pot -d translations
详解:
get_locale
:根据请求的语言选择适当的语言环境。pybabel
:管理翻译文件的工具。
56. 使用 Flask-User 实现用户认证和管理
Flask-User
提供了完整的用户认证、注册、密码重置等功能的实现。
安装 Flask-User
pip install Flask-User
示例:配置 Flask-User
- 配置 Flask-User
from flask import Flask, render_template
from flask_sqlalchemy import SQLAlchemy
from flask_user import UserManager, UserMixin
app = Flask(__name__)
app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:///user_example.db'
app.config['USER_ENABLE_EMAIL'] = False
app.config['SECRET_KEY'] = 'mysecretkey'
db = SQLAlchemy(app)
class User(db.Model, UserMixin):
id = db.Column(db.Integer, primary_key=True)
email = db.Column(db.String(255), unique=True, nullable=False)
password = db.Column(db.String(255), nullable=False)
user_manager = UserManager(app, db, User)
@app.route('/')
def index():
return render_template('index.html')
if __name__ == '__main__':
app.run(debug=True)
- 使用 Flask-User 的视图
Flask-User 自动提供了用户认证相关的视图,如登录、注册和密码重置。你可以通过访问默认路由来使用这些功能。
详解:
UserManager
:提供用户管理功能。UserMixin
:提供用户模型所需的默认方法和属性。
57. 使用 Flask-SocketIO 实现 WebSocket
Flask-SocketIO
为 Flask 应用提供了 WebSocket 支持。
安装 Flask-SocketIO
pip install flask-socketio
示例:配置 Flask-SocketIO
- 配置 WebSocket
from flask import Flask, render_template
from flask_socketio import SocketIO, emit
app = Flask(__name__)
app.config['SECRET_KEY'] = 'mysecretkey'
socketio = SocketIO(app)
@app.route('/')
def index():
return render_template('index.html')
@socketio.on('message')
def handle_message(msg):
print(f"Message received: {msg}")
emit('response', {'data': 'Message received!'})
if __name__ == '__main__':
socketio.run(app)
- 前端代码
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>WebSocket Example</title>
<script src="https://cdn.socket.io/4.0.0/socket.io.min.js"></script>
</head>
<body>
<h1>WebSocket Example</h1>
<button id="sendMessage">Send Message</button>
<script>
const socket = io();
document.getElementById('sendMessage').addEventListener('click', () => {
socket.send('Hello from client!');
});
socket.on('response', (data) => {
console.log(data.data);
});
</script>
</body>
</html>
详解:
SocketIO
:提供 WebSocket 功能。@socketio.on('message')
:定义处理消息的事件处理器。emit
:向客户端发送消息。
58. 使用 Flask-Uploads 管理文件上传
Flask-Uploads
使文件上传变得简单,支持各种文件类型和存储位置。
安装 Flask-Uploads
pip install Flask-Uploads
示例:配置 Flask-Uploads
- 配置文件上传
from flask import Flask, request, redirect, url_for
from flask_uploads import UploadSet, configure_uploads, ALL
app = Flask(__name__)
app.config['UPLOADED_PHOTOS_DEST'] = 'uploads/photos'
photos = UploadSet('photos', ALL)
configure_uploads(app, photos)
@app.route('/')
def index():
return '''
<h1>Upload a photo</h1>
<form action="/upload" method="post" enctype="multipart/form-data">
<input type="file" name="photo">
<input type="submit">
</form>
'''
@app.route('/upload', methods=['POST'])
def upload():
if 'photo' in request.files:
filename = photos.save(request.files['photo'])
return redirect(url_for('index'))
return 'No file uploaded'
if __name__ == '__main__':
app.run(debug=True)
详解:
UploadSet
:定义文件集合和类型。configure_uploads
:配置上传文件的保存位置和设置。
59. 使用 Flask-Security 实现安全功能
Flask-Security
提供了用户认证、角色管理、密码加密等功能。
安装 Flask-Security
pip install Flask-Security
示例:配置 Flask-Security
- 配置 Flask-Security
from flask import Flask, render_template
from flask_sqlalchemy import SQLAlchemy
from flask_security import Security, SQLAlchemyUserDatastore, UserMixin, RoleMixin
app = Flask(__name__)
app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:///security_example.db'
app.config['SECRET_KEY'] = 'mysecretkey'
app.config['SECURITY_PASSWORD_SALT'] = 'somesalt'
db = SQLAlchemy(app)
roles_users = db.Table('roles_users',
db.Column('user_id', db.Integer(), db.ForeignKey('user.id')),
db.Column('role_id', db.Integer(), db.ForeignKey('role.id'))
)
class Role(db.Model, RoleMixin):
id = db.Column(db.Integer(), primary_key=True)
name = db.Column(db.String(80), unique=True)
description = db.Column(db.String(255))
class User(db.Model, UserMixin):
id = db.Column(db.Integer(), primary_key=True)
email = db.Column(db.String(255), unique=True)
password = db.Column(db.String(255))
active = db.Column(db.Boolean())
roles = db.relationship('Role', secondary=roles_users, backref=db.backref('users', lazy='dynamic'))
user_datastore = SQLAlchemyUserDatastore(db, User, Role)
security = Security(app, user_datastore)
@app.route('/')
def index():
return render_template('index.html')
if __name__ == '__main__':
app.run(debug=True)
- 创建用户和角色
使用 Flask-Security 提供的命令行工具创建用户和角色,或通过应用程序脚本进行创建。
详解:
SQLAlchemyUserDatastore
:提供与 SQLAlchemy 结合的用户数据存储功能。RoleMixin
和UserMixin
:提供角色和用户的默认实现。
60. 使用 Flask-Caching 实现缓存
Flask-Caching
允许你使用不同的缓存机制来缓存视图和数据。
安装 Flask-Caching
pip install Flask-Caching
示例:配置 Flask-Caching
- 配置缓存
from flask import Flask, render_template
from flask_caching import Cache
app = Flask(__name__)
app.config['CACHE_TYPE'] = 'simple'
cache = Cache(app)
@app.route('/')
@cache.cached(timeout=60)
def index():
return render_template('index.html')
if __name__ == '__main__':
app.run(debug=True)
详解:
CACHE_TYPE
:指定缓存类型,例如simple
、redis
、memcached
等。@cache.cached
:将视图函数的结果缓存起来。
61. 使用 Flask-RESTPlus 进行 API 版本管理
Flask-RESTPlus
支持 API 版本管理,帮助你组织和管理不同版本的 API。
示例:API 版本管理
- 配置版本管理
from flask import Flask
from flask_restplus import Api, Resource
app = Flask(__name__)
api = Api(app, version='1.0', title='My API', description='A simple API')
v1 = api.namespace('v1', description='Version 1 operations')
v2 = api.namespace('v2', description='Version 2 operations')
@v1.route('/items')
class ItemsV1(Resource):
def get(self):
return {'version': '1.0', 'items': ['item1', 'item2']}
@v2.route('/items')
class ItemsV2(Resource):
def get(self):
return {'version': '2.0', 'items': ['itemA', 'itemB']}
if __name__ == '__main__':
app.run(debug=True)
详解:
namespace
:创建 API 的不同命名空间,用于版本管理和组织。version
:定义 API 的版本。
62. 使用 Flask-JWT-Extended 实现 JWT 认证
Flask-JWT-Extended
提供了使用 JSON Web Tokens (JWT) 进行认证和授权的功能。
安装 Flask-JWT-Extended
pip install Flask-JWT-Extended
示例:配置 JWT 认证
- 配置 Flask-JWT-Extended
from flask import Flask, jsonify, request
from flask_jwt_extended import JWTManager, create_access_token, jwt_required, get_jwt_identity
app = Flask(__name__)
app.config['JWT_SECRET_KEY'] = 'your_secret_key'
jwt = JWTManager(app)
@app.route('/login', methods=['POST'])
def login():
username = request.json.get('username', None)
if username:
access_token = create_access_token(identity=username)
return jsonify(access_token=access_token), 200
return jsonify({"msg": "Missing username"}), 400
@app.route('/protected', methods=['GET'])
@jwt_required()
def protected():
current_user = get_jwt_identity()
return jsonify(logged_in_as=current_user), 200
if __name__ == '__main__':
app.run(debug=True)
详解:
create_access_token
:生成 JWT。@jwt_required()
:保护视图,要求请求中包含有效的 JWT。get_jwt_identity
:获取当前用户身份信息。
63. 使用 Flask-Session 实现服务器端会话存储
Flask-Session
支持将 Flask 的会话存储在服务器端,增强安全性和可扩展性。
安装 Flask-Session
pip install Flask-Session
示例:配置服务器端会话
- 配置 Flask-Session
from flask import Flask, session, redirect, url_for, request
from flask_session import Session
app = Flask(__name__)
app.config['SESSION_TYPE'] = 'filesystem'
app.config['SECRET_KEY'] = 'your_secret_key'
Session(app)
@app.route('/')
def index():
if 'username' in session:
return f'Logged in as {session["username"]}'
return 'You are not logged in'
@app.route('/login', methods=['POST'])
def login():
session['username'] = request.form['username']
return redirect(url_for('index'))
@app.route('/logout')
def logout():
session.pop('username', None)
return redirect(url_for('index'))
if __name__ == '__main__':
app.run(debug=True)
详解:
SESSION_TYPE
:指定会话存储类型,例如filesystem
、redis
、memcached
等。session
:用于存储用户会话数据。
64. 使用 Flask-Accepts 实现请求内容协商
Flask-Accepts
提供了内容协商功能,可以根据客户端请求的内容类型(如 JSON 或 XML)返回不同的响应。
安装 Flask-Accepts
pip install Flask-Accepts
示例:实现内容协商
- 配置 Flask-Accepts
from flask import Flask, jsonify, request
from flask_accepts import Accepts, respond_to
app = Flask(__name__)
accepts = Accepts(app)
@app.route('/data', methods=['GET'])
@respond_to('application/json', 'application/xml')
def data():
response_data = {"message": "Hello, World!"}
return response_data
if __name__ == '__main__':
app.run(debug=True)
详解:
respond_to
:根据客户端请求的内容类型返回不同的响应格式。Accepts
:配置内容协商功能。
65. 使用 Flask-RESTX 实现 REST API
Flask-RESTX
是 Flask-RESTPlus
的一个分支,提供了更简洁和稳定的 REST API 开发功能。
安装 Flask-RESTX
pip install flask-restx
示例:创建 REST API
- 创建 API
from flask import Flask
from flask_restx import Api, Resource
app = Flask(__name__)
api = Api(app, version='1.0', title='My API', description='A simple API')
ns = api.namespace('items', description='Item operations')
@ns.route('/')
class ItemList(Resource):
def get(self):
return {'items': ['item1', 'item2']}
def post(self):
return {'message': 'Item created'}, 201
if __name__ == '__main__':
app.run(debug=True)
详解:
Api
:创建 API 文档和路由。namespace
:定义 API 的命名空间。
66. 使用 Flask-SQLAlchemy 进行复杂模型关系
Flask-SQLAlchemy
支持复杂的模型关系,例如一对多、多对多关系。
示例:定义复杂模型关系
- 定义模型
from flask import Flask
from flask_sqlalchemy import SQLAlchemy
app = Flask(__name__)
app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:///complex_relationship.db'
db = SQLAlchemy(app)
class Author(db.Model):
id = db.Column(db.Integer, primary_key=True)
name = db.Column(db.String(100))
books = db.relationship('Book', backref='author', lazy=True)
class Book(db.Model):
id = db.Column(db.Integer, primary_key=True)
title = db.Column(db.String(100))
author_id = db.Column(db.Integer, db.ForeignKey('author.id'), nullable=False)
if __name__ == '__main__':
app.run(debug=True)
详解:
db.relationship
:定义模型之间的关系。db.ForeignKey
:定义外键。
67. 使用 Flask-RESTful 实现 RESTful API
Flask-RESTful
提供了一种简洁的方式来构建 RESTful API。
安装 Flask-RESTful
pip install flask-restful
示例:构建 RESTful API
- 创建 API
from flask import Flask
from flask_restful import Api, Resource
app = Flask(__name__)
api = Api(app)
class HelloWorld(Resource):
def get(self):
return {'hello': 'world'}
api.add_resource(HelloWorld, '/')
if __name__ == '__main__':
app.run(debug=True)
详解:
Api
:创建 RESTful API。Resource
:定义资源和处理请求的方法。
68. 使用 Flask-Mail 实现邮件发送功能
Flask-Mail
提供了发送电子邮件的功能,支持多种邮件服务。
安装 Flask-Mail
pip install Flask-Mail
示例:发送邮件
- 配置 Flask-Mail
from flask import Flask, render_template
from flask_mail import Mail, Message
app = Flask(__name__)
app.config['MAIL_SERVER'] = 'smtp.example.com'
app.config['MAIL_PORT'] = 587
app.config['MAIL_USERNAME'] = 'your_username'
app.config['MAIL_PASSWORD'] = 'your_password'
app.config['MAIL_USE_TLS'] = True
mail = Mail(app)
@app.route('/send')
def send_mail():
msg = Message('Hello', sender='from@example.com', recipients=['to@example.com'])
msg.body = 'This is a test email'
mail.send(msg)
return 'Mail sent!'
if __name__ == '__main__':
app.run(debug=True)
详解:
Message
:创建邮件消息。mail.send
:发送邮件。
69. 使用 Flask-Admin 实现管理界面
Flask-Admin
提供了一个功能丰富的管理界面,便于管理数据模型。
安装 Flask-Admin
pip install Flask-Admin
示例:创建管理界面
- 配置 Flask-Admin
from flask import Flask
from flask_sqlalchemy import SQLAlchemy
from flask_admin import Admin
from flask_admin.contrib.sqla import ModelView
app = Flask(__name__)
app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:///admin_example.db'
db = SQLAlchemy(app)
class User(db.Model):
id = db.Column(db.Integer, primary_key=True)
name = db.Column(db.String(50))
admin = Admin(app, name='Admin Interface', template_mode='bootstrap3')
admin.add_view(ModelView(User, db.session))
if __name__ == '__main__':
app.run(debug=True)
详解:
ModelView
:提供对 SQLAlchemy 模型的管理界面。
70. 使用 Flask-DebugToolbar 进行调试
Flask-DebugToolbar
提供了一个调试工具栏,可以帮助你调试 Flask 应用。
安装 Flask-DebugToolbar
pip install flask-debugtoolbar
示例:配置调试工具栏
- 配置 Flask-DebugToolbar
from flask import Flask
from flask_debugtoolbar import DebugToolbarExtension
app = Flask(__name__)
app.config['SECRET_KEY'] = 'your_secret_key'
app.config['DEBUG_TB_INTERCEPT_REDIRECTS'] = False
toolbar = DebugToolbarExtension(app)
@app.route('/')
def index():
return 'Hello, Debug Toolbar!'
if __name__ == '__main__':
app.run(debug=True)
详解:
DebugToolbarExtension
:提供调试工具栏功能。
71. 使用 Flask-Babel 实现多语言支持
Flask-Babel
提供了对 Flask 应用的国际化(i18n)和本地化(l10n)支持,使得你的应用能够支持多语言环境。
安装 Flask-Babel
pip install Flask-Babel
示例:配置多语言支持
- 配置 Flask-Babel
from flask import Flask, render_template, request
from flask_babel import Babel, _
app = Flask(__name__)
app.config['BABEL_DEFAULT_LOCALE'] = 'en'
babel = Babel(app)
@babel.localeselector
def get_locale():
return request.accept_languages.best_match(['en', 'es'])
@app.route('/')
def index():
return render_template('index.html', greeting=_('Hello'))
if __name__ == '__main__':
app.run(debug=True)
- 生成翻译文件
使用 pybabel
工具生成翻译文件:
pybabel extract -F babel.cfg -o messages.pot .
pybabel init -i messages.pot -d translations -l es
pybabel update -i messages.pot -d translations
详解:
get_locale
:根据请求的语言环境选择语言。babel
:配置 Flask-Babel。pybabel
:生成和管理翻译文件的工具。
72. 使用 Flask-Principal 实现角色和权限管理
Flask-Principal
提供了基于角色的权限管理功能,使得应用可以基于用户角色和权限来控制访问。
安装 Flask-Principal
pip install Flask-Principal
示例:配置角色和权限管理
- 配置 Flask-Principal
from flask import Flask, render_template, request, redirect, url_for
from flask_principal import Principal, Permission, RoleNeed, UserNeed, identity_loaded, Identity, AnonymousIdentity
app = Flask(__name__)
app.config['SECRET_KEY'] = 'mysecretkey'
principal = Principal(app)
admin_permission = Permission(RoleNeed('admin'))
@app.route('/')
def index():
return 'Welcome to the home page'
@app.route('/admin')
@admin_permission.require(http_exception=403)
def admin():
return 'Welcome to the admin page'
if __name__ == '__main__':
app.run(debug=True)
详解:
Permission
:定义权限,基于角色或其他需求。RoleNeed
:定义角色需求。
73. 使用 Flask-RESTful 构建 REST API
Flask-RESTful
提供了一个更简洁的方式来构建 RESTful API,使得你可以快速开发和部署 API。
示例:构建 REST API
- 配置 Flask-RESTful
from flask import Flask
from flask_restful import Api, Resource
app = Flask(__name__)
api = Api(app)
class HelloWorld(Resource):
def get(self):
return {'hello': 'world'}
api.add_resource(HelloWorld, '/')
if __name__ == '__main__':
app.run(debug=True)
详解:
Api
:用于创建 REST API 的实例。Resource
:定义 API 资源和请求处理方法。
74. 使用 Flask-Cache 实现缓存
Flask-Cache
提供了缓存功能,可以显著提高应用性能,特别是在处理计算密集型任务时。
安装 Flask-Cache
pip install Flask-Cache
示例:配置缓存
- 配置 Flask-Cache
from flask import Flask, render_template
from flask_cache import Cache
app = Flask(__name__)
app.config['CACHE_TYPE'] = 'simple'
cache = Cache(app)
@app.route('/')
@cache.cached(timeout=60)
def index():
return 'This is a cached response!'
if __name__ == '__main__':
app.run(debug=True)
详解:
CACHE_TYPE
:定义缓存类型,例如simple
、redis
等。@cache.cached
:缓存视图的响应。
75. 使用 Flask-SQLAlchemy 进行数据模型管理
Flask-SQLAlchemy
是 Flask 的 SQLAlchemy 扩展,提供了强大的数据模型管理功能。
示例:定义和操作数据模型
- 配置 Flask-SQLAlchemy
from flask import Flask
from flask_sqlalchemy import SQLAlchemy
app = Flask(__name__)
app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:///example.db'
db = SQLAlchemy(app)
class User(db.Model):
id = db.Column(db.Integer, primary_key=True)
username = db.Column(db.String(80), unique=True, nullable=False)
with app.app_context():
db.create_all()
if __name__ == '__main__':
app.run(debug=True)
详解:
SQLAlchemy
:提供对 SQLAlchemy 的支持,进行数据模型定义和数据库操作。db.create_all()
:创建所有模型对应的数据库表。
76. 使用 Flask-Uploads 管理文件上传
Flask-Uploads
提供了一个简便的方式来管理文件上传,支持多种文件类型和存储方式。
安装 Flask-Uploads
pip install Flask-Uploads
示例:配置文件上传
- 配置 Flask-Uploads
from flask import Flask, request, redirect, url_for
from flask_uploads import UploadSet, configure_uploads, ALL
app = Flask(__name__)
app.config['UPLOADED_PHOTOS_DEST'] = 'uploads/photos'
photos = UploadSet('photos', ALL)
configure_uploads(app, photos)
@app.route('/')
def index():
return '''
<h1>Upload a photo</h1>
<form action="/upload" method="post" enctype="multipart/form-data">
<input type="file" name="photo">
<input type="submit">
</form>
'''
@app.route('/upload', methods=['POST'])
def upload():
if 'photo' in request.files:
filename = photos.save(request.files['photo'])
return redirect(url_for('index'))
return 'No file uploaded'
if __name__ == '__main__':
app.run(debug=True)
详解:
UploadSet
:定义文件上传集合和类型。configure_uploads
:配置上传的存储位置和文件类型。
77. 使用 Flask-HTTPAuth 实现认证
Flask-HTTPAuth
提供了简单的 HTTP 认证功能,支持基本认证和摘要认证。
安装 Flask-HTTPAuth
pip install Flask-HTTPAuth
示例:配置 HTTP 认证
- 配置 Flask-HTTPAuth
from flask import Flask, request
from flask_httpauth import HTTPBasicAuth
app = Flask(__name__)
auth = HTTPBasicAuth()
users = {
"user": "password"
}
@auth.verify_password
def verify_password(username, password):
if username in users and users[username] == password:
return username
@app.route('/')
@auth.login_required
def index():
return f'Hello, {auth.current_user()}!'
if __name__ == '__main__':
app.run(debug=True)
详解:
HTTPBasicAuth
:提供基本的 HTTP 认证功能。verify_password
:验证用户名和密码。
78. 使用 Flask-Migrate 进行数据库迁移
Flask-Migrate
是一个数据库迁移工具,支持对数据库模式的版本管理。
安装 Flask-Migrate
pip install Flask-Migrate
示例:配置数据库迁移
- 配置 Flask-Migrate
from flask import Flask
from flask_sqlalchemy import SQLAlchemy
from flask_migrate import Migrate
app = Flask(__name__)
app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:///migrate_example.db'
db = SQLAlchemy(app)
migrate = Migrate(app, db)
class User(db.Model):
id = db.Column(db.Integer, primary_key=True)
username = db.Column(db.String(80), unique=True, nullable=False)
if __name__ == '__main__':
app.run(debug=True)
- 使用命令行工具
flask db init
flask db migrate -m "Initial migration."
flask db upgrade
详解:
flask db init
:初始化迁移目录。flask db migrate
:创建迁移脚本。flask db upgrade
:应用迁移脚本。
79. 使用 Flask-Cors 处理跨域请求
Flask-Cors
提供了对跨域资源共享(CORS)的支持,允许来自不同域的请求访问资源。
安装 Flask-Cors
pip install Flask-Cors
示例:配置 CORS
- 配置 Flask-Cors
from flask import Flask
from flask_cors import CORS
app = Flask(__name__)
CORS(app)
@app.route('/')
def index():
return 'CORS is enabled!'
if __name__ == '__main__':
app.run(debug=True)
详解:
CORS
:启用 CORS 支持,允许来自不同域的请求访问资源。
80. 使用 Flask-DebugToolbar 进行调试
Flask-DebugToolbar
提供了一个调试工具栏,可以帮助你更好地调试 Flask 应用。
安装 Flask-DebugToolbar
pip install flask-debugtoolbar
示例:配置调试工具栏
- 配置 Flask-DebugToolbar
from flask import Flask
from flask_debugtoolbar import DebugToolbarExtension
app = Flask(__name__)
app.config['SECRET_KEY'] = 'your_secret_key'
app.config['DEBUG_TB_INTERCEPT_REDIRECTS'] = False
toolbar = DebugToolbarExtension(app)
@app.route('/')
def index():
return 'Debug Toolbar is enabled!'
if __name__ == '__main__':
app.run(debug=True)
详解:
DebugToolbarExtension
:提供调试工具栏功能。