python web flask专题-Flask入门指南:从安装到核心功能详解

news2025/7/18 21:27:23

Flask入门指南:从安装到核心功能详解

Flask作为Python最流行的轻量级Web框架之一,以其简洁灵活的特性广受开发者喜爱。本文将带你从零开始学习Flask,涵盖安装配置、项目结构、应用实例、路由系统以及请求响应处理等核心知识点。
在这里插入图片描述

1. Flask安装与项目结构

1.1 安装Flask

在开始之前,请确保已安装Python(建议3.6+版本)。通过pip安装Flask:

pip install flask

验证安装是否成功:

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

1.2 最小Flask应用

创建一个最简单的Flask应用app.py

from flask import Flask

app = Flask(__name__)

@app.route('/')
def hello():
    return 'Hello, World!'

if __name__ == '__main__':
    app.run(debug=True)

运行应用:

python app.py

访问http://127.0.0.1:5000即可看到"Hello, World!"。

代码解释

  • Flask(__name__)创建应用实例,__name__确定应用根目录
  • @app.route('/')装饰器定义路由
  • app.run(debug=True)启动开发服务器,debug=True启用调试模式

1.3 基本项目结构

随着项目增长,推荐的组织结构:

/flask_project
    /app
        /static       # 静态文件(CSS, JS, 图片)
        /templates    # 模板文件(HTML)
        __init__.py   # 应用工厂函数
        routes.py     # 路由定义
        models.py     # 数据模型
    config.py         # 配置文件
    requirements.txt  # 依赖列表

2. Flask应用实例配置详解

2.1 应用工厂模式

使用工厂函数创建应用更灵活:

# app/__init__.py
from flask import Flask
from . import routes

def create_app(config_filename=None):
    app = Flask(__name__)
    
    # 加载配置
    if config_filename:
        app.config.from_pyfile(config_filename)
    else:
        app.config.from_mapping(
            SECRET_KEY='dev',
            DATABASE='sqlite:///app.db',
        )
    
    # 注册蓝图或路由
    app.register_blueprint(routes.bp)
    
    return app

2.2 常用配置项

Flask配置可以通过多种方式设置:

# 直接设置
app.config['SECRET_KEY'] = 'your-secret-key'

# 从对象加载
class Config:
    SECRET_KEY = 'your-secret-key'
    DEBUG = True
app.config.from_object(Config)

# 从文件加载
app.config.from_pyfile('config.py')

# 常用配置项:
# DEBUG - 是否启用调试模式
# TESTING - 是否启用测试模式
# SECRET_KEY - 加密会话的密钥
# SESSION_COOKIE_NAME - 会话cookie名称
# PERMANENT_SESSION_LIFETIME - 持久会话有效期

3. 路由定义详解

3.1 基本路由

@app.route('/')
def index():
    return '首页'

@app.route('/about')
def about():
    return '关于我们'

3.2 动态路由

@app.route('/user/<username>')
def show_user(username):
    return f'用户: {username}'

@app.route('/post/<int:post_id>')
def show_post(post_id):
    return f'文章ID: {post_id}'

路由转换器类型

  • string: (默认)接受任何不包含斜线的文本
  • int: 接受正整数
  • float: 接受正浮点数
  • path: 类似string但包含斜线
  • uuid: 接受UUID字符串

3.3 HTTP方法

@app.route('/login', methods=['GET', 'POST'])
def login():
    if request.method == 'POST':
        return do_login()
    else:
        return show_login_form()

3.4 URL生成

使用url_for()生成URL:

from flask import url_for

@app.route('/')
def index():
    print(url_for('login'))  # 输出: /login
    print(url_for('show_user', username='john'))  # 输出: /user/john
    return '首页'

4. 请求与响应处理

4.1 请求对象(Request)

Flask自动将请求数据封装在request对象中:

from flask import request

@app.route('/search')
def search():
    query = request.args.get('q', '')  # 获取查询参数
    return f'搜索: {query}'

@app.route('/submit', methods=['POST'])
def submit():
    username = request.form['username']  # 获取表单数据
    file = request.files['avatar']      # 获取上传文件
    return f'用户名: {username}'

常用request属性

  • args: GET请求参数 (查询字符串)
  • form: POST表单数据
  • files: 上传的文件
  • headers: 请求头
  • method: 请求方法
  • json: 解析后的JSON数据

4.2 响应对象(Response)

视图函数可以返回多种类型的响应:

from flask import make_response, jsonify, redirect

# 返回字符串
@app.route('/text')
def text_response():
    return '纯文本响应'

# 返回JSON
@app.route('/json')
def json_response():
    return jsonify({'status': 'success', 'data': [1, 2, 3]})

# 自定义响应
@app.route('/custom')
def custom_response():
    response = make_response('自定义响应')
    response.headers['X-Custom-Header'] = 'Value'
    response.status_code = 201
    return response

# 重定向
@app.route('/old')
def old_route():
    return redirect('/new')

4.3 处理文件上传

from werkzeug.utils import secure_filename

