Flask 框架(一):核心特性与基础配置

目录

[一、为什么选择 Flask?](#一、为什么选择 Flask?)

[二、Flask 核心概念与初始化](#二、Flask 核心概念与初始化)

[2.1 程序实例初始化](#2.1 程序实例初始化)

[2.2 运行配置:app.run () 参数详解](#2.2 运行配置:app.run () 参数详解)

[2.3 应用配置:三种参数设置方式](#2.3 应用配置:三种参数设置方式)

[1. 字典直接配置(简单临时场景)](#1. 字典直接配置(简单临时场景))

[2. 配置文件导入(生产级安全)](#2. 配置文件导入(生产级安全))

[3. 类继承配置(复杂项目首选)](#3. 类继承配置(复杂项目首选))

[三、路由与视图:Flask 的核心交互逻辑](#三、路由与视图:Flask 的核心交互逻辑)

[3.1 基础路由定义](#3.1 基础路由定义)

[3.2 路由高级特性](#3.2 路由高级特性)

动态参数传递

路由反向解析

四、请求与响应:数据交互基础

[4.1 获取请求数据](#4.1 获取请求数据)

[4.2 构建响应内容](#4.2 构建响应内容)

小结


在 Python Web 开发领域,Flask 以其轻量、灵活的特性占据了重要地位。对于追求极简开发体验或需要高度定制化的项目来说,Flask 无疑是绝佳选择。本文将从 Flask 的核心特性出发,详解其基础配置与核心概念,帮助初学者快速入门。

一、为什么选择 Flask?

Web 开发涉及网络通信、数据库交互、会话管理等众多基础工作,直接从零开发不仅效率低下,还容易引入 bug。使用 Web 框架的核心价值在于 "避免重复造轮子"------ 框架处理底层逻辑,开发者专注业务实现。

与 Django 等 "全栈框架" 相比,Flask 的特点尤为突出:

  • 轻量级:仅保留核心功能(路由、视图、模板渲染),无强制依赖
  • 高可定制:通过第三方扩展实现功能扩展(如数据库、表单验证等)
  • 核心依赖:基于 Werkzeug(HTTP 工具集)和 Jinja2(模板引擎)构建,兼顾性能与灵活性

适合场景:小型应用、API 服务、快速原型开发,或需要深度定制架构的项目。

二、Flask 核心概念与初始化

2.1 程序实例初始化

Flask 应用的起点是创建Flask对象,其初始化参数决定了项目的基础结构:

复制代码
from flask import Flask

app = Flask(
    import_name=__name__,  # 必传,通常为__name__,决定静态文件路径
    static_url_path='/static',  # 静态文件访问URL前缀,默认'/static'
    static_folder='static',  # 静态文件存储目录,默认'static'
    template_folder='templates'  # 模板文件存储目录,默认'templates'
)

参数说明

  • import_name:用于定位项目根目录,传入__name__即可满足绝大多数场景。
  • 静态文件访问规则:默认通过http://域名/static/文件名访问,修改static_url_pathstatic_folder后需对应调整路径。

示例:若将静态目录改为assets,访问路径需改为/static/文件名static_url_path默认值),但实际文件存储在assets文件夹中。

2.2 运行配置:app.run () 参数详解

创建实例后,通过app.run()启动服务,常用参数如下:

复制代码
app.run(
    host="0.0.0.0",  # 允许外部访问(默认仅本地127.0.0.1)
    port=5000,  # 端口号,默认5000
    debug=True  # 调试模式开关
)

其中,debug=True(调试模式)是开发阶段的 "利器",开启后:

  • 代码修改后自动重启服务,无需手动重启
  • 错误发生时,前端直接显示详细堆栈信息(生产环境必须关闭,避免泄露敏感信息

2.3 应用配置:三种参数设置方式

Flask 的配置参数(如数据库地址、密钥等)可通过多种方式设置,适用于不同场景:

1. 字典直接配置(简单临时场景)

直接通过app.config字典修改,适合快速测试:

复制代码
app.config['DEBUG'] = True  # 开启调试模式
app.config['SECRET_KEY'] = 'dev_key'  # 会话加密密钥(开发环境临时值)
2. 配置文件导入(生产级安全)

将配置写入独立文件(如config.py),通过from_pyfile导入,避免敏感信息硬编码:

复制代码
# config.py
DEBUG = False
SECRET_KEY = 'your_secure_key'
SQLALCHEMY_DATABASE_URI = 'mysql://user:pass@localhost/db'

# 应用中导入
app.config.from_pyfile('config.py')
3. 类继承配置(复杂项目首选)

通过类定义配置,支持继承与环境区分(如开发 / 生产环境):

复制代码
class BaseConfig:
    SECRET_KEY = 'shared_key'
    SQLALCHEMY_TRACK_MODIFICATIONS = False

class DevConfig(BaseConfig):
    DEBUG = True
    SQLALCHEMY_DATABASE_URI = 'mysql://root:dev_pass@localhost/dev_db'

class ProdConfig(BaseConfig):
    DEBUG = False
    SQLALCHEMY_DATABASE_URI = 'mysql://user:prod_pass@localhost/prod_db'

# 根据环境选择配置
app.config.from_object(DevConfig)  # 开发环境
# app.config.from_object(ProdConfig)  # 生产环境

三、路由与视图:Flask 的核心交互逻辑

路由与视图是 Flask 处理用户请求的核心机制:路由定义 URL 规则,视图函数处理业务逻辑并返回响应

3.1 基础路由定义

通过@app.route装饰器定义路由,语法简洁直观:

复制代码
@app.route('/')  # 根路径
def index():
    return 'Hello, Flask!'  # 返回字符串响应
  • 指定 HTTP 方法 :默认仅支持GET,通过methods参数扩展:

    复制代码
    @app.route('/login', methods=['GET', 'POST'])
    def login():
        if request.method == 'GET':
            return '登录页面'
        else:
            return '处理登录请求'
  • 查看项目路由 :通过flask routes命令或代码遍历查看所有路由:

    复制代码
    for rule in app.url_map.iter_rules():
        print(f"URL: {rule.rule}, 方法: {rule.methods}, 视图: {rule.endpoint}")

3.2 路由高级特性

动态参数传递

支持在 URL 中嵌入参数(如用户 ID),并指定类型(int/float/string):

复制代码
@app.route('/user/<int:user_id>')  # 仅匹配整数ID
def user_detail(user_id):
    return f"用户ID: {user_id}"  # 参数直接传入视图函数
路由反向解析

使用url_for根据视图函数名生成 URL,避免硬编码路径(尤其适合动态路由):

复制代码
from flask import url_for, redirect

@app.route('/profile')
def profile():
    return '个人主页'

@app.route('/redirect-to-profile')
def redirect_demo():
    # 反向解析profile视图的URL(此处为'/profile')
    profile_url = url_for('profile')
    return redirect(profile_url)  # 重定向到个人主页

四、请求与响应:数据交互基础

Flask 通过request对象获取客户端数据,通过多种方式返回响应,满足不同场景需求。

4.1 获取请求数据

request对象封装了 HTTP 请求细节,需从flask导入:

复制代码
from flask import request

@app.route('/submit', methods=['GET', 'POST'])
def submit():
    # 获取GET参数(?name=xxx&age=18)
    name = request.args.get('name', '匿名')  # 第二个参数为默认值
    
    # 获取POST表单数据(Content-Type: application/x-www-form-urlencoded)
    if request.method == 'POST':
        email = request.form.get('email')
    
    # 获取JSON数据(Content-Type: application/json)
    json_data = request.get_json()  # 解析JSON为字典
    
    return f"Hello, {name}!"

4.2 构建响应内容

Flask 支持多种响应类型,覆盖常见 Web 场景:

  1. 字符串响应 :直接返回文本(默认text/html类型)

    复制代码
    return '简单文本'
  2. 模板渲染 :通过render_template返回 HTML 页面(需配合templates目录):

    复制代码
    from flask import render_template
    
    @app.route('/page')
    def show_page():
        # 传递变量到模板(templates/page.html)
        return render_template('page.html', title='Flask页面', content='欢迎访问')
  3. JSON 响应 :通过jsonify返回 JSON 数据(自动设置Content-Type:application/json):

    复制代码
    from flask import jsonify
    
    @app.route('/api/data')
    def api_data():
        return jsonify(code=200, message='success', data={'key': 'value'})
  4. 重定向 :通过redirect跳转到其他 URL:

    复制代码
    from flask import redirect
    return redirect('/login')  # 重定向到登录页
    return redirect(url_for('index'))  # 结合反向解析更灵活
  5. 自定义响应 :通过make_response设置状态码、响应头:

    复制代码
    from flask import make_response
    
    @app.route('/custom')
    def custom_response():
        resp = make_response('自定义响应')
        resp.status_code = 201  # 状态码(默认200)
        resp.headers['X-Custom-Header'] = 'flask'  # 自定义响应头
        return resp

小结

本文介绍了 Flask 的核心特性、基础配置、路由视图与数据交互逻辑,覆盖了搭建简单 Web 应用的全部基础。Flask 的设计哲学是 "简约而不简单"------ 看似轻量的框架,却能通过扩展灵活支撑复杂项目。

下一篇将深入讲解 Flask 的高级特性,包括会话管理、模板引擎、数据库交互、表单处理等实战必备技能,帮助你从 "能运行" 提升到 "能落地"。

相关推荐
我是不会赢的26 分钟前
使用 decimal 包解决 go float 浮点数运算失真
开发语言·后端·golang·浮点数
yuqifang42 分钟前
写一个简单的Java示例
java·后端
Re27543 分钟前
分库分表后主键总“撞车”?5种全局唯一ID方案让你不再头疼
后端
陈随易1 小时前
VSCode v1.103发布,AI编程任务列表,可用GPT 5和Claude 4.1
前端·后端·程序员
中等生1 小时前
Python的隐形枷锁:GIL如何"绑架"了你的多线程梦想
后端·python
电商数据girl1 小时前
关于私域电商网站,接入电商API数据接口示例
运维·开发语言·网络·python·json·php
Pitayafruit2 小时前
【📕分布式锁通关指南 12】源码剖析redisson如何利用Redis数据结构实现Semaphore和CountDownLatch
redis·分布式·后端
哈基米喜欢哈哈哈2 小时前
Netty入门(二)——网络传输
java·开发语言·网络·后端
尘心不灭2 小时前
Spring Boot 项目代码笔记
spring boot·笔记·后端