当前位置: 首页 > news >正文

Python之Flask开发框架(第一篇) — 从安装到第一个应用

本文聚焦于Flask 的基础入门,涵盖安装、第一个应用、基本概念、项目结构、路由与视图函数。

引言

Flask 是一个使用 Python 编写的轻量级 Web 应用框架。它被设计为“微型”框架,但并不意味着它功能薄弱;相反,Flask 提供了构建 Web 应用所需的核心组件,同时保持了极高的灵活性和可扩展性。对于初学者来说,Flask 的学习曲线平缓,能让你快速理解 Web 开发的核心概念;对于高级开发者,Flask 又能通过丰富的扩展支持复杂应用的开发。

本教程将带你从零开始,完成 Flask 的安装,创建第一个 Flask 应用,并深入解析 Flask 的基本概念、项目结构、路由与视图函数。


1. Flask 安装

在开始之前,请确保你的电脑上已经安装了 Python 3.8 或更高版本。推荐使用虚拟环境来隔离项目依赖。

1.1 创建虚拟环境

# 在项目目录下执行python-mvenv venv

1.2 激活虚拟环境

  • Windows:
    venv\Scripts\activate
  • macOS / Linux:
    sourcevenv/bin/activate

1.3 安装 Flask

pipinstallflask

安装完成后,可以通过以下命令验证是否成功:

python-c"import flask; print(flask.__version__)"

如果正确输出版本号(如2.3.x),说明安装成功。


2. Flask 第一个应用

我们来创建一个最简单的 Flask 应用,只需几行代码。

2.1 创建app.py

fromflaskimportFlask# 创建 Flask 实例app=Flask(__name__)# 定义路由与视图函数@app.route('/')defhello():return'Hello, World!'# 启动应用if__name__=='__main__':app.run(debug=True)

2.2 运行应用

python app.py

终端会输出类似以下内容:

* Serving Flask app 'app' * Debug mode: on * Running on http://127.0.0.1:5000 (Press CTRL+C to quit)

打开浏览器访问http://127.0.0.1:5000,你将看到Hello, World!

2.3 代码解析

  • Flask(__name__):创建一个 Flask 应用实例。__name__是当前模块的名称,Flask 用它来定位模板和静态文件的位置。
  • @app.route('/'):这是一个装饰器,用于将 URL 路径/与下面的函数绑定。当用户访问根路径时,Flask 会调用该函数。
  • return 'Hello, World!':视图函数返回的字符串将作为 HTTP 响应体发送给客户端。
  • app.run(debug=True):启动内置的开发服务器。debug=True开启调试模式,代码修改后服务器会自动重启,并在出错时显示详细的错误页面。

3. Flask 基本概念

在深入开发之前,我们需要理解 Flask 中的几个核心概念。

3.1 应用(Application)

Flask 应用是Flask类的一个实例。它负责接收 HTTP 请求,根据路由规则分发到对应的视图函数,并将响应返回给客户端。

3.2 路由(Route)

路由是将 URL 映射到 Python 函数的机制。Flask 使用@app.route装饰器来定义路由。路由不仅可以匹配静态路径,还可以包含动态部分。

@app.route('/user/<username>')defshow_user(username):returnf'User:{username}'

3.3 视图函数(View Function)

视图函数是处理请求并返回响应的函数。它可以是普通的 Python 函数,其返回值会自动转换为 HTTP 响应对象。

3.4 请求(Request)

当客户端发送请求时,Flask 会创建一个request对象,其中包含了请求的所有信息(如请求头、表单数据、查询参数等)。通过from flask import request导入后即可在视图函数中使用。

3.5 响应(Response)

视图函数的返回值可以是字符串、字典、元组或Response对象。Flask 会自动将其转换为一个标准的 HTTP 响应。

# 返回字符串return'Hello'# 返回状态码return'Not Found',404# 返回字典(自动转为 JSON)return{'key':'value'}

4. Flask 项目结构