@app.route('/upload', methods=['POST'])
def upload_file():
    if 'file' not in request.files:
        return '没有文件部分'
    
    file = request.files['file']
    if file.filename == '':
        return '没有选择文件'
    
    if file and allowed_file(file.filename):
        filename = secure_filename(file.filename)
        file.save(os.path.join(app.config['UPLOAD_FOLDER'], filename))
        return '文件上传成功'

4.4 处理Cookie

@app.route('/set-cookie')
def set_cookie():
    resp = make_response('设置Cookie')
    resp.set_cookie('username', 'john', max_age=3600)
    return resp

@app.route('/get-cookie')
def get_cookie():
    username = request.cookies.get('username')
    return f'用户名: {username}'

5. 总结

通过本文的学习,你应该已经掌握了Flask的核心基础知识:

  1. 安装与项目结构

    • 使用pip安装Flask
    • 合理组织项目目录结构
    • 理解最小Flask应用的构成
  2. 应用实例配置

    • 使用工厂模式创建应用
    • 掌握多种配置方式
    • 了解常用配置项
  3. 路由系统

    • 定义静态和动态路由
    • 处理不同的HTTP方法
    • 使用url_for()生成URL
  4. 请求与响应

    • 访问请求数据(request对象)
    • 构建各种类型的响应
    • 处理文件上传和Cookie

Flask的简洁性使其成为学习Web开发的理想框架,但其扩展性又能满足复杂应用的需求。建议在掌握这些基础知识后,继续学习以下内容:

  • 模板渲染(Jinja2)
  • 数据库集成(Flask-SQLAlchemy)
  • 用户认证(Flask-Login)
  • 使用蓝图(Blueprint)组织大型应用
  • 部署Flask应用到生产环境

记住,最好的学习方式是实践 - 尝试用Flask构建一个小型项目,如博客系统或待办事项应用,将帮助你巩固这些概念。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2387441.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【HW系列】—web组件漏洞(Strtus2和Apache Log4j2)

本文仅用于技术研究&#xff0c;禁止用于非法用途。 文章目录 Struts2Struts2 框架介绍Struts2 历史漏洞汇总&#xff08;表格&#xff09;Struts2-045 漏洞详解 Log4j2Log4j2 框架介绍Log4j2 漏洞原理1. JNDI 注入2. 利用过程 Log4j2 历史漏洞JNDILDAP 反弹 Shell 流程 Strut…

机器学习知识体系:从“找规律”到“做决策”的全过程解析

你可能听说过“机器学习”&#xff0c;觉得它很神秘&#xff0c;像是让电脑自己学会做事。其实&#xff0c;机器学习的本质很简单&#xff1a;通过数据来自动建立规则&#xff0c;从而完成预测或决策任务。 这篇文章将用通俗的语言为你梳理机器学习的知识体系&#xff0c;帮助…

STM32之FreeRTOS移植(重点)

RTOS的基本概念 实时操作系统&#xff08;Real Time Operating System&#xff09;的简称就叫做RTOS&#xff0c;是指具有实时性、能支持实时控制系统工作的操作系统&#xff0c;RTOS的首要任务就是调度所有可以利用的资源来完成实时控制任务的工作&#xff0c;其次才是提高工…

R语言科研编程-标准偏差柱状图

生成随机数据 在R中&#xff0c;可以使用rnorm()生成正态分布的随机数据&#xff0c;并模拟分组数据。以下代码生成3组&#xff08;A、B、C&#xff09;随机数据&#xff0c;每组包含10个样本&#xff1a; set.seed(123) # 确保可重复性 group_A <- rnorm(10, mean50, sd…

OpenGL Chan视频学习-11 Uniforms in OpenGL

bilibili视频链接&#xff1a; 【最好的OpenGL教程之一】https://www.bilibili.com/video/BV1MJ411u7Bc?p5&vd_source44b77bde056381262ee55e448b9b1973 函数网站&#xff1a; docs.gl 说明&#xff1a; 1.之后就不再单独整理网站具体函数了&#xff0c;网站直接翻译…

GitLab 从 17.10 到 18.0.1 的升级指南

本文分享从 GitLab 中文本 17.10.0 升级到 18.0.1 的完整过程。 升级前提 查看当前安装实例的版本。有多种方式可以查看&#xff1a; 方式一&#xff1a; /help页面 可以直接在 /help页面查看当前实例的版本。以极狐GitLab SaaS 为例&#xff0c;在浏览器中输入 https://ji…

产业集群间的专利合作关系

需要准备的文件&#xff1a; 全国的专利表目标集群间的企业名单 根据专利的共同申请人&#xff0c;判断这两家企业之间存在专利合作关系。 利用1_filter_patent.py&#xff0c;从全国的3000多万条专利信息中&#xff0c;筛选出与目标集群企业相关的专利。 只要专利的申请人包…

KT6368A通过蓝牙芯片获取手机时间详细说明,对应串口指令举例

