【100天精通python】Day48:python Web开发_WSGI接口与使用

news2025/1/12 1:41:05

目录

1 WSGI接口

1.1 CGI 简介

1.2 WSGI 简介

1.3 定义 WSGI 接口

1.3.1 应用程序(Application)

1.3.2 服务器(Server)

1.4 WSGI 接口的使用示例

1.5 WSGI接口的优势


1 WSGI接口

        上一节实现了静态服务器,但是当下web开发已经很少使用纯静态页面,更多的是动态页面,涉及更多的交互功能。如网站的登录和注册功能,当用户登录网站时需要输入用户名和密码,然后提交数据。web服务器不能处理表单中传递过来的与用户相关的数据,因此CGI应运而生。

1.1 CGI 简介

        CGI 的全称是“通用网关接口”(Common Gateway Interface),它是一种用于在Web服务器上执行外部程序或脚本的标准接口。通过CGI,Web服务器可以与外部程序(通常是脚本语言如Perl、Python、PHP等)进行通信,并将来自用户的请求传递给这些程序,然后将程序的输出发送回给用户的浏览器。

       CGI工作流程

以下是有关CGI的一些重要信息:

  1. 动态网页生成: 在早期的互联网发展阶段,网页通常是静态的,即在服务器上预先创建并存储的。但随着互联网的发展,人们需要能够根据用户的请求动态生成内容,这就导致了CGI的出现。

  2. HTTP 请求和响应: 当用户在浏览器中请求一个CGI 脚本,Web 服务器会解析请求中的CGI 路径,并将请求中的信息传递给脚本。脚本可以处理这些信息,生成动态内容,并将其作为HTTP响应发送回服务器,最终传递给用户浏览器。

  3. 编程语言: CGI 脚本可以用多种编程语言编写,例如Perl、Python、PHP、Ruby 等。这些脚本语言允许开发者处理数据、生成 HTML、与数据库交互等操作,从而实现复杂的网页功能。

  4. 安全性考虑: 由于CGI 脚本涉及与外部程序的交互,存在一些安全风险。不正确的实现可能导致安全漏洞,例如跨站脚本攻击(XSS)或代码注入。因此,在开发和部署CGI 脚本时,安全性应当是重要的考虑因素。

  5. 替代技术: 尽管CGI 是早期动态网页生成的标准方法,但随着技术的发展,出现了更高效、更安全的替代技术,如FastCGI 和WSGI(用于Python)。这些技术试图减少CGI 的开销,提高性能,并提供更好的安全性。

        总的来说,CGI 是互联网发展的重要阶段之一,它为动态网页生成打开了大门,为网站提供了更多的交互性和功能。然而,随着时间的推移,出现了更先进的技术来代替传统的CGI 方法。

1.2 WSGI 简介

      WSGI 的全称是“Web Server Gateway Interface”,它是一种用于在Python Web 应用程序和 Web 服务器之间进行通信的规范接口。与传统的 CGI 相比,WSGI 更加高效和灵活,可以在不同的 Web 服务器和应用程序框架之间进行交互。

 WSGI工作流程

1.3 定义 WSGI 接口

        WSGI(Web Server Gateway Interface)是一个 Python Web 应用程序和 Web 服务器之间的标准接口,允许开发人员在应用程序和服务器之间进行交互。WSGI 使得编写可移植且可在不同服务器之间共享的 Web 应用程序变得更加容易。

        WSGI 定义了两个主要组件:应用程序(application)和服务器(server)。

        应用程序是一个 Python 函数,它接收两个参数:一个包含 HTTP 请求信息的字典和一个用于发送响应的函数。

        服务器负责将请求信息解析为字典,并将响应函数与应用程序绑定在一起。

以下是 WSGI 接口的详细解释和一个简单示例:

1.3.1 应用程序(Application)

  • WSGI 应用程序是一个可调用的 Python 函数(通常是一个对象的方法),它接收两个参数:一个包含请求信息的字典 environ 和一个用于发送响应的函数 start_response
  • 应用程序通过在 environ 字典中查找请求信息,如请求方法、路径、查询参数等。
  • start_response 函数用于发送响应的状态码和 HTTP 头信息。

