【100天精通Python】Day49:Python Web编程_Web框架,Flask框架从安装到使用

2023-11-08

目录

1 Web 框架

2 python 中常用的web框架

3 Flask 框架的使用

3.1 Flask框架安装

3.2 第一个Flask程序

3.3 路由

3.3.1 基本路由

3.3.2 动态路由

3.3.3 HTTP 方法

3.3.4 多个路由绑定到一个视图函数

3.3.5 访问URL 参数的路由

3.3.6 带默认值的动态路由

3.3.7 带不同数据类型的动态路由

3.4 静态文件

3.5 模版


1 Web 框架

        Web 框架(Web Framework)是一种软件工具集,旨在简化和加速 Web 应用程序的开发过程。它提供了一组预先设计好的模块、函数、类和工具,帮助开发者更轻松地构建和维护功能丰富的 Web 应用程序。通过使用 Web 框架,开发者可以避免从头开始编写大量的重复性代码,从而集中精力处理业务逻辑和应用程序的核心功能。

Web 框架的功能如下:

  1. 路由和 URL 处理: Web 框架通常提供路由功能,允许开发者将不同的 URL 映射到相应的处理函数或视图上。这使得 URL 结构更加清晰,能够轻松处理不同的请求。

  2. 模板引擎: 模板引擎允许开发者将 HTML 和动态数据结合起来,以生成动态的 Web 页面。它们通常提供条件语句、循环、变量替换等功能,帮助开发者有效地生成页面内容。

  3. 数据库交互: Web 框架通常提供数据库抽象层,简化了与数据库的交互。这使开发者能够更轻松地执行数据库查询、插入、更新和删除操作。

  4. 表单处理: Web 应用程序中经常需要处理用户提交的表单数据。Web 框架通常提供机制来验证表单数据、处理提交并生成响应。

  5. 会话管理: 许多 Web 应用程序需要跟踪用户的会话状态。Web 框架通常提供会话管理功能,以便开发者可以方便地管理用户会话和状态。

  6. 促进代码重用

2 python 中常用的web框架

        在Python中,有很多常用的Web框架可供选择。以下是一些常见的Python Web框架:

1. Flask:Flask是一个微型的、灵活的Web框架,它具有简洁的语法和强大的扩展能力。它非常适合构建小型的、轻量级的应用程序。

2. Django:Django是一个全功能的Web框架,它提供了许多开箱即用的功能,如数据库ORM、用户认证、缓存等。Django的设计理念是“松散耦合”的组件,使得开发过程更高效。

3. Pyramid:Pyramid是一个轻量级的Web框架,它注重灵活性和可扩展性。它使用了一种类似于插件的机制,使得开发者可以选择性地增加或删除框架的功能。

4. Bottle:Bottle是一个小巧且容易上手的Web框架,它具有最少的依赖关系,并且只有一个单独的源文件。Bottle非常适合构建小型的、快速的应用程序。

5. Tornado:Tornado是一个高性能的Web框架,它采用了非阻塞式I/O和事件驱动的方式来处理请求。Tornado适合处理高并发的情况,例如聊天应用程序和实时数据推送。

3 Flask 框架的使用

3.1 Flask框架安装

        Flask 依赖两个外部库:Werkzeug 和 Jinja2。Werkzeug是一个WSGI工具集,Jinja2 负责渲染模板。本文以在annconda创建的虚拟环境下安装,如下命令:

pip install flask

如下 

(venv) PS D:\python365> pip install flask
Collecting flask
  Downloading flask-2.3.3-py3-none-any.whl (96 kB)
     ---------------------------------------- 96.1/96.1 kB 365.4 kB/s eta 0:00:00
Collecting importlib-metadata>=3.6.0
  Downloading importlib_metadata-6.8.0-py3-none-any.whl (22 kB)
Requirement already satisfied: Jinja2>=3.1.2 in d:\python365\venv\lib\site-packages (from flask) (3.1.2)
Collecting colorama
  Downloading colorama-0.4.6-py2.py3-none-any.whl (25 kB)
