一、Flask简介与安装¶
什么是Flask?¶
Flask是一个轻量级的Python Web框架,由Armin Ronacher开发。它的设计理念是“微”(micro),即核心简单且灵活,同时支持丰富的扩展来满足复杂需求。相比Django的“电池包含”(内置大量功能),Flask更像一个基础骨架,开发者可以按需添加组件,非常适合初学者上手,也能支撑大型项目的构建。
安装Flask¶
安装Flask非常简单,推荐使用虚拟环境避免依赖冲突:
# 创建虚拟环境(可选但推荐)
python -m venv myenv
# 激活虚拟环境(Windows)
myenv\Scripts\activate
# 激活虚拟环境(Mac/Linux)
source myenv/bin/activate
# 安装Flask
pip install flask
安装完成后,在Python中验证:
import flask
print(flask.__version__) # 输出版本号,如2.0.1
二、Flask入门:第一个应用¶
Hello World¶
创建第一个Flask应用,新建app.py文件:
from flask import Flask
# 创建Flask应用实例
app = Flask(__name__)
# 定义路由:当用户访问根路径('/')时,执行hello_world函数
@app.route('/')
def hello_world():
return 'Hello, Flask!' # 返回响应内容
# 启动应用(仅在直接运行时生效)
if __name__ == '__main__':
app.run(debug=True) # debug=True开启调试模式(开发用)
运行python app.py,访问http://127.0.0.1:5000/即可看到“Hello, Flask!”。
三、核心技术:路由、视图与模板¶
1. 路由与视图函数¶
- 路由:通过
@app.route()装饰器定义,指定URL路径和HTTP方法。 - 视图函数:处理路由请求并返回响应。
动态路由(带参数)¶
支持URL参数,例如获取用户ID:
@app.route('/user/<int:user_id>') # <type:name>指定参数类型(int、string等)
def show_user(user_id):
return f'用户ID: {user_id}' # 直接将参数传入响应
# 访问:http://127.0.0.1:5000/user/123
多HTTP方法支持¶
允许同一路由处理不同请求方式(GET/POST):
@app.route('/login', methods=['GET', 'POST'])
def login():
if request.method == 'POST':
return '登录成功!'
else:
return '请填写登录表单' # GET请求时显示表单
注意:需导入
request对象:from flask import request
2. 模板引擎(Jinja2)¶
Flask默认使用Jinja2模板引擎,用于动态渲染HTML页面。
基本使用¶
- 在项目根目录创建
templates文件夹(必须命名),放入index.html:
<!-- templates/index.html -->
<!DOCTYPE html>
<html>
<head>
<title>{{ title }}</title> <!-- 模板变量 -->
</head>
<body>
<h1>{{ message }}</h1>
{% if user %} <!-- 条件判断 -->
<p>欢迎回来,{{ user.name }}!</p>
{% else %}
<p>请登录</p>
{% endif %}
</body>
</html>
- 在视图函数中渲染模板:
from flask import render_template # 导入渲染函数
@app.route('/')
def index():
context = {
'title': 'Flask入门',
'message': 'Hello, Jinja2!',
'user': {'name': '小明'} # 传递字典数据
}
return render_template('index.html', **context) # 解包字典
3. 静态文件¶
CSS、JS、图片等静态资源放在static文件夹(必须命名),通过url_for引用:
<!-- 在模板中引用CSS -->
<link rel="stylesheet" href="{{ url_for('static', filename='style.css') }}">
<!-- 引用图片 -->
<img src="{{ url_for('static', filename='logo.png') }}" alt="Logo">
四、核心功能进阶¶
1. 会话管理与重定向¶
- 重定向:使用
redirect函数跳转到指定URL:
from flask import redirect, url_for
@app.route('/goto-home')
def goto_home():
return redirect(url_for('index')) # 重定向到index路由
- 会话(Session):存储用户状态(需设置密钥):
app.secret_key = 'your-secret-key-here' # 密钥(开发用随机字符串)
@app.route('/login')
def login():
session['user_id'] = 123 # 存储用户ID到会话
return '登录成功'
@app.route('/profile')
def profile():
user_id = session.get('user_id') # 获取会话数据
return f'用户ID: {user_id}'
2. 数据库操作(Flask-SQLAlchemy)¶
Flask本身不内置ORM,但通过扩展Flask-SQLAlchemy可轻松操作数据库(以SQLite为例):
-
安装扩展:
pip install flask-sqlalchemy -
配置与初始化:
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) # 初始化数据库
- 定义模型:
class User(db.Model):
id = db.Column(db.Integer, primary_key=True)
name = 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.name}>'
# 创建表(首次运行时执行)
with app.app_context():
db.create_all()
- 数据库操作示例:
# 添加用户
user = User(name='小红', email='hong@example.com')
db.session.add(user)
db.session.commit()
# 查询用户
users = User.query.filter_by(name='小红').first()
print(users.email) # 输出:hong@example.com
3. 用户认证(Flask-Login)¶
Flask-Login是处理用户登录、会话管理的扩展:
-
安装:
pip install flask-login -
初始化与配置:
from flask_login import LoginManager, UserMixin
login_manager = LoginManager(app)
login_manager.login_view = 'login' # 未登录时重定向到login路由
class User(UserMixin, db.Model): # UserMixin提供默认实现(is_authenticated等)
# 模型定义同上...
- 用户加载与登录:
@login_manager.user_loader
def load_user(user_id):
return User.query.get(int(user_id)) # 根据ID加载用户
@app.route('/login', methods=['POST'])
def login():
user = User.query.filter_by(name=request.form['name']).first()
if user and check_password_hash(user.password, request.form['password']):
login_user(user) # 登录
return redirect(url_for('index'))
return '登录失败'
五、常用扩展与应用场景¶
1. Flask-WTF(表单处理)¶
快速处理表单验证:
from flask_wtf import FlaskForm
from wtforms import StringField, PasswordField
from wtforms.validators import DataRequired
class LoginForm(FlaskForm):
name = StringField('用户名', validators=[DataRequired()])
password = PasswordField('密码', validators=[DataRequired()])
@app.route('/login', methods=['GET', 'POST'])
def login():
form = LoginForm()
if form.validate_on_submit(): # 验证表单
return '登录成功'
return render_template('login.html', form=form)
2. Flask-RESTful(构建API)¶
快速开发RESTful风格的API:
from flask_restful import Api, Resource
api = Api(app)
class HelloAPI(Resource):
def get(self):
return {'message': 'Hello, API!'}
api.add_resource(HelloAPI, '/api/hello') # 绑定路由
3. Flask-Admin(后台管理)¶
自动生成后台管理界面,适合快速搭建内容管理系统:
from flask_admin import Admin
from flask_admin.contrib.sqla import ModelView
admin = Admin(app)
admin.add_view(ModelView(User, db.session)) # 注册User模型到后台
六、部署与生产环境¶
1. 基础部署¶
Flask内置服务器仅用于开发,生产环境需使用WSGI服务器:
- Gunicorn:pip install gunicorn,启动命令:gunicorn -w 4 -b 0.0.0.0:8000 app:app(4个工作进程)
- Nginx:作为反向代理,转发请求到Gunicorn
2. 云平台部署¶
- PythonAnywhere:免费Python托管平台,直接上传代码并设置
wsgi.py - Heroku:通过
Procfile指定启动命令,配置环境变量(如SECRET_KEY) - Docker:容器化部署,Dockerfile示例:
FROM python:3.9
WORKDIR /app
COPY requirements.txt .
RUN pip install -r requirements.txt
COPY . .
CMD ["gunicorn", "-b", "0.0.0.0:5000", "app:app"]
七、总结与学习路径¶
核心收获¶
- 基础:路由、视图、模板、静态文件、会话
- 进阶:数据库(SQLAlchemy)、用户认证(Login)、表单处理(WTF)
- 扩展:API开发(RESTful)、后台管理(Admin)
学习建议¶
- 动手实践:从简单页面(如个人博客、待办清单)开始
- 阅读官方文档:Flask官方文档
- 扩展探索:尝试结合Flask-SocketIO实现实时聊天,或Flask-Caching优化性能
- 解决问题:遇到错误时优先查Flask常见问题
Flask的灵活性和丰富的扩展生态,使其既能快速开发小型项目,也能支撑大型应用。掌握核心技术后,通过扩展组件可实现复杂功能,这正是“从入门到精通”的关键!