找回密码
 立即注册
首页 业界区 业界 Flask 核心知识点

Flask 核心知识点

戎玉珂 2025-8-12 13:22:37
1. 简介与特点


  • 微框架: 核心简单,高度可扩展,不强制使用特定工具或库。
  • 优点:

    • 学习曲线平缓: 易于上手,适合小型项目和快速开发。
    • 灵活性高: 开发者可以自由选择组件和技术栈。
    • 社区活跃: 拥有丰富的第三方扩展和活跃的社区支持。
    • 适用于API开发: 轻量级使其非常适合构建 RESTful API。

  • 缺点:

    • 功能较少: 核心功能仅包含请求分发和模板渲染,其他需自行集成。
    • 不适合大型项目?: 对于非常大型、复杂且有明确规范的项目,可能需要更多约定和内置功能的框架(如 Django)。

2. 基本应用结构

一个最简单的 Flask 应用:
  1. from flask import Flask
  2. # 1. 创建 Flask 应用实例
  3. app = Flask(__name__)
  4. # 2. 路由定义 (URL 映射到视图函数)
  5. @app.route('/')
  6. def hello_world():
  7.     return 'Hello, World!'
  8. # 3. 运行应用
  9. if __name__ == '__main__':
  10.     # 开启调试模式,代码修改后自动重启,并提供交互式调试器
  11.     app.run(debug=True)
复制代码
3. 核心概念


  • Flask 实例 (app = Flask(__name__))

    • Flask 类是所有 Flask 应用的入口。
    • __name__ 参数是当前模块的名称,Flask 用它来定位资源(如模板、静态文件)。

  • 路由 (Routing)

    • 使用 @app.route(rule, options) 装饰器将 URL 路径与视图函数关联起来。
    • rule: URL 规则字符串,支持变量。
    • URL 变量:  用于捕获 URL 中的值。

      • @app.route('/user/')
      • @app.route('/post/') (指定类型,如 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: 客户端的 Cookie
      • request.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!', 400
        • return '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)或特定的异常。
  1. @app.errorhandler(404)
  2. def page_not_found(error):
  3.     return render_template('404.html'), 404
  4. @app.errorhandler(Exception) # 捕获所有未处理的异常
  5. def handle_exception(e):
  6.     # log the error
  7.     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 对象加载配置。
      1. # config.py
      2. class Config:
      3.     DEBUG = False
      4.     SECRET_KEY = 'another_secret_key'
      5. # app.py
      6. 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 前缀。
    • 子域名: 蓝图可以关联到特定的子域名。

  1. # users/views.py
  2. from flask import Blueprint
  3. users_bp = Blueprint('users', __name__, url_prefix='/users')
  4. @users_bp.route('/')
  5. def index():
  6.     return 'User List'
  7. @users_bp.route('/<int:user_id>')
  8. def user_profile(user_id):
  9.     return f'User ID: {user_id}'
  10. # app.py
  11. from flask import Flask
  12. from users.views import users_bp
  13. app = Flask(__name__)
  14. app.register_blueprint(users_bp) # 注册蓝图
  15. # 访问 /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 服务器,如 GunicornuWSGI
    • 将 Flask 应用作为 WSGI 可调用对象运行。
    • 通常会结合 Nginx (作为反向代理和静态文件服务) 使用。
    • 示例 (wsgi.py):
      1. from yourapplication import app as application # 假设你的Flask应用实例叫app,在yourapplication模块中
      2. if __name__ == '__main__':
      3.     application.run()
      复制代码
    • 运行 Gunicorn: gunicorn -w 4 wsgi:application (4个 worker 进程)


来源:豆瓜网用户自行投稿发布,如果侵权,请联系站长删除

相关推荐

您需要登录后才可以回帖 登录 | 立即注册