Requirement already satisfied: zipp>=0.5 in d:\python365\venv\lib\site-packages (from importlib-metadata>=3.6.0->flask) (3.16.2)
Requirement already satisfied: MarkupSafe>=2.0 in d:\python365\venv\lib\site-packages (from Jinja2>=3.1.2->flask) (2.1.3)
Installing collected packages: Werkzeug, itsdangerous, importlib-metadata, colorama, blinker, click, flask
Successfully installed Werkzeug-2.3.7 blinker-1.6.2 click-8.1.7 colorama-0.4.6 flask-2.3.3 importlib-metadata-6.8.0 itsdangerous-2.1.2

[notice] A new release of pip available: 22.3.1 -> 23.2.1
[notice] To update, run: python.exe -m pip install --upgrade pip
(venv) PS D:\python365>

3.2 第一个Flask程序

安装完成后,编写第一个Flask程序。下面是一个简单的 Flask 程序示例,它创建一个最基本的 Web 应用,并在访问特定 URL 时返回 "Hello, Flask!" 的消息:

from flask import Flask

# 创建 Flask 应用实例
app = Flask(__name__)

# 定义路由和视图函数
@app.route('/')
def hello():
    return "Hello, Flask!"

# 如果这个文件是作为主程序运行,则执行下面的代码
if __name__ == '__main__':
    app.run(debug=True)

输出如下:

e79209d5762a41fdab5d3537d54c6623.png

在浏览器输入网址:http://127.0.0.1:5000,如下:

911b746ab006476cb35b177f9357c22b.png

 以上代码是使用Python的Flask框架创建一个简单的Web应用。

        首先,需要导入Flask库。然后,创建一个Flask应用实例,以当前模块的名称作为参数,即 ​__name__​。

        接下来,使用装饰器 ​@app.route('/')​定义路由,即指定URL路径。在这个例子中,根路径'/'表示应用程序的默认页面。

        然后,定义一个视图函数 ​hello()​,它会在用户访问根路径时被调用。这个函数返回一个字符串"Hello, Flask!",作为响应给用户。

        最后,通过 ​app.run()​方法运行应用程序,开启一个本地服务器,监听HTTP请求并返回相应的结果。设置 ​debug=True​可以启用调试模式。

        若你运行这个文件作为主程序,将执行 ​app.run()​语句,启动应用程序,并在终端输出调试信息。

3.3 路由

      在 Flask 中,路由用于将特定的 URL 路径与相应的视图函数关联起来。路由决定了当用户访问不同的 URL 时,应该执行哪个视图函数来处理请求。使用装饰器 @app.route() 可以定义路由。

下面是一些不同情况下的路由定义示例:

3.3.1 基本路由

from flask import Flask

app = Flask(__name__)

@app.route('/')
def index():
    return "Welcome to the homepage!"

         在这个示例中,当用户访问根路径 / 时,会调用名为 index() 的视图函数,并返回 "Welcome to the homepage!" 的消息。

3.3.2 动态路由

        你可以在路由中使用变量部分,用于捕获 URL 中的不同值。这些变量将作为参数传递给视图函数。

@app.route('/user/<username>')
def show_user_profile(username):
    return f"User: {username}"

在这个示例中,当用户访问类似 /user/johndoe 的路径时,show_user_profile() 视图函数将会被调用,参数 username 将接收值 "johndoe"

3.3.3 HTTP 方法

你可以通过指定不同的 HTTP 方法来处理不同的请求,如 GET、POST、PUT、DELETE 等。

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

        这个示例中,只有当用户使用 POST 方法访问 /submit 路径时,才会调用 submit_form() 视图函数。

常见的HTTP方法及说明:

bbe5163800064ec4baf9df3e75c635a9.png

3.3.4 多个路由绑定到一个视图函数

你可以将多个不同的路径绑定到同一个视图函数,以提供更多的访问选项。

@app.route('/')
@app.route('/home')
@app.route('/index')
def homepage():
    return "Welcome to the homepage!"

这里,无论用户访问根路径 //home 还是 /index,都会调用 homepage() 视图函数。

3.3.5 访问URL 参数的路由

        你可以在视图函数中访问 URL 参数,这些参数会被 Flask 自动解析并传递给视图函数。

from flask import request

@app.route('/profile')
def user_profile():
    username = request.args.get('username')
    return f"User profile: {username}"

     示例代码定义了一个路由 /profile,当用户访问该路径时,会调用名为 user_profile() 的视图函数。在这个视图函数中,使用了 request 对象来获取 URL 参数 username 的值,然后返回一个包含用户名的消息。