随着项目规模增长,良好的项目结构至关重要。这里介绍一种常见的 Flask 项目布局,即使是一个简单应用,也建议遵循这种结构,以便将来扩展。

my_flask_project/ ├── app/ │ ├── __init__.py # 应用工厂 │ ├── routes.py # 路由与视图 │ ├── models.py # 数据模型 │ ├── forms.py # 表单类 │ ├── templates/ # 模板文件 │ └── static/ # 静态文件(CSS, JS, 图片) ├── config.py # 配置文件 ├── run.py # 启动入口 └── requirements.txt # 依赖列表

4.1 使用应用工厂

app/__init__.py中定义一个函数,用于创建应用实例。这样做可以方便地加载不同配置、进行测试。

fromflaskimportFlaskdefcreate_app(config_class=None):app=Flask(__name__)ifconfig_class:app.config.from_object(config_class)# 注册路由fromappimportroutes routes.init_app(app)returnapp

4.2 分离路由

将路由定义放在routes.py中,并通过init_app函数注册到应用上。

# app/routes.pydefinit_app(app):@app.route('/')defindex():return'Hello from structured app!'

4.3 启动文件

run.py作为项目启动入口:

fromappimportcreate_app app=create_app()if__name__=='__main__':app.run(debug=True)

5. Flask 路由详解

路由是 Web 应用的入口。Flask 的路由系统灵活而强大。

5.1 基本路由

@app.route('/')defindex():return'Home'@app.route('/about')defabout():return'About'

5.2 动态路由

在 URL 中使用<variable>来捕获路径中的值。默认类型为string

@app.route('/user/<username>')defprofile(username):returnf'Hello,{username}'

Flask 支持多种转换器:

转换器说明
string默认,匹配除/外的任意字符串
int匹配整数
float匹配浮点数
path匹配包含/的字符串
uuid匹配 UUID 字符串
@app.route('/post/<int:post_id>')defshow_post(post_id):returnf'Post ID:{post_id}'

5.3 HTTP 方法

路由默认只响应GET请求。可以通过methods参数指定支持的 HTTP 方法。

fromflaskimportrequest@app.route('/login',methods=['GET','POST'])deflogin():ifrequest.method=='POST':return'处理登录'else:return'显示登录表单'

5.4 路由构建(URL 反向生成)

使用url_for函数可以根据视图函数名生成 URL,避免硬编码。

fromflaskimporturl_for@app.route('/')defindex():login_url=url_for('login')# 结果为 '/login'returnf'Login at{login_url}'

对于动态路由:

url_for('profile',username='alice')# 结果为 '/user/alice'

6. Flask 视图函数深入

视图函数是应用的核心逻辑所在,理解其返回值与请求处理机制十分重要。

6.1 返回 JSON 数据

在构建 API 时,常需要返回 JSON。Flask 提供了jsonify函数,它能自动设置正确的Content-Type并返回 JSON。

fromflaskimportjsonify@app.route('/api/user')defapi_user():returnjsonify({'name':'Alice','age':30})

6.2 重定向

使用redirect函数可以重定向到其他 URL。

fromflaskimportredirect,url_for@app.route('/old')defold_page():returnredirect(url_for('new_page'))

6.3 中止请求

使用abort函数可以提前终止请求并返回指定的 HTTP 错误码。

fromflaskimportabort@app.route('/secret')defsecret():ifnotuser_authorized():abort(403)# 返回 403 Forbiddenreturn'Secret content'

6.4 请求对象

request对象包含了当前请求的所有信息。常用属性:

fromflaskimportrequest@app.route('/submit',methods=['POST'])defsubmit():# 获取表单数据name=request.form.get('name')# 获取查询参数(GET 参数)page=request.args.get('page',default=1,type=int)# 获取 JSON 数据data=request.get_json()# 获取请求头user_agent=request.headers.get('User-Agent')return'OK'

6.5 会话(Session)

Flask 提供了会话功能,用于在多次请求之间保存用户数据。会话数据默认存储在客户端的加密 cookie 中。

