Flask 入门

定位

Flask 是微框架:只做路由、请求响应、模板。其余(ORM、表单、认证、后台)都得自己选。

它的价值在「小」——二十行代码就能跑起一个接口,不需要理解框架设计。代价是项目变大后,你会自己手搓一套框架,而且大概率不如现成的。

安装

pip install flask

最小示例

# app.py
from flask import Flask, request, jsonify

app = Flask(__name__)

@app.get('/')
def index():
    return 'Hello'

@app.get('/users/<int:uid>')
def get_user(uid):
    return jsonify({'id': uid, 'name': 'demo'})

@app.post('/users')
def create_user():
    data = request.get_json()
    return jsonify(data), 201

if __name__ == '__main__':
    app.run(debug=True)
flask --app app run --debug

核心概念

1. 路由装饰器

@app.route('/users/<int:uid>', methods=['GET', 'POST'])
def user(uid): ...

<int:uid> 会自动转换类型。支持 string、int、float、path、uuid。

Flask 2.0 之后有快捷写法:@app.get、@app.post。

2. 应用上下文与请求上下文

这是 Flask 最独特(也最容易困惑)的设计:

from flask import request, g, current_app

@app.before_request
def load_user():
    g.user = get_current_user()      # g 是请求级容器

@app.get('/me')
def me():
    return {'user': g.user.name}
  • request:当前请求
  • g:请求级临时存储
  • current_app:当前应用实例

它们依赖上下文栈,所以在请求外(比如定时任务里)直接用会报 working outside of application context。要用 app.app_context():

with app.app_context():
    db.session.query(...)

3. Blueprint:模块化

项目变大后,路由要拆:

# users.py
from flask import Blueprint
bp = Blueprint('users', __name__, url_prefix='/users')

@bp.get('/')
def list_users(): ...

1. app.py
from users import bp
app.register_blueprint(bp)

常见坑

① 开发服务器不能上生产

app.run() 是单线程开发服务器。生产用 gunicorn:

gunicorn -w 4 -b 0.0.0.0:8000 app:app

② 全局变量在 worker 间不共享

gunicorn -w 4 是 4 个独立进程,全局 dict 各存各的。要共享状态用 Redis 或数据库。

③ 没有内置 ORM,选型要慎重

常见组合:

组合特点
Flask + SQLAlchemy最主流,功能全
Flask + Peewee更轻,学习成本低
Flask + Flask-SQLAlchemySQLAlchemy 的 Flask 封装,省配置但绑定更紧

选 Flask-SQLAlchemy 要谨慎:它把 session 生命周期绑到请求上下文,脱离请求使用容易出问题。直接用原生 SQLAlchemy 更灵活。

④ 异步支持有限

Flask 3.x 支持 async def 视图,但底层还是同步 WSGI(或用 flask[async] 配 ASGI)。不要指望在 Flask 里获得真正的异步并发——那是 FastAPI 的地盘。

什么时候选它

  • 脚本型服务:给已有 Python 脚本套一层 HTTP
  • 原型验证:先跑起来看需求对不对
  • 内部小工具:几个接口,不值得上框架
  • 教学:理解 Web 框架的最小构成

不选它的场景:项目会长期演进、需要后台管理、需要异步高并发、多人协作。

一个诚恳的判断

Flask 最大的风险是「中途变大」。

它适合「确定很小」的项目。但现实中很多项目从「就几个接口」长成了「有用户系统、权限、后台、定时任务」——那时候你手搓的半套框架会变成负债。

如果你预感到项目会变大,一开始就用 Django 或 FastAPI。迁移一个长到一半的 Flask 项目,成本比重新写还高。

暂无评论

发送评论 编辑评论

|´・ω・)ノ
ヾ(≧∇≦*)ゝ
(☆ω☆)
(╯‵□′)╯︵┴─┴
 ̄﹃ ̄
(/ω\)
∠( ᐛ 」∠)_
(๑•̀ㅁ•́ฅ)
→_→
୧(๑•̀⌄•́๑)૭
٩(ˊᗜˋ*)و
(ノ°ο°)ノ
(´இ皿இ`)
⌇●﹏●⌇
(ฅ´ω`ฅ)
(╯°A°)╯︵○○○
φ( ̄∇ ̄o)
ヾ(´・ ・`。)ノ"
( ง ᵒ̌皿ᵒ̌)ง⁼³₌₃
(ó﹏ò。)
Σ(っ °Д °;)っ
( ,,´・ω・)ノ"(´っω・`。)
╮(╯▽╰)╭
o(*////▽////*)q
>﹏<
( ๑´•ω•) "(ㆆᴗㆆ)
😂
😀
😅
😊
🙂
🙃
😌
😍
😘
😜
😝
😏
😒
🙄
😳
😡
😔
😫
😱
😭
💩
👻
🙌
🖕
👍
👫
👬
👭
🌚
🌝
🙈
💊
😶
🙏
🍦
🍉
😣
Source: github.com/k4yt3x/flowerhd
颜文字
Emoji
小恐龙
花!
上一篇
下一篇