Python Web:如何使用 Flask 框架进行 Web 开发
Flask 是一个轻量级的 Python Web 框架,它简单易用却功能强大,非常适合快速开发 Web 应用程序。无论你是刚接触 Web 开发的新手,还是经验丰富的开发者,Flask 都能为你提供灵活的开发体验。
为什么选择 Flask?
- 轻量级:Flask 是一个微框架,核心功能简洁,但可以通过扩展增加功能
- 灵活:不强制使用特定的项目结构或组件
- 易学:学习曲线平缓,Python 开发者可以快速上手
- 活跃社区:有丰富的扩展和文档资源
- 可扩展性:从简单应用到复杂企业级应用都能胜任
安装 Flask
在开始之前,确保你已经安装了 Python(建议 3.6+版本)。然后通过 pip 安装 Flask:
pip install flask
建议使用虚拟环境来管理依赖:
python -m venv venv
source venv/bin/activate # Linux/Mac
venv\Scripts\activate # Windows
pip install flask
第一个 Flask 应用
创建一个名为 app.py
的文件,输入以下代码:
from flask import Flask
app = Flask(__name__)
@app.route('/')
def hello_world():
return 'Hello, World!'
if __name__ == '__main__':
app.run(debug=True)
运行这个应用:
python app.py
访问 http://127.0.0.1:5000/
,你将看到 “Hello, World!” 的欢迎信息。
Flask 核心概念
路由
路由是将 URL 映射到特定函数的方式。Flask 使用 @app.route()
装饰器来定义路由。
@app.route('/about')
def about():
return '关于我们页面'
# 动态路由
@app.route('/user/<username>')
def show_user(username):
return f'用户: {username}'
# 指定HTTP方法
@app.route('/login', methods=['GET', 'POST'])
def login():
if request.method == 'POST':
return do_login()
else:
return show_login_form()
模板渲染
Flask 使用 Jinja2 模板引擎。创建一个 templates
文件夹,然后在其中创建 HTML 模板。
示例模板 templates/user.html
:
<!DOCTYPE html>
<html>
<head>
<title>用户页面</title>
</head>
<body>
<h1>你好, {{ name }}!</h1>
</body>
</html>
在视图函数中使用模板:
from flask import render_template
@app.route('/user/<username>')
def show_user_profile(username):
return render_template('user.html', name=username)
请求处理
Flask 可以轻松处理各种 HTTP 请求:
from flask import request
@app.route('/login', methods=['GET', 'POST'])
def login():
if request.method == 'POST':
username = request.form['username']
password = request.form['password']
# 处理登录逻辑
return f'用户 {username} 登录成功'
else:
return '''
<form method="post">
<p><input type=text name=username>
<p><input type=password name=password>
<p><input type=submit value=登录>
</form>
'''
静态文件
在项目根目录下创建 static
文件夹,用于存放 CSS、JavaScript 和图片等静态文件。
<link rel="stylesheet" href="{{ url_for('static', filename='style.css') }}">
Flask 扩展
Flask 的强大之处在于其丰富的扩展生态系统:
- Flask-SQLAlchemy:数据库集成
- Flask-WTF:表单处理和安全
- Flask-Login:用户认证和会话管理
- Flask-RESTful:构建 REST API
- Flask-Mail:发送电子邮件
- Flask-Migrate:数据库迁移
- Flask-Caching:缓存支持
安装扩展示例:
pip install flask-sqlalchemy flask-wtf flask-login
一个完整的示例:待办事项应用
下面是一个简单的待办事项应用示例:
- 首先创建项目结构:
/todo-app
/templates
base.html
app.py
app.py
内容:
from flask import Flask, render_template, request, redirect, url_for
from flask_sqlalchemy import SQLAlchemy
app = Flask(__name__)
app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:///todo.db'
app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = False
app.config['SECRET_KEY'] = 'your-secret-key'
db = SQLAlchemy(app)
class Todo(db.Model):
id = db.Column(db.Integer, primary_key=True)
title = db.Column(db.String(100), nullable=False)
complete = db.Column(db.Boolean, default=False)
@app.route('/')
def index():
todo_list = Todo.query.all()
return render_template('base.html', todo_list=todo_list)
@app.route('/add', methods=['POST'])
def add():
title = request.form.get('title')
if title: # 简单的验证
new_todo = Todo(title=title, complete=False)
db.session.add(new_todo)
db.session.commit()
return redirect(url_for('index'))
@app.route('/update/<int:todo_id>')
def update(todo_id):
todo = Todo.query.get_or_404(todo_id)
todo.complete = not todo.complete
db.session.commit()
return redirect(url_for('index'))
@app.route('/delete/<int:todo_id>')
def delete(todo_id):
todo = Todo.query.get_or_404(todo_id)
db.session.delete(todo)
db.session.commit()
return redirect(url_for('index'))
if __name__ == '__main__':
with app.app_context():
db.create_all()
app.run(debug=True)
templates/base.html
内容:
<!DOCTYPE html>
<html>
<head>
<title>待办事项</title>
<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/bootstrap@5.1.3/dist/css/bootstrap.min.css">
</head>
<body>
<div class="container mt-4">
<h1 class="text-center mb-4">待办事项列表</h1>
<form method="POST" action="{{ url_for('add') }}" class="mb-4">
<div class="input-group">
<input type="text" name="title" class="form-control" placeholder="添加新任务" required>
<button type="submit" class="btn btn-primary">添加</button>
</div>
</form>
<ul class="list-group">
{% for todo in todo_list %}
<li class="list-group-item d-flex justify-content-between align-items-center">
<span {% if todo.complete %}style="text-decoration: line-through"{% endif %}>
{{ todo.title }}
</span>
<div>
<a href="{{ url_for('update', todo_id=todo.id) }}" class="btn btn-sm {% if todo.complete %}btn-warning{% else %}btn-success{% endif %} me-2">
{% if todo.complete %}未完成{% else %}完成{% endif %}
</a>
<a href="{{ url_for('delete', todo_id=todo.id) }}" class="btn btn-sm btn-danger">删除</a>
</div>
</li>
{% endfor %}
</ul>
</div>
</body>
</html>
部署 Flask 应用
开发完成后,你可以选择多种方式部署 Flask 应用:
-
使用内置服务器(仅适合开发)
python app.py
-
使用 Gunicorn + Nginx(生产环境推荐)
pip install gunicorn gunicorn -w 4 -b 0.0.0.0:8000 app:app
然后配置 Nginx 作为反向代理
-
使用 Waitress(Windows 环境推荐)
pip install waitress waitress-serve --port=8000 app:app
-
部署到云平台:
- Heroku
- AWS Elastic Beanstalk
- Google App Engine
- Microsoft Azure
最佳实践
-
项目结构:
/project /app /templates /static /models /routes __init__.py config.py requirements.txt run.py
-
配置管理:
class Config: SECRET_KEY = os.environ.get('SECRET_KEY') or 'hard-to-guess-string' SQLALCHEMY_DATABASE_URI = os.environ.get('DATABASE_URL') or \ 'sqlite:///' + os.path.join(basedir, 'app.db') SQLALCHEMY_TRACK_MODIFICATIONS = False
-
错误处理:
@app.errorhandler(404) def not_found_error(error): return render_template('404.html'), 404 @app.errorhandler(500) def internal_error(error): db.session.rollback() return render_template('500.html'), 500
学习资源推荐
- Flask 官方文档 - 最权威的参考资料
- Flask Mega-Tutorial - 全面深入的教程
- Flask Web 开发实战 - 优秀的中文书籍
- Awesome Flask - Flask 资源大全
- Flask 官方教程 - 官方入门教程
结语
Flask 以其简洁和灵活的特性,成为 Python Web 开发的热门选择。通过本文的介绍,你应该已经掌握了 Flask 的基本使用方法。接下来,你可以尝试开发自己的项目,或者深入学习 Flask 的高级特性和扩展。
记住,最好的学习方式是实践。从简单的博客系统、REST API 开始,逐步挑战更复杂的项目。Flask 社区有丰富的资源和扩展,遇到问题时不要犹豫寻求帮助。
祝你 Flask 开发愉快!
. - . .