一、什么是Flask?¶
Flask是一个轻量级的Python Web框架,它用简洁的代码实现了Web应用的核心功能,同时保持了高度的灵活性。相比Django的“电池内置”理念,Flask更像一个“工具箱”,你可以按需选择组件(如ORM、表单处理等),非常适合初学者入门Web开发,也适合快速开发中小型项目。
二、开发环境准备¶
1. 安装Python¶
首先确保你的电脑已安装Python(推荐3.7+版本)。
- 检查安装:打开终端/命令行,输入 python --version 或 python3 --version,显示版本号即成功。
- 下载地址:Python官网
2. 安装Flask¶
使用Python的包管理工具pip安装Flask:
pip install flask
验证安装:打开Python交互环境(python或python3),输入 import flask 无报错即成功。
三、项目开发流程¶
1. 创建虚拟环境(必做!)¶
为避免不同项目依赖冲突,建议为每个项目创建独立的虚拟环境:
- 创建虚拟环境(Python 3.3+内置venv模块):
python -m venv myflaskenv # Windows/Linux/Mac
- 激活虚拟环境:
- Windows(命令提示符):
myflaskenv\Scripts\activate - Linux/Mac(终端):
source myflaskenv/bin/activate
激活后终端前缀会显示(myflaskenv),表示环境生效。
2. 初始化项目结构¶
良好的项目结构能让代码更易维护。建议基础结构如下:
myflaskapp/ # 项目根目录
├── app.py # 应用入口
├── requirements.txt # 依赖清单(生成命令:pip freeze > requirements.txt)
├── static/ # 静态文件(CSS/JS/图片)
│ └── css/
│ └── style.css
└── templates/ # HTML模板
└── index.html
3. 第一个“Hello World”¶
在app.py中编写基础代码:
from flask import Flask # 导入Flask类
app = Flask(__name__) # 创建应用实例(__name__表示当前模块)
@app.route('/') # 定义路由:访问根路径时执行下方函数
def index(): # 视图函数:处理请求并返回响应
return "Hello, Flask!" # 返回字符串
if __name__ == '__main__': # 当直接运行app.py时执行
app.run(debug=True) # 启动开发服务器(debug=True时代码修改自动重启)
运行应用:
python app.py
打开浏览器访问 http://127.0.0.1:5000/,即可看到“Hello, Flask!”。
4. 路由与动态参数¶
基础路由¶
除了根路径/,还可定义其他路径:
@app.route('/about')
def about():
return "关于我们的项目"
@app.route('/user')
def user_profile():
return "用户资料页"
动态路由参数¶
如需从URL获取参数(如用户ID),使用<参数名>语法:
@app.route('/user/<username>') # URL中<username>会作为参数传入函数
def show_user(username):
return f"用户:{username}" # 直接渲染参数
@app.route('/post/<int:post_id>') # <int:post_id>限制参数为整数
def show_post(post_id):
return f"文章ID:{post_id}"
5. 模板系统(渲染HTML)¶
Flask默认使用Jinja2模板引擎,需在templates文件夹中编写HTML文件:
templates/index.html:
<!DOCTYPE html>
<html>
<head>
<title>{{ title }}</title> <!-- 变量渲染 -->
</head>
<body>
<h1>{{ message }}</h1>
{% if is_logged_in %} <!-- 条件判断 -->
<p>欢迎回来!</p>
{% else %}
<p>请先登录</p>
{% endif %}
<ul>
{% for item in items %} <!-- 循环遍历 -->
<li>{{ item }}</li>
{% endfor %}
</ul>
</body>
</html>
在app.py中渲染模板:
from flask import render_template # 导入模板渲染函数
@app.route('/page')
def page():
data = {
'title': '首页',
'message': '欢迎使用Flask模板',
'is_logged_in': True,
'items': ['项目1', '项目2', '项目3']
}
return render_template('index.html', **data) # 传递数据到模板
静态文件引用:在模板中通过url_for('static', filename='路径')引用CSS/JS/图片:
<link rel="stylesheet" href="{{ url_for('static', filename='css/style.css') }}">
6. 处理表单与数据¶
获取表单数据¶
使用request对象获取用户输入(需先导入):
from flask import request, render_template, redirect, url_for
@app.route('/login', methods=['GET', 'POST']) # 允许GET(显示表单)和POST(提交数据)
def login():
if request.method == 'POST': # 判断请求方法
username = request.form.get('username') # 获取表单中的username字段
password = request.form.get('password')
if username == 'admin' and password == '123456':
return redirect(url_for('dashboard')) # 跳转到dashboard页面
else:
return "用户名或密码错误"
return render_template('login.html') # GET请求时显示表单
简单表单验证¶
可使用flask.flash反馈操作结果(如登录失败提示):
from flask import flash
@app.route('/login', methods=['POST'])
def login_post():
if not request.form.get('username'):
flash('用户名不能为空', 'error') # 错误消息
return redirect(url_for('login'))
# ... 其他验证逻辑
在模板中显示flash消息:
{% with messages = get_flashed_messages(with_categories=true) %}
{% if messages %}
{% for category, message in messages %}
<div class="{{ category }}">{{ message }}</div>
{% endfor %}
{% endif %}
{% endwith %}
7. 数据库操作(Flask-SQLAlchemy)¶
Flask本身不包含数据库功能,需借助扩展。以SQLite(轻量无需配置)为例:
安装依赖¶
pip install flask-sqlalchemy # ORM工具,简化数据库操作
初始化数据库¶
from flask import Flask
from flask_sqlalchemy import SQLAlchemy
app = Flask(__name__)
app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:///mydb.db' # SQLite数据库路径
app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = False # 关闭修改跟踪(节省资源)
db = SQLAlchemy(app) # 初始化ORM对象
定义数据模型¶
class User(db.Model):
id = db.Column(db.Integer, primary_key=True) # 主键
username = db.Column(db.String(80), unique=True, nullable=False) # 用户名
email = db.Column(db.String(120), unique=True, nullable=False) # 邮箱
def __repr__(self):
return f'<User {self.username}>'
创建表与增删改查¶
在终端执行以下命令创建表(需进入Python交互环境):
from app import app, db, User
with app.app_context(): # 应用上下文(避免运行时错误)
db.create_all() # 根据模型创建所有表
# 添加用户
user = User(username='test', email='test@example.com')
db.session.add(user)
db.session.commit() # 提交事务
# 查询用户
users = User.query.all() # 查询所有用户
user = User.query.filter_by(username='test').first() # 查询单个用户
# 删除用户
db.session.delete(user)
db.session.commit()
四、项目最佳实践¶
1. 配置管理¶
避免硬编码配置,通过环境变量或config.py分离配置:
方法1:环境变量
import os
from dotenv import load_dotenv # 需安装:pip install python-dotenv
load_dotenv() # 读取.env文件
app.config['SECRET_KEY'] = os.getenv('SECRET_KEY') # 从环境变量获取密钥
app.config['DATABASE_URI'] = os.getenv('DATABASE_URI', 'sqlite:///default.db') # 默认值
.env文件(根目录下):
SECRET_KEY=your_secret_key_here
FLASK_ENV=development
方法2:多环境配置
创建config.py:
class Config:
SECRET_KEY = 'your_secret_key'
class DevelopmentConfig(Config):
DEBUG = True
DATABASE_URI = 'sqlite:///dev.db'
class ProductionConfig(Config):
DEBUG = False
DATABASE_URI = os.getenv('DATABASE_URI')
使用时根据环境加载配置:
app.config.from_object(DevelopmentConfig) # 开发环境
# app.config.from_object(ProductionConfig) # 生产环境
2. 代码结构与蓝图¶
当项目较大时,需拆分功能模块(如用户模块、订单模块),用蓝图(Blueprint) 实现:
创建蓝图(如users.py)¶
from flask import Blueprint, render_template
users_bp = Blueprint('users', __name__, url_prefix='/users') # 路由前缀
@users_bp.route('/profile')
def profile():
return render_template('users/profile.html')
注册蓝图(在app.py中)¶
from users import users_bp
app.register_blueprint(users_bp) # 注册蓝图
使用蓝图后,访问路径变为/users/profile¶
3. 错误处理¶
自定义404/500页面,提升用户体验:
@app.errorhandler(404)
def not_found(e):
return render_template('404.html'), 404 # 返回状态码404
@app.errorhandler(500)
def server_error(e):
return render_template('500.html'), 500
4. 日志记录¶
记录关键操作(如登录、错误)便于调试:
import logging
from logging.handlers import RotatingFileHandler
def setup_logging(app):
file_handler = RotatingFileHandler('app.log', maxBytes=10240, backupCount=10)
file_handler.setFormatter(logging.Formatter(
'%(asctime)s %(levelname)s: %(message)s [in %(pathname)s:%(lineno)d]'
))
file_handler.setLevel(logging.INFO)
app.logger.addHandler(file_handler)
app.logger.setLevel(logging.INFO)
app.logger.info('Flask应用启动')
# 在app初始化后调用
setup_logging(app)
5. 测试¶
用pytest或Flask测试客户端验证功能:
# 安装pytest: pip install pytest
# test_app.py
import pytest
from app import app, db
@pytest.fixture
def client():
app.config['TESTING'] = True
with app.test_client() as client: # 测试客户端
with app.app_context():
db.create_all()
yield client
db.drop_all() # 测试后删除表
def test_login(client):
response = client.post('/login', data={'username': 'admin', 'password': '123'}, follow_redirects=True)
assert response.status_code == 200 # 断言登录成功(跳转到dashboard)
五、部署简介¶
开发完成后,需部署到服务器让他人访问:
1. 本地部署¶
- 生产环境关闭debug:
app.run(debug=False) - 使用
gunicorn作为WSGI服务器(比Flask自带服务器更稳定):
pip install gunicorn
gunicorn -w 4 -b 0.0.0.0:8000 app:app # 4个工作进程,绑定8000端口
2. 云平台部署¶
- PythonAnywhere:适合新手,直接上传代码+配置虚拟环境。
- Heroku:需准备
Procfile文件:
web: gunicorn app:app
并配置环境变量(heroku config:set SECRET_KEY=xxx)。
六、总结¶
Flask的核心是“轻量灵活”,从“Hello World”到完整项目,需掌握:
1. 路由与视图函数基础
2. 模板与静态文件管理
3. 表单处理与数据验证
4. 数据库操作(SQLAlchemy)
5. 项目结构(蓝图、配置、日志)
通过实践(如开发一个简单博客、待办事项应用)巩固知识,逐步提升项目复杂度。Flask的扩展性强,后续可结合Celery(异步任务)、Flask-RESTful(API开发)等扩展,满足更复杂需求。
最后:动手编码是学习的最佳方式,从模仿到独立开发,你会逐步掌握Web开发的核心逻辑!