1.3.2 服务器(Server)

  • WSGI 服务器解析 HTTP 请求,并将请求信息存储在 environ 字典中。
  • 服务器需要执行应用程序,将 environstart_response 作为参数传递给应用程序,并将应用程序返回的响应数据发送回客户端。

1.4 WSGI 接口的使用示例

        以下是一个示例来说明 WSGI 接口的使用。

(1)建文件结构: 在您的工作目录下创建一个名为 wsgi_example 的文件夹,并在其中创建以下文件。

  • app.py:WSGI 应用程序代码
  • templates 文件夹:用于存放 HTML 模板
  • templates/index.html:HTML 模板文件

index.html 模板:templates 文件夹中创建一个名为 index.html 的 HTML 模板。

<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>WSGI Example</title>
  <style>
    /* 设置全局样式 */
    body {
      font-family: Arial, sans-serif;
      background-color: #f0f0f0;
      margin: 0;
      padding: 0;
    }
    /* 设置页眉样式 */
    header {
      background-color: #333;
      color: #fff;
      padding: 1rem;
      text-align: center;
    }
    /* 设置内容区域样式 */
    .content {
      text-align: center;
      padding: 2rem;
      background-color: #fff;
      box-shadow: 0 0 10px rgba(0, 0, 0, 0.1);
      border-radius: 10px;
      margin: 2rem auto;
      width: 60%;
    }
    /* 设置时间区域样式 */
    #datetime {
      font-size: 24px;
      color: #009688; /* 修改时间颜色 */
      font-weight: bold;
    }
  </style>
</head>
<body>
  <header>
    <h1>WSGI Example</h1>
  </header>
  <div class="content">
    <h2>Hello, Dynamic WSGI World!</h2>
    <!-- 用于显示实时更新的本地日期和时间 -->
    <p id="current-datetime">Current date and time: <span id="datetime"></span></p>
  </div>

  <script>
    // 更新本地日期和时间的函数
    function updateCurrentDateTime() {
      const datetimeElement = document.getElementById("datetime");
      const now = new Date();
      const options = { year: 'numeric', month: 'long', day: 'numeric', hour: '2-digit', minute: '2-digit', second: '2-digit', timeZoneName: 'short' };
      const currentDateTime = now.toLocaleString('en-US', options);
      datetimeElement.textContent = currentDateTime;
    }

    // 每秒更新时间
    setInterval(updateCurrentDateTime, 1000);
    updateCurrentDateTime(); // 首次加载页面时更新日期和时间
  </script>
</body>
</html>

app.py,WSGI 应用程序:app.py 文件中,编写 WSGI 应用程序代码。

from wsgiref.simple_server import make_server
from jinja2 import Environment, FileSystemLoader

# 创建一个 Jinja2 环境,用于加载模板
env = Environment(loader=FileSystemLoader('./templates'))

# WSGI 应用程序
def app(environ, start_response):
    status = '200 OK'
    headers = [('Content-type', 'text/html')]
    start_response(status, headers)
    
    # 使用 Jinja2 渲染模板
    template = env.get_template('index.html')
    current_time = environ['CURRENT_TIME']
    rendered_template = template.render(current_time=current_time)
    
    return [rendered_template.encode()]

if __name__ == '__main__':
    with make_server('', 3000, app) as httpd:
        print("Serving on port 3000...")
        httpd.serve_forever()

2 运行应用程序: 在命令行中导航到 wsgi_example 文件夹,并运行以下命令来启动服务器。

python app.py

3 访问页面: 打开浏览器并访问 http://localhost:3000,您将看到一个带有动态生成内容的页面。 页面显示如下:

      在上面这个示例中,我们使用了 Jinja2 模板引擎来渲染 HTML 模板,实现了动态内容的插入。app.py 文件中的应用程序将当前时间作为动态内容传递给模板,模板会将时间插入到页面中。

        请注意,上述示例仅用于演示 WSGI 的用法,实际项目中可能会使用更成熟的框架和库来处理模板、动态内容、数据库访问等。

