Flask 核心知识点
1. 简介与特点
微框架: 核心简单,高度可扩展,不强制使用特定工具或库。
优点:
- 学习曲线平缓: 易于上手,适合小型项目和快速开发。
- 灵活性高: 开发者可以自由选择组件和技术栈。
- 社区活跃: 拥有丰富的第三方扩展和活跃的社区支持。
- 适用于API开发: 轻量级使其非常适合构建 RESTful API。
缺点:
- 功能较少: 核心功能仅包含请求分发和模板渲染,其他需自行集成。
- 不适合大型项目?: 对于非常大型、复杂且有明确规范的项目,可能需要更多约定和内置功能的框架(如 Django)。
2. 基本应用结构
一个最简单的 Flask 应用:
from flask import Flask
# 1. 创建 Flask 应用实例
app = Flask(__name__)
# 2. 路由定义 (URL 映射到视图函数)
@app.route('/')
def hello_world():
return 'Hello, World!'
# 3. 运行应用
if __name__ == '__main__':
# 开启调试模式,代码修改后自动重启,并提供交互式调试器
app.run(debug=True)
3. 核心概念
Flask实例 (app = Flask(__name__))Flask类是所有 Flask 应用的入口。__name__参数是当前模块的名称,Flask 用它来定位资源(如模板、静态文件)。
路由 (Routing)
使用
@app.route(rule, options)装饰器将 URL 路径与视图函数关联起来。rule: URL 规则字符串,支持变量。URL 变量:
<variable_name>用于捕获 URL 中的值。@app.route('/user/<username>')@app.route('/post/<int:post_id>')(指定类型,如string,int,float,path,uuid)
HTTP 方法限制:
methods=['GET', 'POST']@app.route('/submit', methods=['POST'])
URL 反转:
url_for()函数根据视图函数名和参数生成 URL。url_for('hello_world')->/url_for('get_user', username='alice')->/user/alice- 用于避免硬编码 URL,方便修改和维护。
请求上下文 (Request Context)
在每次请求到达时创建,包含请求相关的所有信息。
request对象: 包含客户端发送的所有数据。request.method: 请求方法 (GET, POST等)request.args: GET 请求的查询参数 (ImmutableMultiDict)request.form: POST 请求的表单数据 (ImmutableMultiDict)request.json: POST 请求的 JSON 数据 (如果Content-Type是application/json)request.headers: 请求头request.cookies: 客户端的 Cookierequest.files: 上传的文件request.path,request.url,request.base_url等
session对象: 用户会话信息,用于在请求之间存储数据。- 需要设置
app.secret_key来加密会话数据。 session['user_id'] = 1
- 需要设置
应用上下文 (Application Context)
- 在应用启动时创建,包含应用相关的配置信息。
current_app对象: 代理当前的 Flask 应用实例。
响应 (Response)
视图函数可以返回:
字符串: Flask 会自动将其包装为 Response 对象,Content-Type为
text/html。元组:
(response, status_code, headers)return 'Error!', 400return 'Custom Header', 200, {'X-My-Header': 'Hello'}
Response对象:make_response()函数创建。jsonify(): 将 Python 字典或列表转换为 JSON 响应,并自动设置Content-Type: application/json。
4. 模板渲染 (Templating)
Flask 默认使用 Jinja2 模板引擎。
render_template(template_name, **context):- 在
templates文件夹中查找模板文件。 template_name: 模板文件的路径(相对于templates文件夹)。**context: 传递给模板的变量。
- 在
Jinja2 语法:
{{ variable }}: 输出变量值。{% statement %}: 执行控制语句(如for循环,if条件)。{# comment #}: 注释。{% extends 'base.html' %}: 模板继承。{% block content %}{% endblock %}: 定义块。
静态文件:
- 在
static文件夹中存放 CSS, JS, 图片等文件。 - 在模板中使用
url_for('static', filename='css/style.css')来引用。
- 在
5. 错误处理 (Error Handling)
- 使用
@app.errorhandler(code_or_exception)装饰器来注册错误处理器。 - 可以捕获 HTTP 状态码(如 404, 500)或特定的异常。
@app.errorhandler(404)
def page_not_found(error):
return render_template('404.html'), 404
@app.errorhandler(Exception) # 捕获所有未处理的异常
def handle_exception(e):
# log the error
return 'Internal Server Error', 500
6. 调试模式 (Debug Mode)
app.run(debug=True)。功能:
- 自动重载: 代码修改后自动重启。
- 交互式调试器: 发生错误时在浏览器中提供调试界面。
- 禁用缓存: 确保模板是最新的。
注意: 严禁在生产环境中使用
debug=True。
7. 配置 (Configuration)
app.config对象: 存储应用配置。设置配置:
直接赋值:
app.config['SECRET_KEY'] = 'your_secret_key'from_object(): 从 Python 对象加载配置。# config.py
class Config:
DEBUG = False
SECRET_KEY = 'another_secret_key'
# app.py
app.config.from_object('config.Config')from_envvar(): 从环境变量加载配置文件路径。from_pyfile(): 从 Python 文件加载配置。
常用配置项:
SECRET_KEY: 用于会话加密、CSRF 保护等,非常重要。DEBUG: 调试模式。TEMPLATES_AUTO_RELOAD: 控制模板是否自动重载(默认为None,在DEBUG模式下为True)。MAX_CONTENT_LENGTH: 限制请求体的最大大小(用于文件上传)。
8. 蓝图 (Blueprints)
用于组织大型应用、模块化代码。
将相关的视图函数、模板、静态文件等注册到一个蓝图上,然后将蓝图注册到应用实例上。
优点:
- 模块化: 将应用拆分成更小的、可管理的组件。
- 可复用性: 蓝图可以注册到多个应用实例。
- URL 前缀: 可以为蓝图中的所有路由添加统一的 URL 前缀。
- 子域名: 蓝图可以关联到特定的子域名。
# users/views.py
from flask import Blueprint
users_bp = Blueprint('users', __name__, url_prefix='/users')
@users_bp.route('/')
def index():
return 'User List'
@users_bp.route('/<int:user_id>')
def user_profile(user_id):
return f'User ID: {user_id}'
# app.py
from flask import Flask
from users.views import users_bp
app = Flask(__name__)
app.register_blueprint(users_bp) # 注册蓝图
# 访问 /users/ 或 /users/123
9. Hook 函数 (钩子函数)
- 在请求处理的不同阶段执行特定功能的函数。
@app.before_request: 请求进入视图函数之前执行。@app.after_request: 视图函数执行并生成响应后执行。@app.teardown_request: 请求结束后执行,无论是否发生异常。@app.before_first_request: 第一个请求到达时执行一次。
10. 扩展 (Extensions)
Flask 本身很精简,但有大量的第三方扩展来提供额外功能。
常见扩展:
- Flask-SQLAlchemy: ORM (对象关系映射) 库,用于数据库操作。
- Flask-Migrate: 数据库迁移工具。
- Flask-WTF: 表单处理和 CSRF 保护。
- Flask-Login: 用户会话管理和认证。
- Flask-RESTful / Flask-RESTX: 构建 RESTful API。
- Flask-Mail: 邮件发送。
- Flask-Bcrypt: 密码哈希。
- Flask-CORS: 跨域资源共享。
11. 部署 (Deployment)
开发服务器:
app.run()仅用于开发和测试。生产环境:
需要使用生产级的 WSGI 服务器,如 Gunicorn、uWSGI。
将 Flask 应用作为 WSGI 可调用对象运行。
通常会结合 Nginx (作为反向代理和静态文件服务) 使用。
示例 (
wsgi.py):from yourapplication import app as application # 假设你的Flask应用实例叫app,在yourapplication模块中 if __name__ == '__main__':
application.run()运行 Gunicorn:
gunicorn -w 4 wsgi:application(4个 worker 进程)
Flask 核心知识点的更多相关文章
- javascript中的一些核心知识点以及需要注意的地方
前言 近期杂事甚多,这些事情的积累对知识体系的提升有好处,但是却不能整理出来,也整理不出来 比如说我最近研究的Hybrid在线联调方案便过于依赖于业务,就算分享也不会有人读懂,若是抽一点来分享又意义不 ...
- Java核心知识点学习----多线程中的阻塞队列,ArrayBlockingQueue介绍
1.什么是阻塞队列? 所谓队列,遵循的是先进先出原则(FIFO),阻塞队列,即是数据共享时,A在写数据时,B想读同一数据,那么就将发生阻塞了. 看一下线程的四种状态,首先是新创建一个线程,然后,通过s ...
- Java核心知识点学习----使用Condition控制线程通信
一.需求 实现线程间的通信,主线程循环3次后,子线程2循环2次,子线程3循环3次,然后主线程接着循环3次,如此循环3次. 即:A->B->C---A->B->C---A-> ...
- Java核心知识点学习----线程中如何创建锁和使用锁 Lock,设计一个缓存系统
理论知识很枯燥,但这些都是基本功,学完可能会忘,但等用的时候,会发觉之前的学习是非常有意义的,学习线程就是这样子的. 1.如何创建锁? Lock lock = new ReentrantLock(); ...
- Java核心知识点 --- 线程中如何创建锁和使用锁 Lock , 设计一个缓存系统
理论知识很枯燥,但这些都是基本功,学完可能会忘,但等用的时候,会发觉之前的学习是非常有意义的,学习线程就是这样子的. 1.如何创建锁? Lock lock = new ReentrantLock(); ...
- 2019年Spring核心知识点整理,看看你掌握了多少?
前言 如今做Java尤其是web几乎是避免不了和Spring打交道了,但是Spring是这样的大而全,新鲜名词不断产生,学起来给人一种凌乱的感觉,在这里总结一下,理顺头绪. Spring 概述 Spr ...
- 【SpringBoot MQ 系列】RabbitMq 核心知识点小结
[MQ 系列]RabbitMq 核心知识点小结 以下内容,部分取材于官方教程,部分来源网络博主的分享,如有兴趣了解更多详细的知识点,可以在本文最后的文章列表中获取原地址 RabbitMQ 是一个基于 ...
- 保证看完就会!大数据YRAN核心知识点来袭!
01 我们一起学大数据 大家好,今天分享的是大数据YRAN的核心知识点,老刘尽量用通俗易懂的话来讲述YARN知识点,争取做到大家看完后能够用口语化的形式将它们表达出来,做到真正的看完就会!(如果觉得老 ...
- Canal:同步mysql增量数据工具,一篇详解核心知识点
老刘是一名即将找工作的研二学生,写博客一方面是总结大数据开发的知识点,一方面是希望能够帮助伙伴让自学从此不求人.由于老刘是自学大数据开发,博客中肯定会存在一些不足,还希望大家能够批评指正,让我们一起进 ...
- Redis 面霸篇:高频问题横扫核心知识点
「码哥字节」从高频面试问题跟大家一起横扫 Redis 核心知识点,从根本上理解 Redis ,不做八股文的工具人,做扭转乾坤的大神. 码哥到如今已经写了 9 篇 Redis 连载,后台有小伙伴也让我写 ...
随机推荐
- JumpServer介绍及v4版本单机部署
概述 JumpServer官网:https://www.jumpserver.org/ JumpServer官网文档:https://docs.jumpserver.org/zh/v4/ GitHub ...
- 1 MyBatis动态SQL之综述和 if 语句
摘要:使用 MyBatis 动态SQL,通过 if, choose, when, otherwise, trim, where, set, foreach和bind等标签,可组合成非常灵活的SQL语句 ...
- 20250528 - Usual 攻击事件: 价差兑换与请君入瓮
背景信息 项目背景 VaultRouter 合约有用特权身份,可以通过 Usd0PP 合约将 USD0++ 以 1:1 的比例兑换成 USD0,随后通过 UniV3 将 USD0 swap 成 sUS ...
- Apache JMeter压力测试工具的安装与使用
官网下载 https://jmeter.apache.org/download_jmeter.cgi 然后解压即可 运行 双击bin/jmeter.bat 汉化 在软件里选择语言重启就会还原,所以这里 ...
- 【pr】利用lrc快速导入歌曲的歌词
确保你的bgm是原汁原味的,没有经过变速或剪辑 下载lrc https://www.musicenc.com/ pr不能直接导入lrc,需要将lrc转换成srt https://www.lrccon. ...
- 【2020.11.30提高组模拟】柱形图(histogram) 题解翻译
[2020.11.30提高组模拟]柱形图(histogram) 题解 题意简述 有\(n\)个长方体并排这样放着,每种颜色的长方体的宽度都为\(1\),高\(a_i\)长\(b_i\). 求在这些长方 ...
- 基于 A2A 协议的 LlamaIndex 文件聊天工作流
本示例展示了一个使用 LlamaIndex Workflows 构建并通过 A2A 协议公开的对话代理.它展示了文件上传和解析.支持多轮对话的对话交互.流式响应/更新以及内联引用. 源代码 a2a l ...
- C++学习思维导图
C++思维导图 整个的思维导图大概的架构如下,Xmind.SVG.PDF格式的下载链接都在下面了,如有需要可自取 Xmind文件分享:https://cnblogs-img.oss-cn-hangzh ...
- 「Log」做题记录 2023.7.31-2023.8.27
\(2023.7.31-2023.8.6\) \(\color{royalblue}{P3115}\) 分层图,注意建边方式,题面好烂. \(\color{royalblue}{P6554}\) 换根 ...
- pytorch入门 - 修改huggingface大模型配置参数
介绍 Hugging Face的Transformers库提供了大量预训练模型,但有时我们需要修改这些模型的默认参数来适应特定任务. 本文将详细介绍如何修改BERT模型的最大序列长度(max_posi ...