Flask

Flask 基础知识结构 功能 示例 说明 路由 @app.route('/about') 定义 URL 路径 请求 from flask import request 获取表单、URL 参数等 响应 return 'text' 或 jsonify({...}) 返回给前端的内容 模板 render_template('index.html') 使用 Jinja2 模板渲染 HTML 重定向 redirect(url_for('func_name')) 页面跳转 表单 request.form.get('field') 获取表单数据 一个最小的 Flask 应用 from flask import Flask app = Flask(__name__) # 创建应用实例 @app.route("/") # 路由设置,访问根路径时执行 def hello(): return "Hello, Flask!" if __name__ == "__main__": app.run(host="0.0.0.0", port=80, debug=True) 注意事项: 在开发环境中使用 debug=True 没问题,它会自动重载代码并显示调试信息。 在生产环境中千万不要使用 debug=True 和 Flask 自带服务器,应该使用如 Gunicorn 或 uWSGI 搭配 Nginx。 路由 路由是 Flask 中最核心的部分之一,它用于将特定的 URL 请求映射到 Python 函数上。当用户访问某个 URL 时,Flask 会根据路由规则找到对应的视图函数并执行。 基本路由 在 Flask 中,我们使用 @app.route() 装饰器来定义路由。装饰器会将一个 URL 路径和对应的视图函数绑定在一起。 from flask import Flask app = Flask(__name__) @app.route("/") # 定义根路径的路由 def hello(): return "Hello, World!" if __name__ == "__main__": app.run(debug=True) 访问 http://127.0.0.1:5000/ 时,浏览器会显示 Hello, World!。 ...

2025年7月17日 · 6 分钟 · 阿征

ORM 框架之 SQLAlchemy