3.3.6 带默认值的动态路由

@app.route('/user/<username>/<int:age>')
def user_profile(username, age=18):
    return f"User: {username}, Age: {age}"

 在这个示例中,age 参数具有默认值 18。这意味着你可以通过 /user/johndoe 访问,而不仅仅是 /user/johndoe/25

3.3.7 带不同数据类型的动态路由

@app.route('/item/<int:item_id>')
def get_item(item_id):
    return f"Item ID: {item_id}"

        这里,item_id 只会匹配整数类型的值,如果访问 /item/123,那么 item_id 将被传递为整数 123。

这些是一些常见情况下的路由定义示例。通过合理定义路由,你可以构建出逻辑清晰且易于访问的 Web 应用程序。注意,路由定义应该在 @app.route() 装饰器下面紧接着是对应的视图函数定义。

3.4 静态文件

        在 Flask 中,静态文件是指不需要动态生成的资源,如样式表、JavaScript 文件、图像等。这些文件不会在每次请求时都由服务器生成,而是直接返回给客户端浏览器。Flask 提供了专门的路由和配置来处理静态文件。

        默认情况下,Flask 在应用根目录下创建一个名为 static 的文件夹,用于存放静态文件。你可以在其中创建子文件夹来组织不同类型的静态资源,例如 static/css 用于存放样式表,static/js 用于存放 JavaScript 文件。

以下是如何在 Flask 中处理静态文件的基本步骤:

  1. 在项目根目录下创建一个 static 文件夹,用于存放静态文件。在其中可以创建子文件夹来组织不同类型的静态资源,例如 static/cssstatic/js

  2. 使用 url_for() 函数来生成静态文件的 URL。这个函数会根据配置生成正确的 URL,确保正确地访问到静态文件。

下面是一个简单的示例,演示如何在 Flask 中处理静态文件:

from flask import Flask, render_template, url_for

app = Flask(__name__)

@app.route('/')
def index():
    return render_template('index.html')

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

在这个示例中,render_template('index.html') 函数用于渲染模板,而模板中可能需要加载静态文件。例如,在模板中加载样式表:

<!DOCTYPE html>
<html>
<head>
    <title>Flask Static Files</title>
    <link rel="stylesheet" href="{{ url_for('static', filename='css/style.css') }}">
</head>
<body>
    <h1>Hello, Flask!</h1>
</body>
</html>

         在这个例子中,url_for('static', filename='css/style.css') 生成了正确的静态文件 URL。'static' 是 Flask 中默认的静态文件目录,'css/style.css' 是相对于该目录的路径。

        确保在模板中使用 url_for() 来生成静态文件的 URL,以便在不同的环境中都能正确访问到这些文件。这样,你就可以在 Flask 应用中有效地处理静态文件了。

3.5 模版

        在 Flask 中,模板用于将动态数据渲染到 HTML 页面中,实现页面内容的动态生成。Flask 集成了 Jinja2 模板引擎,让你可以在 HTML 中嵌入 Python 代码来渲染数据。这种方式使得业务逻辑和界面分离,提高了代码的可维护性。

以下是在 Flask 中使用模板的基本步骤:

  1. 在项目根目录下创建一个名为 templates 的文件夹,用于存放模板文件。这些模板文件可以使用 Jinja2 语法。

  2. 在视图函数中使用 render_template() 函数来渲染模板并传递数据。

  3. 在模板中使用 Jinja2 语法来嵌入动态内容和控制结构。

下面是一个简单的示例,演示如何在 Flask 中使用模板:

  1. 创建一个名为 templates 的文件夹,并在其中创建一个名为 index.html 的模板文件。

templates/index.html 文件内容:

<!DOCTYPE html>
<html>
<head>
    <title>Flask Template Example</title>
</head>
<body>
    <h1>Hello, {{ name }}!</h1>
    <p>Today is {{ date }}</p>
</body>
</html>

创建一个 Flask 应用,使用 render_template() 函数来渲染模板并传递数据。

from flask import Flask, render_template
import datetime

app = Flask(__name__)