1.5 WSGI接口的优势

  1. 可移植性: 使用WSGI接口编写的应用程序可以在不同的WSGI服务器上运行,从而实现跨不同服务器的可移植性。
  2. 可互操作性: WSGI使不同的应用程序和服务器能够以一致的方式进行通信,促进了Web生态系统中不同组件的互操作性。
  3. 性能: WSGI服务器通常能够更高效地处理HTTP请求,提供更好的性能。

        总之,WSGI(Web Server Gateway Interface)是一个定义了Python Web应用程序与服务器之间通信的接口标准,通过统一的接口使得开发人员能够更灵活地构建和部署Web应用程序。

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

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

相关文章

Cell子刊:肠道菌菌株之间的“明争暗斗”

抗生素耐药性质粒可以在肠道中不同肠杆菌科之间传播。本期经典文献解读&#xff0c;为大家带来发表在Cell Host and Microbe上的研究成果&#xff0c;探索具有相似营养需求的肠杆菌科沙门氏菌群如何在同一肠道中共同繁殖及质粒转移。 期刊&#xff1a;Cell Host Microbe …

八、MySQL(DML)如何修改表中的数据?

1、修改表数据 &#xff08;1&#xff09;基础语法&#xff1a; update 表名 SET 字段名1数值1,字段名2数值2&#xff0c;…… [where 条件]; &#xff08;2&#xff09; 操作实例&#xff1a; 第一步&#xff1a; 先准备一张表 insert into things values (10086,18,0x12…

spark支持深度学习批量推理

背景 在数据量较大的业务场景中&#xff0c;spark在数据处理、传统机器学习训练、 深度学习相关业务&#xff0c;能取得较明显的效率提升。 本篇围绕spark大数据背景下的推理&#xff0c;介绍一些优雅的使用方式。 spark适用场景 大数据量自定义方法处理、类sql处理传统机器…

掌握Kubernetes API:释放容器编排的潜力

Kubernetes API使用 1、 API是什么&#xff1f; API&#xff08;Application Programming Interface&#xff0c;应用程序接口&#xff09;&#xff1a; 是一些预先定义的接口&#xff08;如函数、HTTP接口&#xff09;&#xff0c;或指软件系统不同组成部分衔接的约定。 用来…

分类算法系列③:模型选择与调优 (Facebook签到位置预测)

目录 模型选择与调优 1、介绍 模型选择&#xff08;Model Selection&#xff09;&#xff1a; 调优&#xff08;Hyperparameter Tuning&#xff09;&#xff1a; 本章重点 2、交叉验证 介绍 为什么需要交叉验证 数据处理 3、⭐超参数搜索-网格搜索(Grid Search) 介绍…

合宙Air724UG LuatOS-Air LVGL API控件--图表 (Chart)

图表 (Chart) 一幅图胜过一千个字&#xff0c;通过图表展示出的数据内容能让用户更快速有效的了解数据特征。 代码示例 – 创建图表 chart lvgl.chart_create(lvgl.scr_act(), nil) lvgl.obj_set_size(chart, 200, 150) lvgl.obj_align(chart, nil, lvgl.ALIGN_CENTER, 0, …

聊聊Http服务化改造实践

在微服务架构体系中远程RPC调用主要包括Dubbo与Http调用两个大类&#xff0c;由于Dubbo拥有服务注册中心&#xff0c;并且起服务的命名非常规范&#xff0c;使用包名.类名.方法名进行描述。 而http调用通常都是使用httpclient等相关类库&#xff0c;这些在使用上并没有问题&am…

常见问题。

警告&#xff1a;There are 2 audio listeners in the scene. Please ensure there is always exactly one audio listener in the scene. 解决&#xff1a;两个摄像机两个audio listeners组件&#xff0c;禁用一个就好了。 错误&#xff1a;Scene ‘xxxxx’ couldn’t be loa…

在 Amazon 搭建无代码可视化的数据分析和建模平台

现代企业常常会有利用数据分析和机器学习帮助解决业务痛点的需求。如制造业中&#xff0c;利用设备采集上来的数据做预测性维护&#xff0c;质量控制&#xff1b;在零售业中&#xff0c;利用客户端端采集的数据做渠道转化率分析&#xff0c;个性化推荐等。 亚马逊云科技开发者…

能直接运营的发接任务平台小程序搭建开发演示