一、功能简介 KT6368A双模蓝牙芯片支持连接手机&#xff0c;获取手机的日期、时间信息&#xff0c;可以同步RTC时钟 1、无需安装任何app&#xff0c;直接使用系统蓝牙即可实现 2、同时它不影响音频蓝牙&#xff0c;还支持一些简单的AT指令进行操作 3、实现的方式&#xff1…

计算机网络实验课(二)——抓取网络数据包,并实现根据条件过滤抓取的以太网帧,分析帧结构

文章目录 一、添加控件二、代码分析2.1 代码2.2 控件初始化2.3 打开和关闭设备2.4 开始和结束捕获2.5 设置捕获条件2.6 捕获数据包 三、运行程序四、结果分析 提要&#xff1a;如果你通过vs打开.sln文件&#xff0c;然后代码界面或者前端界面都没找到&#xff0c;视图里面也没找…

78. Subsets和90. Subsets II

目录 78.子集 方法一、迭代法实现子集枚举 方法二、递归法实现子集枚举 方法三、根据子集元素个数分情况收集 方法四、直接回溯法 90.子集二 方法一、迭代法实现子集枚举 方法二、递归法实现子集枚举 方法三、根据子集元素个数分情况收集 方法四、直接回溯法 78.子集…

ElasticSearch整合SpringBoot

ElasticSearch 整合SpringBoot ES官方提供了各种不同语言的客户端。用来操作ES。这些客户端的本质就是组装DSL语句&#xff0c;通过HTTP请求发送给ES。 设计索引库 跟据数据库的表结构进行ES索引库的创建时。如果字段需要进行倒排索引的时候请为它指定分词器。如果该字段不是…

2025上半年软考高级系统架构设计师经验分享

笔者背景 笔者在成都工作近7年&#xff0c; 一直担任研发大头兵&#xff0c;平日工作主要涵盖应用开发&#xff08;Java&#xff09;与数仓开发&#xff0c;对主流数据库、框架等均有涉猎&#xff0c;但谈不上精通。 最近有一些职业上的想法&#xff0c;了解到软考有那么一丁点…

uni-app学习笔记十二-vue3中创建组件

通过组件&#xff0c;可以很方便地实现页面复用&#xff0c;减少重复页面的创建&#xff0c;减少重复代码。一个页面可以引入多个组件。下面介绍在HBuilder X中创建组件的方法&#xff1a; 一.组件的创建 1.选中项目&#xff0c;右键-->新建目录(文件夹)&#xff0c;并将文…

一键启动多个 Chrome 实例并自动清理的 Bash 脚本分享!

目录 一、&#x1f4e6; 脚本功能概览 二、&#x1f4dc; 脚本代码一览 三、&#x1f50d; 脚本功能说明 &#xff08;一&#xff09;✅ 支持批量启动多个 Chrome 实例 &#xff08;二&#xff09;✅ 每个实例使用独立用户数据目录 &#xff08;三&#xff09;✅ 启动后自…

4 月 62100 款 App 被谷歌下架!环比增长 28%

大家好&#xff0c;我是牢鹅&#xff01;上周刚刚结束的 2025 年 Google I/O 开发者大会&#xff0c; Google Play 带来了一系列的更新&#xff0c;主要围绕提升优质 App 的"发现"、"互动"和"收入"三大核心内容。 这或许正是谷歌生态的一个侧影…

mediapipe标注视频姿态关键点(基础版加进阶版)

前言 手语视频流的识别有两种大的分类&#xff0c;一种是直接将视频输入进网络&#xff0c;一种是识别了关键点之后再进入网络。所以这篇文章我就要来讲讲如何用mediapipe对手语视频进行关键点标注。 代码 需要直接使用代码的&#xff0c;我就放这里了。环境自己配置一下吧&…

PCtoLCD2002如何制作6*8字符

如何不把“等比缩放”前的打勾取消&#xff0c;则无法修改为对应英文字符为6*8。 取消之后就可以更改了&#xff01;

SmartPlayer与VLC播放RTMP:深度对比分析延迟、稳定性与功能

随着音视频直播技术的发展&#xff0c;RTMP&#xff08;实时消息传输协议&#xff09;成为了广泛应用于实时直播、在线教育、视频会议等领域的重要协议。为了确保优质的观看体验&#xff0c;RTMP播放器的选择至关重要。大牛直播SDK的SmartPlayer和VLC都是在行业中广受欢迎的播放…

Qt QPaintEvent绘图事件painter使用指南

绘制需在paintEvent函数中实现 用图片形象理解 如果加了刷子再用笔就相当于用笔画过的区域用刷子走 防雷达&#xff1a; 源文件 #include "widget.h" #include "ui_widget.h" #include <QDebug> #include <QPainter> Widget::Widget(QWidget…

伪创新-《软件方法》全流程引领AI-第1章 04

《软件方法》全流程引领AI-第1章 ABCD工作流-01 对PlantUML们的评价-《软件方法》全流程引领AI-第1章 02 AI辅助的建模步骤-《软件方法》全流程引领AI-第1章 03 第1章 ABCD工作流 1.5 警惕和揭秘伪创新 初中数学里要学习全等三角形、相似三角形、SSS、SAS……&#xff0c;到…