SQLAlchemy 基础知识 功能 示例 说明 创建引擎 engine = create_engine('sqlite:///example.db') 创建数据库连接引擎 会话 Session = sessionmaker(bind=engine) 用于和数据库交互的会话 数据模型 class User(Base): 定义数据库模型 查询 session.query(User).filter(User.name == 'John').all() 执行查询操作 插入 session.add(new_user) 向数据库插入数据 更新 session.query(User).filter(User.id == 1).update({'name': 'Azheng'}) 更新数据库中的记录 删除 session.query(User).filter(User.id == 1).delete() 删除数据库中的记录 一个最小的 SQLAlchemy 应用 from sqlalchemy import create_engine from sqlalchemy.ext.declarative import declarative_base from sqlalchemy.orm import sessionmaker # 创建数据库引擎 engine = create_engine('sqlite:///example.db', echo=True) # 创建一个基本类 Base = declarative_base() # 创建会话 Session = sessionmaker(bind=engine) session = Session() # 定义一个模型类 class User(Base): __tablename__ = 'users' id = Column(Integer, primary_key=True) name = Column(String) # 创建数据库表 Base.metadata.create_all(engine) # 插入数据 new_user = User(name="Azheng") session.add(new_user) session.commit() # 查询数据 user = session.query(User).filter(User.name == 'Azheng').first() print(user.name) session.close() SQLAlchemy 基础操作 from sqlalchemy import create_engine, Column, Integer, String, DECIMAL, Date, ForeignKey from sqlalchemy.orm import sessionmaker, relationship, declarative_base # 使用 create_engine() 来创建数据库引擎。 # SQLAlchemy 中的引擎是连接数据库的核心对象,负责与数据库的通信。 # 'sqlite:///example.db',三个斜杠表示 SQLite 数据库文件是相对路径(如果是绝对路径,应该是两个斜杠)。 # echo=True,这个参数控制 SQLAlchemy 的日志记录功能。当设置为 True 时,SQLAlchemy 会输出所有生成的 SQL 语句到标准输出(例如命令行)。这对于调试和查看 SQL 查询非常有用。 engine = create_engine('sqlite:///example.db', echo=True) # 使用 sessionmaker() 创建会话。 # 通过会话对象与数据库进行交互(添加、查询、删除等操作)。 Session = sessionmaker(bind=engine) # 定义会话类 Session,它与指定的数据库引擎(engine)绑定。 session = Session() # 通过会话类 Session,实例化一个会话对象 session,用于与数据库进行交互。通过这个会话对象,可以执行查询、插入、更新、删除等操作。 # 注意:SQLAlchemy 会自动创建数据库文件,但只有第一次操作数据库时(比如创建表),SQLAlchemy 才会实际创建文件。仅仅创建引擎和会话不会立即创建文件。 # 定义模型基类 # declarative_base() 是 SQLAlchemy 的声明式基类,用于创建数据模型类的基类。 # 所有继承自 Base 的类都会被 SQLAlchemy 自动识别为数据库表模型。 # 相当于 Django 的 models.Model,Flask-SQLAlchemy 的 db.Model。 Base = declarative_base() # 创建部门表 class Department(Base): __tablename__ = 'departments' # 指定该模型对应的数据库表名 # 定义一个名为 department_id 的列,类型是 Integer(整数),并设为主键(primary_key=True) # 主键是表的唯一标识符,通常自动递增(SQLite/SQLAlchemy 默认行为) department_id = Column(Integer, primary_key=True) # 定义一个名为 department_name 的列,类型是 String(字符串) # String(100) 表示的是一个 长度为 100 的字符串字段,也就是这个字段最多可以存储 100 个字符。 # nullable=False 表示这个字段不能为空,必须有值。 department_name = Column(String(100), nullable=False) # 创建员工表 class Employee(Base): __tablename__ = 'employees' employee_id = Column(Integer, primary_key=True) first_name = Column(String(50)) last_name = Column(String(50)) gender = Column(String(1)) hire_date = Column(Date) department_id = Column(Integer, ForeignKey('departments.department_id')) # 设置与部门表的关系 department = relationship("Department") # 创建薪资表 class Salary(Base): __tablename__ = 'salaries' salary_id = Column(Integer, primary_key=True) employee_id = Column(Integer, ForeignKey('employees.employee_id')) salary = Column(DECIMAL(10, 2)) from_date = Column(Date) to_date = Column(Date) # 设置与员工表的关系 employee = relationship("Employee") # 创建项目表 class Project(Base): __tablename__ = 'projects' project_id = Column(Integer, primary_key=True) project_name = Column(String(100)) start_date = Column(Date) # 定义为日期类型 end_date = Column(Date) # 创建员工-项目关系表(多对多) class EmployeeProject(Base): __tablename__ = 'employee_projects' employee_id = Column(Integer, ForeignKey('employees.employee_id'), primary_key=True) project_id = Column(Integer, ForeignKey('projects.project_id'), primary_key=True) role = Column(String(50)) # 设置与员工表和项目表的关系 employee = relationship("Employee") project = relationship("Project") # 创建所有表 Base.metadata.create_all(engine) 增(插入数据) 使用 session.add() 将对象添加到会话中,并使用 session.commit() 提交事务到数据库。 ...

2025年7月17日 · 6 分钟 · 阿征

FastAPI

Pydantic 模型 Pydantic 是一个用于 数据验证 和 设置管理 的 Python 库,主要用于创建具有类型提示的数据模型。它的核心思想是利用 Python 的类型注解来自动进行数据校验和转换,广泛应用于 FastAPI、Typer 等现代 Python 框架中。 🔹 什么是 Pydantic 模型? Pydantic 模型是一个继承自 BaseModel 的类,用来表示结构化的数据对象。它会自动验证输入数据的类型、格式,并在可能的情况下进行类型转换。 ✅ 示例: from pydantic import BaseModel class User(BaseModel): id: int name: str email: str # 创建实例,自动验证类型 user = User(id='1', name='Alice', email='alice@example.com') print(user.id) # 输出:1 (自动从字符串转为整数) print(user.dict()) # {'id': 1, 'name': 'Alice', 'email': 'alice@example.com'} 🔍 Pydantic 的主要功能 功能 描述 类型检查 检查字段是否匹配类型,如 int、str、datetime 等 自动转换 字符串转为数字、日期等常见类型 校验错误报告 提供详细的错误信息 嵌套模型 支持嵌套数据结构 默认值与可选字段 支持 Optional 和默认值设置 JSON 序列化 .json() 方法快速转 JSON 🔧 应用场景 API 数据校验(如 FastAPI 中的请求体) 配置管理(如从 .env 加载配置) 前后端数据结构同步 数据解析和转换(如从数据库或外部接口返回的数据) 🚫 错误处理示例: try: user = User(id='not-an-int', name='Bob', email='bob@example.com') except Exception as e: print(e) 输出: ...

