初识 Flask 框架

news2025/5/24 17:52:08

目录

1. Flask 框架概述

1.1 安装 Flask

1.2 创建你的第一个 Flask 应用

1.3 运行 Flask 应用

2. Flask 路由与视图函数

2.1 动态路由

2.2 支持多种 HTTP 请求方法

2.3 使用 Jinja2 模版渲染 HTML

2.5 模版继承与块

3. Flask 表单处理与用户输入

3.1 安装 Flask-WTF

3.2 创建一个简单的表格

3.3 表单验证

4. Flask 的项目结构与部署

4.1项目结构

4.2 部署 Flask 应用


1. Flask 框架概述

Flask 作为一个微框架,强调简单性和灵活性。它依赖于两个重要的 Python 库来提供核心功能:

  • Werkzeug:这是 Flask 的底层库,提供了 WSGI 接口、HTTP 请求和响应处理、路由等核心功能,。
  • Jinja2:一个功能强大的模板引擎,用于动态生成 HTML 页面。

Flask 的设计目的是让开发者能够快速开发应用,并提供了灵活的方式进行扩展。如果你不需要复杂的功能,Flask 的核心本身已经足够满足需求。如果你需要更多高级特性,可以通过 Flask 的扩展库进行补充。

1.1 安装 Flask

安装 Flask 非常简单,只需使用 Python 的包管理工具 pip 即可:

pip install flask

安装完成后,你可以通过创建一个简单的 Flask 应用来验证是否安装成功。

1.2 创建你的第一个 Flask 应用

Flask 的应用结构非常简单,只需创建一个 Python 文件,并通过 Flask()类来实例化应用对象。以下是一个最简单的 Flask 应用示例:

from flask import Flask
# 创建 Flask 应用实例
app =Flask( name )
# 定义路由和视图函数
@app.route('/')
def hello world():
    return 'Hello, world!"
# 启动应用
if name=='main ':
app.run(debug=True)

代码解析:

  • Flask( name ):创建 Flask 应用实例,_name 参数用于 Flask 了解当前模块的名称,通2常我们使用这个参数来帮助 Flask 在不同模块间进行配置。
  • @app.route('/'):定义路由和视图函数的映射。'/'是根路径,当用户访问根 URL 时,Flask会调用 hello world()函数。
  • return'Hello,world!':视图函数返回一个简单的字符串响应,Flask 会将其作为 HTTP 响应返回给客户端。
  • app.run(debug=True):启动Flask开发服务器,debug=True 表示启用调试模式,这样可以在开发过程中自动重载应用,并在发生错误时显示详细信息。

1.3 运行 Flask 应用

保存上述代码为 app.py,然后在命令行中运行:

python app.py

这时 Flask 会启动一个开发服务器,默认会监听127.0.0.1:5000。打开浏览器,访问http://127.0.0.1:5000/,你会看到“Hello,World!”的页面。

2. Flask 路由与视图函数

Flask 的核心之一就是路由系统,它将用户访问的 URL 与对应的视图函数相连接。Flask 通过装饰器@app.route()来定义路由,而视图函数则负责处理用户的请求并返回响应。

2.1 动态路由

Flask 支持动态路由参数,可以通过 URL 中的动态部分来获取数据。以下是一个示例:

@app.route('/greet/<name>')
def greet(name):
    return f'Hello, {name}!"

代码解析:

  • <name>:这是一个动态路由参数,Flask 会提取 URL 中的 name 部分并将其传递给视图函数。
  • 当用户访问/greet/John 时,name 的值将为 John,返回的响应为 Hello,John!。

2.2 支持多种 HTTP 请求方法

Flask 不仅支持 GET 请求,还支持其他常见的 HTTP 请求方法,如 POST、PUT、DELETE等。你可以通过methods 参数来指定允许的请求方法:

@app.route('/submit', methods=['PosT'])
def submit():
    return 'Form submitted successfully!'

代码解析:

  • methods=['POST']:只允许 POST 请求访问此路由。如果用户通过 GET 请求访问,Flask 会返回405 Method Not Allowed 错误。

2.3 使用 Jinja2 模版渲染 HTML

Flask 结合 Jinja2 模板引擎来动态生成 HTML 页面。你可以将 HTML 文件与 Python 代码分离,保持应用结构清晰。在 Flask 中,模板文件默认存放在 templates 文件夹中
假设我们有一个名为 greet.html 的模板文件,内容如下:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Flask Example</title>
</head>
<body>
    <h1>Hello,{{ name }}!</h1>