@app.route('/')
def index():
    current_date = datetime.datetime.now()
    return render_template('index.html', name='Flask User', date=current_date)

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

    在这个示例中,render_template('index.html', name='Flask User', date=current_date) 渲染了 index.html 模板,并传递了 namedate 变量。在模板中,你可以使用 {{ variable_name }} 来插入动态内容。 在浏览器中访问应用的根路径,你应该会看到页面显示 "Hello, Flask User!" 和当前日期。

        这只是一个简单的 Flask 模板示例,你可以在模板中使用更多的 Jinja2 功能,如条件语句、循环、过滤器等,来构建更复杂的动态页面。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

【100天精通Python】Day49:Python Web编程_Web框架,Flask框架从安装到使用 的相关文章

  • Django REST序列化器:创建对象而不保存

    我已经开始使用 Django REST 框架 我想做的是使用一些 JSON 发布请求 从中创建一个 Django 模型对象 然后使用该对象而不保存它 我的 Django 模型称为 SearchRequest 我所拥有的是 api view
  • InterfaceError:连接已关闭(使用 django + celery + Scrapy)

    当我在 Celery 任务中使用 Scrapy 解析函数 有时可能需要 10 分钟 时 我得到了这个信息 我用 姜戈 1 6 5 django celery 3 1 16 芹菜 3 1 16 psycopg2 2 5 5 我也使用了psyc
  • 将字符串转换为带有毫秒和时区的日期时间 - Python

    我有以下 python 片段 from datetime import datetime timestamp 05 Jan 2015 17 47 59 000 0800 datetime object datetime strptime t
  • Python PAM 模块的安全问题?

    我有兴趣编写一个 PAM 模块 该模块将利用流行的 Unix 登录身份验证机制 我过去的大部分编程经验都是使用 Python 进行的 并且我正在交互的系统已经有一个 Python API 我用谷歌搜索发现pam python http pa
  • 使用 openCV 对图像中的子图像进行通用检测

    免责声明 我是计算机视觉菜鸟 我看过很多关于如何在较大图像中查找特定子图像的堆栈溢出帖子 我的用例有点不同 因为我不希望它是具体的 而且我不确定如何做到这一点 如果可能的话 但我感觉应该如此 我有大量图像数据集 有时 其中一些图像是数据集的
  • 更改自动插入 tkinter 小部件的文本颜色

    我有一个文本框小部件 其中插入了三条消息 一条是开始消息 一条是结束消息 一条是在 单位 被摧毁时发出警报的消息 我希望开始和结束消息是黑色的 但被毁坏的消息 参见我在代码中评论的位置 插入小部件时颜色为红色 我不太确定如何去做这件事 我看
  • 如何使用包含代码的“asyncio.sleep()”进行单元测试?

    我在编写 asyncio sleep 包含的单元测试时遇到问题 我要等待实际的睡眠时间吗 I used freezegun到嘲笑时间 当我尝试使用普通可调用对象运行测试时 这个库非常有用 但我找不到运行包含 asyncio sleep 的测
  • Python tcl 未正确安装

    我刚刚为 python 安装了graphics py 但是当我尝试运行以下代码时 from graphics import def main win GraphWin My Circle 100 100 c Circle Point 50
  • 安装后 Anaconda 提示损坏

    我刚刚安装张量流GPU创建单独的后环境按照以下指示here https github com antoniosehk keras tensorflow windows installation 但是 安装后当我关闭提示窗口并打开新航站楼弹出
  • 从列表中的数据框列中搜索部分字符串匹配 - Pandas - Python

    我有一个清单 things A1 B2 C3 我有一个 pandas 数据框 其中有一列包含用分号分隔的值 某些行将包含与上面列表中的一项的匹配 它不会是完美的匹配 因为它在其中包含字符串的其他部分 该列 例如 该列中的一行可能有 哇 这里
  • 在 NumPy 中获取 ndarray 的索引和值

    我有一个 ndarrayA任意维数N 我想创建一个数组B元组 数组或列表 其中第一个N每个元组中的元素是索引 最后一个元素是该索引的值A 例如 A array 1 2 3 4 5 6 Then B 0 0 1 0 1 2 0 2 3 1 0
  • Python:字符串不会转换为浮点数[重复]

    这个问题在这里已经有答案了 我几个小时前写了这个程序 while True print What would you like me to double line raw input gt if line done break else f
  • Python:尝试检查有效的电话号码

    我正在尝试编写一个接受以下格式的电话号码的程序XXX XXX XXXX并将条目中的任何字母翻译为其相应的数字 现在我有了这个 如果启动不正确 它将允许您重新输入正确的数字 然后它会翻译输入的原始数字 我该如何解决 def main phon
  • 通过数据框与函数进行交互

    如果我有这样的日期框架 氮 EG 00 04 NEG 04 08 NEG 08 12 NEG 12 16 NEG 16 20 NEG 20 24 datum von 2017 10 12 21 69 15 36 0 87 1 42 0 76
  • Python 3 中“map”类型的对象没有 len()

    我在使用 Python 3 时遇到问题 我得到了 Python 2 7 代码 目前我正在尝试更新它 我收到错误 类型错误 map 类型的对象没有 len 在这部分 str len seed candidates 在我像这样初始化它之前 se
  • 为美国东部以外地区的 Cloudwatch 警报发送短信?

    AWS 似乎没有为美国东部以外的 SNS 主题订阅者提供 SMS 作为协议 我想连接我的 CloudWatch 警报并在发生故障时接收短信 但无法将其发送到 SMS YES 经过一番挖掘后 我能够让它发挥作用 它比仅仅选择一个主题或输入闹钟
  • 设置 torch.gather(...) 调用的结果

    我有一个形状为 n x m 的 2D pytorch 张量 我想使用索引列表来索引第二个维度 可以使用 torch gather 完成 然后然后还设置新值到索引的结果 Example data torch tensor 0 1 2 3 4
  • 您可以在 Python 类型注释中指定方差吗?

    你能发现下面代码中的错误吗 米皮不能 from typing import Dict Any def add items d Dict str Any gt None d foo 5 d Dict str str add items d f
  • Spark.read 在 Databricks 中给出 KrbException

    我正在尝试从 databricks 笔记本连接到 SQL 数据库 以下是我的代码 jdbcDF spark read format com microsoft sqlserver jdbc spark option url jdbc sql
  • Pandas 与 Numpy 数据帧

    看这几行代码 df2 df copy df2 1 df 1 df 1 values 1 df2 ix 0 0 我们的教练说我们需要使用 values属性来访问底层的 numpy 数组 否则我们的代码将无法工作 我知道 pandas Data