有个项目估计做过互联网的小伙伴都听说过——发接任务平台。 基本每年都有发接任务平台关站&#xff0c;但又有新的平台出来&#xff0c;往复循环&#xff0c;无比热闹。这在互联网圈不常见&#xff0c;互联网项目很多都是风头过去了就结束了&#xff0c;但发接任务年年似乎都…

HTML 播放器效果

效果图 实现代码 <!DOCTYPE HTML> <html><head><title>爱看动漫社区 | 首页 </title><link href"css/bootstrap.css" relstylesheet typetext/css /><!-- jQuery --><script src"js/jquery-1.11.0.min.js"…

进程间通信-Binder

Binder Binder框架概述服务端Binder驱动客户端 设计服务端和客户端设计服务端客户端设计 Binder与ServiceServiceAIDL 保证包裹内参数顺序IMusicPlayerServiceProxyStub 系统服务中的Binder对象ServiceManger管理的服务理解Manger功能快捷键合理的创建标题&#xff0c;有助于目…

19 Linux之Python定制篇-apt软件管理和远程登录

19 Linux之Python定制篇-apt软件管理和远程登录 文章目录 19 Linux之Python定制篇-apt软件管理和远程登录19.1 apt软件管理19.1.1 apt介绍19.1.2 更新软件下载地址-阿里源19.1.3 使用apt完成安装和卸载vim 19.2 远程登录Ubuntu 学习视频来自于B站【小白入门 通俗易懂】2021韩顺…

两个pdf文件合并为一个怎么操作?分享pdf合并操作步骤

不管是初入职场的小白&#xff0c;还是久经职场的高手&#xff0c;都必须深入了解pdf&#xff0c;特别是关于pdf的各种操作&#xff0c;如编辑、合并、压缩等操作&#xff0c;其中合并是这么多操作里面必需懂的技能之一&#xff0c;但是很多人还是不知道两个pdf文件合并为一个怎…

基于材料生成算法优化的BP神经网络(预测应用) - 附代码

基于材料生成算法优化的BP神经网络&#xff08;预测应用&#xff09; - 附代码 文章目录 基于材料生成算法优化的BP神经网络&#xff08;预测应用&#xff09; - 附代码1.数据介绍2.材料生成优化BP神经网络2.1 BP神经网络参数设置2.2 材料生成算法应用 4.测试结果&#xff1a;5…

【Tkinter系列09/15】小部件(Scrollbar

22. 小部件Scrollbar 许多小部件&#xff08;如列表框和画布&#xff09;可以 就像将窗口滑动到更大的虚拟区域一样。你 可以将滚动条小部件连接到它们&#xff0c;为用户提供 相对于内容滑动视图的方式。 下面是带有关联条目小部件的屏幕截图 滚动条小部件&#xff1a; 滚动条…

CSS学习笔记03

CSS笔记03 盒子模型 什么是盒子模型 概念&#xff1a; CSS 盒子模型就是在网页设计中经常用到的一种思维模型&#xff0c;是 CSS 布局的基石&#xff0c;主要规定了元素是如何显示的以及元素间的相互关系。定义所有元素都可以有像盒子一样的平面空间和外形。包含内容区、内边…

汉服网上购物商城穿搭交流的微信小程序的设计与实现

社会的发展和科学技术的进步&#xff0c;互联网技术越来越受欢迎。手机也逐渐受到广大人民群众的喜爱&#xff0c;也逐渐进入了每个用户的使用。手机具有便利性&#xff0c;速度快&#xff0c;效率高&#xff0c;成本低等优点。 因此&#xff0c;构建符合自己要求的操作系统是非…

Redis项目实战——优惠券秒杀

目录 Redis自增功能解决全局唯一IDRedis实现优惠券秒杀的主要思路实现过程中出现的问题及解决方法超卖问题方案1 悲观锁方案2 乐观锁 一人一单问题分布式锁如何用Redis实现分布式锁&#xff1f; Redis优化秒杀消息队列实现异步秒杀List发布订阅模式Stream Redis自增功能解决全局…

通过RISC-V预认证解决方案应对功能安全挑战

安全之安全(security)博客目录导读 2023 RISC-V中国峰会 安全相关议题汇总 说明&#xff1a;本文参考RISC-V 2023中国峰会如下议题&#xff0c;版权归原作者所有。