fromflaskimportsession app.secret_key='your-secret-key'# 必须设置,用于签名@app.route('/set')defset_session():session['user']='alice'return'Session set'@app.route('/get')defget_session():user=session.get('user','Guest')returnf'User:{user}'

总结

本篇教程我们完成了以下内容:

  1. 安装 Flask:使用虚拟环境隔离项目,并通过pip安装。
  2. 第一个应用:创建了最简单的“Hello, World!”应用,并解析了各部分的含义。
  3. 基本概念:介绍了应用、路由、视图函数、请求与响应的核心概念。
  4. 项目结构:讲解了如何组织 Flask 项目,并介绍了应用工厂模式。
  5. 路由详解:包括基本路由、动态路由、HTTP 方法、url_for反向生成。
  6. 视图函数深入:涵盖了返回 JSON、重定向、请求对象、会话等常用操作。

这些知识构成了 Flask 开发的基础,下一篇教程中,我们将深入探讨模板渲染表单处理数据库操作,带你构建功能更完整的 Web 应用。

http://www.jsqmd.com/news/561275/

相关文章:

  • DeepSeek-Coder-V2:突破闭源模型在代码智能领域的壁垒
  • 阿里开源CosyVoice2-0.5B:快速部署声音克隆应用,小白友好教程
  • 收藏!小白程序员必看:智能体AI中大型语言模型的隐藏成本与优化策略
  • Realistic Vision V5.1 高分辨率输出对比:512x512 vs 1024x1024的细节差异
  • 虚幻4角色动画进阶:用动画蓝图实现 idle-run-jump 无缝切换(含状态机配置模板)
  • SSHFS挂载Windows目录避坑指南:解决权限乱码和开机自动挂载问题
  • 手把手教你排查PCIe设备异常:从`Malformed TLP`错误看MPS/MRRS配置
  • 通过MobaXterm与TightVNC搭建Windows跨设备远程控制:SSH安全通道实战
  • BepInEx:Unity游戏功能扩展的插件框架解决方案
  • 终极免费方案:3分钟搞定macOS应用更新管理难题
  • 05 从 MLP 到 LeNet:损失函数到底在衡量什么?
  • SpaceX火星移民PPT拆解:从马斯克的39页神作学技术演讲设计
  • 自动驾驶车路协同技术全解析:基于DAIR-V2X数据集的实践指南
  • 四种ADC拓扑结构解析与工程选型指南
  • 从ViT到Swin Transformer:稀疏注意力如何让视觉模型‘看得又快又准’?
  • 文献管理自动化:茉莉花插件如何重构中文科研工作流
  • 从‘重名’到‘同义’:图解Virtual Cache的那些坑与工业级解决方案
  • n8n汉化踩坑全记录:从Docker界面到工作流编辑器的完整中文配置指南
  • 三指拖动:让Windows触控板也能拥有MacBook般的流畅体验
  • 目标检测模型评估:从AP到mAP@0.5:0.95的完整指南(附代码示例)
  • 【2024最硬核AI编译器分析】:为什么Meta/DeepMind工程师正在悄悄替换Triton?Cuvil在H100上实测吞吐提升41%的5大源码级设计真相
  • Namida音乐视频播放器:跨平台体验与深度定制指南
  • HY-Motion 1.0:基于扩散Transformer的文本驱动3D人体运动生成技术详解
  • 5分钟部署EVA-01:基于Qwen2.5-VL的视觉AI,体验炫酷机甲交互界面
  • TypeScript实战:手把手教你实现4种不依赖第三方库的UUID生成器(附完整代码)
  • Git协作开发中的fork、clone与branch实战指南
  • Word转PDF缺失书签导航?三步快速恢复文档结构
  • 5G宏站共建项目避坑指南:从站点勘察到工程预算,手把手教你填对IUV平台上的每一张表
  • 从像素到对象:如何用MMDetection和SAM提升遥感变化检测的实用性?一个灾害评估实战案例
  • 保姆级教程:手把手教你离线安装MPLAB X IDE的MCC插件(附版本匹配避坑指南)