2025年7月10日 · 1 分钟 · 阿征

Python 反射

反射概述 在 Python 中,反射机制指的是程序在运行时可以动态地获取对象的信息(如属性、方法、类名等),并能动态地操作这些信息(如调用方法、修改属性等)。总之,反射是Python中一种非常有用的元编程技术,这种机制让程序更加灵活,尤其在框架开发、动态模块加载等场景中应用广泛。但是,在使用反射时需要谨慎,避免滥用,因为反射可能会影响性能并增加代码复杂度。 反射的原理 Python 中一切皆对象(类、实例、模块、函数等),所有对象都有一个 __dict__ 属性(字典),用于存储自身的属性和方法。反射的核心就是通过字符串操作这个字典: hasattr(obj, name) 本质是判断 name 是否在 obj.__dict__ 中; getattr(obj, name) 本质是从 obj.__dict__ 中获取 name 对应的值; setattr 和 delattr 则是对 obj.__dict__ 进行修改或删除。 class A: x = 10 def foo(self): pass print(A.__dict__) # 查看类的属性字典, 返回: # {'__module__': '__main__', 'x': 10, 'foo': <function A.foo at 0x7e4ccfe413a0>, '__dict__': <attribute '__dict__' of 'A' objects>, '__weakref__': <attribute '__weakref__' of 'A' objects>, '__doc__': None} 注意事项 性能开销:反射是动态操作,比直接调用属性 / 方法的性能略低,需避免在高频循环中过度使用。 异常处理:使用 getattr 或 delattr 时,若属性不存在可能抛出 AttributeError,建议结合 hasattr 判断或指定 default 参数。 安全性:动态加载模块 / 类时,需确保输入的字符串可信,避免加载恶意模块。 反射核心内建函数 Python 提供了 4 个核心内置函数实现反射,它们适用于类、实例、模块等对象: ...

2025年7月10日 · 4 分钟 · 阿征

Python 上下文管理器 with 语句

概述 使用 Python 的 with 语句是为了简化资源管理,尤其是处理那些需要在代码执行完毕后进行清理操作的资源(例如文件操作、网络连接、锁等)。 它的核心优势在于确保无论代码块中是否发生异常,清理工作都会被正确执行。 基本语法 with 语句的通用语法如下: with expression [as variable]: # with 语句块 # 在这里使用资源 pass 组成部分解释: with 关键字:开始 with 语句。 expression (表达式): 这个表达式必须返回一个上下文管理器(Context Manager)对象。 通常是一个实现了特殊方法 __enter__ 和 __exit__ 的类的实例。 [as variable] (可选部分): 如果提供了 as variable,则 expression 返回的上下文管理器对象的 __enter__ 方法的返回值会被赋给 variable。 这个 variable 可以在 with 代码块内部使用,通常是代表被管理的资源本身(例如,打开的文件对象)。 with 语句块: 在这个代码块内部,你可以安全地使用资源。 工作原理 当你执行一个 with 语句时,Python 做了以下三件事: 进入资源:调用上下文管理器对象的 __enter__ 方法。 这个方法会执行设置操作(比如打开文件)。 它的返回值(如果有 as variable 部分)会被赋给 variable。 执行代码块:执行 with 语句块中的代码。 退出资源并清理:无论代码块正常结束还是因为抛出异常而终止,都会调用上下文管理器对象的 __exit__ 方法。 这个方法执行必要的清理操作(比如关闭文件、释放锁)。 __exit__ 方法的签名: ...

2025年7月10日 · 2 分钟 · 阿征