Flask 核心知识点速查手册
📌 基础篇
1. Flask 应用结构
fromflaskimportFlask app=Flask(__name__)# 创建应用实例@app.route("/")# 路由装饰器defindex():return"Hello World"if__name__=="__main__":app.run(debug=True)# 启动服务器
2. 路由系统
# 基础路由@app.route("/")# 动态路由@app.route("/user/<username>")@app.route("/post/<int:id>")# 多方法支持@app.route("/api",methods=["GET","POST"])
3. 请求处理
fromflaskimportrequest# 获取请求数据request.method# 请求方法request.args# GET参数request.form# 表单数据request.json# JSON数据request.headers# 请求头
4. 响应处理
# 返回字符串return"文本"# 返回JSONreturn{"key":"value"}# Flask自动转为JSON# 自定义状态码returnjsonify(data),201# 重定向fromflaskimportredirectreturnredirect("/new-url")
📌 模板篇
5. 模板渲染
fromflaskimportrender_template# 渲染模板并传参returnrender_template("index.html",name="John",items=items)
6. Jinja2 模板语法
<!-- 变量 -->{{ variable }}<!-- 循环 -->{% for item in items %} {{ item }} {% endfor %}<!-- 条件 -->{% if condition %}<p>条件成立</p>{% endif %}<!-- 安全输出HTML -->{{ html_content|safe }}
7. 模板继承
<!-- base.html --><html><body>{% block content %}{% endblock %}</body></html><!-- child.html -->{% extends "base.html" %} {% block content %}<h1>子页面内容</h1>{% endblock %}
📌 进阶篇
8. 动态路由参数
# 字符串参数@app.route("/<username>")defprofile(username):returnf"用户:{username}"# 类型转换器@app.route("/post/<int:post_id>")# int, float, path, uuid@app.route("/<any(blog,article):section>/<id>")
9. 请求钩子(Middleware)
@app.before_requestdefbefore_each_request():# 每个请求前执行pass@app.after_requestdefafter_each_request(response):# 每个请求后执行returnresponse
10. 错误处理
@app.errorhandler(404)defpage_not_found(error):return"页面不存在",404@app.errorhandler(500)defserver_error(error):return"服务器错误",500
📌 数据篇
11. 处理JSON数据
# 发送JSON请求importrequests requests.post(url,json={"key":"value"})# 接收JSON数据@app.route("/api",methods=["POST"])defapi():data=request.get_json()# 获取JSON数据returnjsonify(data)# 返回JSON响应
12. 表单处理
fromflaskimportrequest@app.route("/submit",methods=["POST"])defsubmit():username=request.form.get("username")password=request.form.get("password")returnf"用户:{username}"
📌 外部API集成
13. 调用外部API
importrequests# GET请求response=requests.get(url,params=params)data=response.json()# POST请求response=requests.post(url,json=data)# 添加请求头headers={"Authorization":"Bearer token"}response=requests.get(url,headers=headers)
14. 错误处理与超时
try:response=requests.get(url,timeout=5)response.raise_for_status()# 检查状态码data=response.json()exceptrequests.Timeout:return"请求超时"exceptrequests.RequestExceptionase:returnf"请求失败:{e}"
📌 项目结构
15. 基础项目结构
项目名称/ ├── app.py # 主应用文件 ├── requirements.txt # 依赖列表 ├── templates/ # 模板目录 │ └── index.html ├── static/ # 静态文件 │ ├── css/ │ ├── js/ │ └── images/ └── README.md
16. requirements.txt 示例
Flask==2.3.3 requests==2.31.0 python-dotenv==1.0.0
📌 实战代码片段
17. 猜数字API
@app.route("/<guess>")defguess_number(guess):try:guess=int(guess)ifguess==41:return{"correct":True,"message":"恭喜!"}return{"correct":False,"message":"再试试"}except:return{"error":"请输入数字"}
18. 待办事项列表
items=[]@app.route("/",methods=["GET","POST"])deftodo():ifrequest.method=="POST":data=request.get_json()items.append(data["item"])returnrender_template("list.html",items=items)
19. 词云生成器
@app.route("/<topic>")defwordcloud(topic):# 获取维基百科内容response=requests.get(f"维基百科API/{topic}")text=response.json()["extract"]# 生成词云wordcloud=WordCloud().generate(text)svg=wordcloud.to_svg()returnrender_template("wordcloud.html",svg=svg)
🎯 核心要点速记
| 分类 | 关键字 | 用途 |
|---|
| 应用 | Flask(__name__) | 创建应用 |
| 路由 | @app.route() | 定义URL映射 |
| 请求 | request | 获取请求数据 |
| 响应 | return,jsonify() | 返回响应 |
| 模板 | render_template() | 渲染HTML |
| 模板语法 | {{ }},{% %} | 动态内容 |
| 动态路由 | <variable> | URL参数捕获 |
| 错误处理 | @app.errorhandler() | 自定义错误页面 |
| 外部调用 | requests | 调用API |
| JSON处理 | get_json(),jsonify() | JSON数据交换 |
⚡ 一句话总结每个知识点
- 创建应用:
app = Flask(__name__) - 定义路由:
@app.route("/path") - 处理请求:使用
request对象 - 返回响应:直接返回或
jsonify() - 渲染模板:
render_template("模板.html", 参数) - 模板变量:
{{ 变量名 }}显示内容 - 模板逻辑:
{% for %}循环,{% if %}条件 - 动态路由:
@app.route("/<参数名>") - 接收JSON:
request.get_json() - 调用API:
requests.get(url)或requests.post() - 错误处理:
try-except捕获异常 - 启动应用:
app.run(debug=True)
💡 开发流程速查
开发一个新端点
- 定义路由:
@app.route("/endpoint", methods=["METHOD"]) - 创建函数:
def function_name(): - 获取数据:
data = request.get_json()或param = request.args.get("key") - 处理逻辑:你的业务代码
- 返回响应:
return jsonify(result)或return render_template(...)
常见状态码
200:成功201:创建成功400:请求错误401:未授权404:资源不存在500:服务器错误