</body>
</html>

在 Flask 应用中,我们可以通过 render_template 兩数渲染模板并传递动态数据:

from flask import render template

@app.route('/greet/<name>')
def greet(name):
    return render template('greet.html',name=name)

代码解析:

  • render template('greet.html', name=name): Flask 会加载 greet.html 模板,并将 name的值传递给模板。模板中的{{ name }}会被替换为传入的值。

2.5 模版继承与块

Flask 文持模板继承和块(Block)功能,这对于构建复杂页面非常有用。你可以在基础模板中定义通用的布局结构,在子模板中覆盖特定的部分。

基础模板 base.html:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>{% block title %}My website% endblock %}</title>
</head>
<body>
    <header>
        <h1>Welcome to My website</h1>
    </header>

    <div>
        {% block content %}{% endblock %}
    </div>
    <footer>
        <p>&copy; 2025 My Website</p>\
    </footer>
</body>
</html>

子模板 index.html:

{% extends 'base.html'%}

{% block title %}Home{% endblock %}

{% block content %}
    <h2>Welcome to the homepage!</h2>
{% endblock %}

代码解析:

  • {% extends 'base.html’%}:子模板继承了 base.htm1 模板。
  • {% block title %}Home{% endblock %}:覆盖父模板中的 title 块。
  • {% block content %}:定义页面的主要内容区域。

3. Flask 表单处理与用户输入

Flask 可以通过表单来获取用户输入,常见的做法是结合 FlaskK-WTF 扩展来简化表单处理和验证。
Flask-WTF为Flask 提供了一个表单类,你可以在表单类中定义字段和验证规则。

3.1 安装 Flask-WTF

pip install flask-wtf

3.2 创建一个简单的表格

from flask import Flask, render template, request
from flask wtf import FlaskForm
from wtforms import stringField
from wtforms.validators import DataRequired

app = Flask( __name__)
app.secret key='s3cr3t'

class NameForm(FlaskForm):
    name =stringField('Name',validators=[DataRequired()])

@app.route('/', methods=['GET','POST'])
def index():
    form =NameForm()
    if form.validate on submit():
        return f'Hello, {form.name.data}!'
    return render template("index.html',form=form)

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

代码解析:

  • FlaskForm:继承自 FlaskForm 类,定义表单字段。
  • StringField('Name',validators=[DataRequired()]):定义了一个文本输入字段,并且通2过 DataRequired()验证器确保字段不能为空。
  • form.validate on submit():检查表单是否通过验证并被提交。

index.htm1 模板:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Flask Form</title>
</head>
<body>
    <h1>Enter your name:</h1>
    <form method="PosT">
        {{ form.csrf token }}
        <label for="name">Name:</label>
        {{ form.name()}}<br><br>   
        <button type="submit">Submit</button>
    </form>

    {% if form.name.data %}
        <h2>Hello,{{ form.name.data }}!</h2)
    {% endif %}
</body>
</html>

代码解析:

  • {{ form.csrf_token }}:FlasK-WTF会自动生成并验证 CSRF token,以防止跨站请求伪造攻击。
  • {{ form.name()}}:这是通过 Jinja2 模板渲染 Nameform 表单的字段。form.name()会生成对应的 HTML 标签。
  • {% if form.name.data %}:如果用户提交了表单并且 name 字段不为空,则显示欢迎信息。

3.3 表单验证

Flask 表单处理的强大之处在于它的验证机制。通过 wtforms,你可以非常方便地为表单字段添加各种验证规则。比如,除了 DataRequired(),你还可以使用:

  • Length(min=2,max=50):验证输入的长度。
  • Emai1():验证输入是否是有效的邮箱地址。
  • EqualTo('password'):验证两个字段的值是否相等

4. Flask 的项目结构与部署

4.1项目结构

随着应用的复杂度增加,Flask应用的结构通常会发生变化。。一个典型的 Flask 项目结构如下:

/my_flask app
    /app
        /templates
            index.html
        /static
            /css
            /js
        __init__.py
        routes .py
        forms.py
    run.py
  •  /templates:存放所有 HTML 模板文件。
  • /static:存放静态文件(如 CSS、JS、图片等)。
  • __init__·py:初始化 Flask 应用。
  • routes.py:定义所有路由和视图函数。
  • forms.py:定义表单类。

4.2 部署 Flask 应用

Flask 应用的开发环境通常使用 Flask run 启动,但在生产环境中,我们需要通过更强大的 web 服务器进行部署,常见的有:

  • Gunicorn:一个Python WSGI HTTP 服务器,常用于生产环境部署,
  • Nginx:作为反向代理,前端处理静态文件请求,转发动态请求到Flask 应用。部署时,可以通过以下命令启动 Flask 应用:
gunicorn -w 4 run:app

这将启动一个4 工作线程的 Gunicorn 服务器,run 是指向 Flask 应用实例的模块。

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

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

相关文章

vivado fpga程序固化

一般下载到fpga上的程序在掉电之后就会丢失&#xff0c;如果想要掉电之后程序不丢失&#xff0c;就需要将比特流文件固化到板载的flash上。 以下以我的7a100t开发板为例&#xff0c;介绍程序固化的流程 点击OK就可以下载了。 一个奇怪的问题 有一次我的一个工程固化之后&…

OpenCV CUDA模块图像特征检测与描述------图像中快速检测特征点类cv::cuda::FastFeatureDetector

操作系统&#xff1a;ubuntu22.04 OpenCV版本&#xff1a;OpenCV4.9 IDE:Visual Studio Code 编程语言&#xff1a;C11 算法描述 cv::cuda::FastFeatureDetector 是 OpenCV 的 CUDA 加速模块中的一部分&#xff0c;用于在图像中快速检测特征点。FAST&#xff08;Features fro…

SpringMVC(结合源码浅析工作流程)

SpringMVC 概念 Spring MVC 是基于前端控制器&#xff08;Front Controller&#xff09;设计模式的 Web 框架&#xff0c;在 Web 应用中指一个统一的入口&#xff0c;用来接收所有客户端请求&#xff0c;并统一进行分发、处理。在 SpringMVC 中&#xff0c;前端控制器就是 Di…

学习STC51单片机13(芯片为STC89C52RC)

我去&#xff0c;兄弟们我们今天来学习一个牛逼 的硬件&#xff0c;它叫超声波测距模块HC—SR04 硬件&#xff1a;HC—SR04 哎&#xff0c;想当初最想要玩的就是这个模块&#xff0c;科技感十足&#xff0c;那现在就让我们玩玩吧 超声波测距传感器 原理就是说需要给Trig 10u…

Claude 4 系列 Opus 4 与 Sonnet 4正式发布:Claude 4新特性都有哪些?

随着 Claude 4 系列&#xff08;Opus 4 与 Sonnet 4&#xff09;的正式发布&#xff0c;Anthropic 把自家大模型从“会聊天”推进到“能当自主代理”──不仅推理更深、上下文更长&#xff0c;还内置代码执行、多模态理解、工具调用等一揽子全新能力&#xff1b;同时&#xff0…

深度“求索”:DeepSeek+Dify构建个人知识库

目录 前言 环境部署 安装Docker 安装Dify 配置Dify 部署知识库 创建应用 前言 在当今数字化信息爆炸的时代&#xff0c;数据隐私和个性化知识管理成为企业和个人关注的焦点。Dify&#xff0c;作为一款备受瞩目的开源 AI 应用开发平台&#xff0c;为用户提供了完整的私有…

基于R语言的空间异质性数据分析技术

在自然和社会科学领域&#xff0c;存在大量与地理或空间相关的数据&#xff0c;这些数据通常具有显著的空间异质性。传统的统计学方法在处理这类数据时往往力不从心。基于R语言的一系列空间异质性数据分析方法&#xff0c;如地理加权回归&#xff08;GWR&#xff09;、地理加权…

网络学习-TCP协议(七)

一、TCP协议 TCP&#xff08;Transmission Control Protocol&#xff0c;传输控制协议&#xff09;是一种面向连接的、可靠的、基于字节流的传输层通信协议。 1、三次握手 客户端&#xff1a; 1、先发起连接&#xff0c;发送SYN置1&#xff0c;seqnum12345(随机值)----半连接…

基于微信小程序的高校校园微活动管理系统设计与实现(源码+定制+开发)高校微信小程序校园活动发布与互动平台开发 面向大学生群体的校园活动移动平台设计与实现

博主介绍&#xff1a; ✌我是阿龙&#xff0c;一名专注于Java技术领域的程序员&#xff0c;全网拥有10W粉丝。作为CSDN特邀作者、博客专家、新星计划导师&#xff0c;我在计算机毕业设计开发方面积累了丰富的经验。同时&#xff0c;我也是掘金、华为云、阿里云、InfoQ等平台…

云计算与大数据进阶 | 27、存储系统如何突破容量天花板?可扩展架构的核心技术与实践—— 分布式、弹性扩展、高可用的底层逻辑(上)

数据中心里&#xff0c;存储系统是至关重要的组成部分。由于相关硬件组件与存储操作系统的多样性和复杂性&#xff0c;如何在保证存储稳定、安全、可靠的同时&#xff0c;实现灵活扩展和自服务&#xff0c;一直是困扰数据中心全面云化的难题。 简单来说&#xff0c;现在的难题…

IvorySQL-WASM:免安装的数据库探索之旅

简介 为了降低社区用户的使用门槛&#xff0c;提升使用体验&#xff0c;IvorySQL 社区特别推出了 IvorySQL-WASM 项目&#xff0c;帮助用户快速在线 Demo。 IvorySQL-WASM 基于开源的 Postgres-WASM 框架开发。它允许用户直接在网页浏览器中体验 IvorySQL&#xff0c;无需本地…

飞牛fnNAS远程映射盘符

目录 一、NAS、PC端配置Zerotier 二、使用网上邻居 三、使用WebDAV 1.开启WebDAV 2.PC上安装RaiDrive并设置 如果能将NAS作为本机一个盘符来使用,一定会令我非常方便。如果是本地,可以很方便实现。 将飞牛NAS映射为本地盘符,常用两种方式,一种是网上邻居,另一种是We…

Java设计模式:探索编程背后的哲学

设计模式是软件开发中的一种常见方法&#xff0c;它为常见问题提供了解决方案。在Java世界中&#xff0c;设计模式的应用尤为广泛。本文将深入探讨Java设计模式的起源、分类和实际应用&#xff0c;帮助读者更好地理解和应用这些模式。设计模式不仅是编程的技术&#xff0c;更是…

Docker部署OpenSearch集群

OpenSearch 简介 OpenSearch 是一款开源的搜索与分析引擎&#xff0c;最初由亚马逊 AWS 开发&#xff0c;于 2021 年 9 月将其移交至 Linux 基金会旗下的 OpenSearch 软件基金会&#xff0c;此后实现了社区主导的治理模式。其具有高性能、可扩展性强、兼容性强等优点&#xff…

【AS32X601驱动系列教程】PLIC_中断应用详解

平台中断控制器&#xff08;Platform Level Interrupt Controller&#xff0c;PLIC&#xff09;是国科安芯AS32系列MCU芯片的中断控制器&#xff0c;主要对中断源进行采样&#xff0c;优先级仲裁和分发。各外设中断统一连到PLIC&#xff0c;PLIC统一管理并输出中断请求到内核。…

python学习打卡day34

DAY 34 GPU训练及类的call方法 知识点回归&#xff1a; CPU性能的查看&#xff1a;看架构代际、核心数、线程数GPU性能的查看&#xff1a;看显存、看级别、看架构代际GPU训练的方法&#xff1a;数据和模型移动到GPU device上类的call方法&#xff1a;为什么定义前向传播时可以直…

leetcode-快慢指针系列

开胃小菜 141. 环形链表 给你一个链表的头节点 head &#xff0c;判断链表中是否有环。 如果链表中有某个节点&#xff0c;可以通过连续跟踪 next 指针再次到达&#xff0c;则链表中存在环。 为了表示给定链表中的环&#xff0c;评测系统内部使用整数 pos 来表示链表尾连接到链…

JAVA05基本数据类型和包装类的转换,转换成其他数据类型,包装类与字符串的转换+学生类的定义实例

1.基本数据类型和包装类的转换 下面是一个自动手动的例题 2.将包装类转换成其他类型 3. 将数据类型转换成字符串 将字符串转换成数据类型 以下是一个例题 学生类的例题

Python打卡训练营学习记录Day34

知识点回归&#xff1a; CPU性能的查看&#xff1a;看架构代际、核心数、线程数 GPU性能的查看&#xff1a;看显存、看级别、看架构代际 GPU训练的方法&#xff1a;数据和模型移动到GPU device上 类的call方法&#xff1a;为什么定义前向传播时可以直接写作self.fc1(x) CPU性…

动手学习深度学习V1.1 chapter2 (2.1-2.2)

chapter2&#xff1a;深度学习基础 区分问题&#xff1a;回归问题还是分类问题&#xff1f; 输出结果是不明确的连续值的时候就是回归问题&#xff0c;比如房价预测&#xff0c;销售额预测等。 输出结果是明确几个离散值的时候就是分类问题&#xff0c;比如字符识别&#xf…