随机推荐

  • 最详细的python安装教程,小白建议收藏

    python安装是学习pyhon第一步 很多刚入门小白不清楚如何安装python 今天我来带大家完成python安装与配置 跟着我一步步来 很简单 你肯定能完成 咱们先一起来看看今天的主要内容 1 安装Python 2 编写第一个 Hell
  • emacs下类似Visual Assist 的工具:cscope(代码中穿梭)

    先前在VC6中都用习惯了那个小助手Visual Assist ctr g就到了函数定义 在emacs下当然也想用这个功能 在网上搜了下 经过试验感觉蛮好用的 1 首先到 http cscope sourceforge net 下载 csco
  • 「一体化信息建设」,江苏人社如何完成数据安全管控(建设篇)

    2019 年 江苏省人社厅正式启动全省人社一体化信息平台建设项目 省人社一体化信息平台基于全省统一的人社业务标准 规范 流程和数据体系 以群众需求为导向 以省集中建设为重点 以云平台架构为基础 采用人社部 LEAF6 2 中台架构 目标建设
  • 百度高级搜索语法

    方法一 嫌麻烦或记不住的话可以采用这种方法 在百度首页直接点击右上角的 设置 高级搜索 在弹出的对话框中按提示填入搜索信息 方法二 采用高级语法进行搜索 具体语法如下 intitle 搜索范围限定在网页标题 网页标题通常是对网页内容提纲挈领
  • C# 读取数据库中时间,毫秒丢失的情况总结

    if row AddDate null row AddDate ToString model AddDate DateTime Parse row AddDate ToString 用动软直接生成以上代码会发现在读取日期时精度丢失毫秒 比如
  • 数据结构与算法基础知识整理

    目录 1 数据结构 8种数据结构 2 排序 8种排序 3 查找 7种查找 4 树 5 图 BFS DFS 最小生成树 最短路径 一 数据结构 1 顺序表和链表 顺序表使用数组实现 采用一组地址连续的存储单元 数组大小有两种方式指定 一是静态
  • C# 两种求平方根的方法 随机法 二分法

    自己发明的方法 效率不高 纯属娱乐 有点类似于蒙特卡洛算法 但是有记忆 private double TQSqrt double X 建立一个数列来存储结果 List
  • Keil编译*** WARNING L16: UNCALLED SEGMENT, IGNORED FOR OVERLAY PROCESS

    这个提示原因是工程中定义了函数但程序中没有被调用出现的提示 解决方法 步骤1 步骤2 设置完再次编译 编译器自动把没有调用到的函数屏蔽掉
  • Nature发文:LK-99不是超导体(附链接)

    来源 新智元 本文约3500字 建议阅读7分钟Nature刊文梳理LK 99不是超导体的证据 科学界已经开始总结经验教训 导读 这次真的实锤了 Nature刊文梳理LK 99不是超导体的证据 科学界已经开始总结经验教训 连续多日的室温超导疑
  • spring boot打包发布后修改端口和配置不起作用

    在开发环境好好的 发布到服务器后改了下端口怎么改都不正常 还是用的开发环境配置的端口号 pom xml中的配置如下
  • 引导页源码全开源解密带后台超漂亮音乐+客服+多模板

    源码介绍 话不多说 全新的 自适应 采用器 可自己歌单 接的的云客服 1 新增6套 2 增加后台 3 上传 4 新增多种片 5 弹出公告 6 适配seo优化 网盘下载地址 http www bytepan com t2mfGXzODQN 图
  • 什么是网关,网关的作用是什么?

    网关 Gateway 又称网间连接器 协议转换器 网关在传输层上以实现网络互连 是最复杂的网络互连设备 仅用于两个高层协议不同的网络互连 网关的结构也和路由器类似 不同的是互连层 网关既可以用于广域网互连 也可以用于局域网互连 网关是一种充
  • powershell notes II

    学习疑问 1 如何任意显示某个对象的method并使用它呢 已结 2 获取可卸载程序的命令行字卸载符串该怎么在powershell中使用呢 一 PowerShell常用快捷键F7 显示曾经输入的命令历史记录 用上下箭头可逐个选定再次执行 A
  • node 升版本

    不用命令 不用nvm的傻瓜式教程 前端项目之前一直用的node14版本 结果clone下一个开源项目需要15以上的版本 这就需要升级了 第一步 直接从官网上下载需要的版本 我下载的是免安装的压缩包 官网地址 Node js 下载完成后解压放
  • 17_外部中断实验

    目录 外部中断概述 外部中断的一般配置步骤 硬件连接图 实验源码 中途遇到问题printf打印中文乱码 外部中断概述 STM32F1的每个IO口都可以作为外部中断输入 STM32F1的中断控制器支持19个外部中断 事件请求 线0 15 对应
  • Android Studio 如何设置logcat(控制台)的缓存大小,增加logcat控制台条数

    在一些比较大型的项目Logcat条数会很多 由于LogCat控制台经常刷新 速度太快导致之前的日志被冲洗掉 这里教大家一个方法 可以避免这种情况发生 改下logcat的缓存 缓冲区 大小 做到显示更多的LogCat日志 1 去找你所安装的A
  • 微信小程序无法获取头像,昵称的解决办法 (原生)

    最新发布的微信小程序已经无法获取头像和昵称 那么如何解决这个问题呢 其实很简单 新用户注册后 提示跳转到新页面 要求修改昵称和头像即可
  • Rust学习:5_所有权与借用

    Rust学习 5 所有权与借用 前言 为了学习Rust 阅读了github上的Rust By Practice电子书 本文章只是用来记录自己的学习过程 感兴趣的可以阅读原书 希望大家都能掌握Rust 所有权与借用 Rust 之所以能成为万众
  • IDLE练习

    目录 一 IDLE介绍 二 IDLE实操 三 IDLE常用快捷键 四 第一个python程序 五 程序基本格式 一 IDLE介绍 1 IDLE 是 Python 的官方标准开发环境 Python 安装完后同时就安装了 IDLE 2 IDLE
  • 【100天精通Python】Day49:Python Web编程_Web框架,Flask框架从安装到使用

    目录 1 Web 框架 2 python 中常用的web框架 3 Flask 框架的使用 3 1 Flask框架安装 3 2 第一个Flask程序 3 3 路由 3 3 1 基本路由 3 3 2 动态路由 3 3 3 HTTP 方法 3 3