柳嘉希

硕士研究生毕业生

软件工程师 | 可扩展的API · 网络爬虫 · 数据集成 · Vibe代码清理专家

Python 与 Flask 复习:装饰器、生成器、拷贝、魔法方法、加密与 Token

Python 的核心知识经常出现在后端面试和自动化脚本开发中。

装饰器

装饰器本质上是接收函数并返回新函数的函数。

def log(fn):
    def wrapper(*args, **kwargs):
        print("before")
        result = fn(*args, **kwargs)
        print("after")
        return result
    return wrapper
 
@log
def hello():
    print("hello")

@log 等价于 hello = log(hello)

生成器

生成器使用 yield,可以按需产生值。

def count():
    yield 1
    yield 2
 
for item in count():
    print(item)

生成器适合处理大数据流,避免一次性加载全部内容。

深拷贝与浅拷贝

浅拷贝只复制第一层对象,内部引用仍共享。深拷贝会递归复制嵌套对象。

import copy
 
a = [[1], [2]]
b = copy.copy(a)
c = copy.deepcopy(a)

魔法方法

常见魔法方法包括:

  • __init__:初始化对象
  • __new__:创建对象
  • __del__:对象销毁时调用
  • __str__:字符串展示

Flask、加密与 Token

Flask 是轻量级 Python Web 框架。后端认证中常见 token 流程是:

  1. 用户登录
  2. 服务端验证账号密码
  3. 返回 token
  4. 后续请求携带 token
  5. 服务端校验 token 后返回资源

实际项目中必须配合 HTTPS、过期时间和权限控制。

延伸理解

复习这篇时,不要只记住名词,要把重点放在 装饰器、生成器、拷贝语义、魔法方法、Flask 路由、加密和 Token。这类知识如果只停留在定义层面,很容易在面试或项目中答得很散。更好的理解方式是把它放进一个具体场景:谁在调用它,输入从哪里来,失败后谁负责恢复,数据或状态会不会被重复处理。

  • 后端设计的重点不是把接口跑通,而是让认证、校验、错误处理、幂等性、日志和版本演进都有明确位置。
  • 接口字段要服务于业务语义,不能只是数据库表结构的直接暴露。
  • 评审一个 API 时,至少检查正常路径、权限失败、输入非法、资源不存在和外部依赖失败。

在真实项目中,可以把它当成一个判断框架:先确认输入、约束、失败场景和可观测性,再决定具体工具或写法。 如果一个方案看起来很简单,要继续追问它在规模扩大、权限变化、异常恢复和团队协作下是否仍然成立。

实践检查清单

  • 明确这个知识点在系统中的位置:是开发时约束、运行时能力、基础设施能力,还是协作流程。
  • 写出一个最小可运行例子,并补一个失败例子;只会写 happy path 说明理解还不够稳。
  • 记录常见误用:例如边界条件、权限假设、性能假设、同步/异步差异或环境差异。
  • 把概念和项目经历关联起来:如果面试被追问,可以用自己的项目说明为什么这样选。
  • 最后用一句话总结取舍:它牺牲了什么,换来了什么。

自测问题

  1. 这个主题解决的核心问题是什么?
  2. 如果不用当前方案,还有哪些替代方案?代价是什么?
  3. 最容易出错的边界条件在哪里?
  4. 如何在代码、测试或监控中验证它真的可靠?

项目化应用场景

可以把这类知识放到一个用户系统或内容管理系统里理解:前端提交表单,后端先做认证,再做权限检查和输入校验,然后执行业务逻辑,最后返回稳定的状态码和错误结构。一个成熟后端接口不应该只考虑成功返回数据,还要考虑 token 过期、用户无权限、重复提交、参数非法、数据库写入失败和外部服务超时。接口文档、日志、监控和测试用例都应该围绕这些路径展开。

常见误区:

  • 把认证和鉴权混为一谈。
  • 只在前端校验输入,后端直接相信请求。
  • 所有错误都返回 500,导致调用方无法恢复。