【100天精通Python】Day48:Python Web开发_WSGI网络服务器网关接口与使用

简介: 【100天精通Python】Day48:Python Web开发_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应用程序。

目录
相关文章
|
2月前
|
人工智能 安全 API
20 万奖金池就位!Higress AI 网关开发挑战赛参赛指南
本次赛事共设三大赛题方向,参赛者可以任选一个方向参赛。本文是对每个赛题方向的参赛指南。
259 17
|
5月前
|
人工智能 JavaScript API
零基础构建MCP服务器:TypeScript/Python双语言实战指南
作为一名深耕技术领域多年的博主摘星,我深刻感受到了MCP(Model Context Protocol)协议在AI生态系统中的革命性意义。MCP作为Anthropic推出的开放标准,正在重新定义AI应用与外部系统的交互方式,它不仅解决了传统API集成的复杂性问题,更为开发者提供了一个统一、安全、高效的连接框架。在过去几个月的实践中,我发现许多开发者对MCP的概念理解透彻,但在实际动手构建MCP服务器时却遇到了各种技术壁垒。从环境配置的细节问题到SDK API的深度理解,从第一个Hello World程序的调试到生产环境的部署优化,每一个环节都可能成为初学者的绊脚石。因此,我决定撰写这篇全面的实
944 67
零基础构建MCP服务器:TypeScript/Python双语言实战指南
|
2月前
|
算法 Java Go
【GoGin】(1)上手Go Gin 基于Go语言开发的Web框架,本文介绍了各种路由的配置信息;包含各场景下请求参数的基本传入接收
gin 框架中采用的路优酷是基于httprouter做的是一个高性能的 HTTP 请求路由器,适用于 Go 语言。它的设计目标是提供高效的路由匹配和低内存占用,特别适合需要高性能和简单路由的应用场景。
230 4
|
2月前
|
运维 监控 数据可视化
Python 网络请求架构——统一 SOCKS5 接入与配置管理
通过统一接入端点与标准化认证,集中管理配置、连接策略及监控,实现跨技术栈的一致性网络出口,提升系统稳定性、可维护性与可观测性。
|
2月前
|
机器学习/深度学习 大数据 关系型数据库
基于python大数据的青少年网络使用情况分析及预测系统
本研究基于Python大数据技术,构建青少年网络行为分析系统,旨在破解现有防沉迷模式下用户画像模糊、预警滞后等难题。通过整合多平台亿级数据,运用机器学习实现精准行为预测与实时干预,推动数字治理向“数据驱动”转型,为家庭、学校及政府提供科学决策支持,助力青少年健康上网。
|
3月前
|
JavaScript Java 大数据
基于python的网络课程在线学习交流系统
本研究聚焦网络课程在线学习交流系统,从社会、技术、教育三方面探讨其发展背景与意义。系统借助Java、Spring Boot、MySQL、Vue等技术实现,融合云计算、大数据与人工智能,推动教育公平与教学模式创新,具有重要理论价值与实践意义。
|
4月前
|
运维 Linux 开发者
Linux系统中使用Python的ping3库进行网络连通性测试
以上步骤展示了如何利用 Python 的 `ping3` 库来检测网络连通性,并且提供了基本错误处理方法以确保程序能够优雅地处理各种意外情形。通过简洁明快、易读易懂、实操性强等特点使得该方法非常适合开发者或系统管理员快速集成至自动化工具链之内进行日常运维任务之需求满足。
240 18
|
4月前
|
人工智能 自然语言处理 安全
Python构建MCP服务器:从工具封装到AI集成的全流程实践
MCP协议为AI提供标准化工具调用接口,助力模型高效操作现实世界。
790 1
|
4月前
|
数据采集 存储 数据可视化
Python网络爬虫在环境保护中的应用:污染源监测数据抓取与分析
在环保领域,数据是决策基础,但分散在多个平台,获取困难。Python网络爬虫技术灵活高效,可自动化抓取空气质量、水质、污染源等数据,实现多平台整合、实时更新、结构化存储与异常预警。本文详解爬虫实战应用,涵盖技术选型、代码实现、反爬策略与数据分析,助力环保数据高效利用。
260 0
|
5月前
|
安全 Linux 网络安全
Python极速搭建局域网文件共享服务器:一行命令实现HTTPS安全传输
本文介绍如何利用Python的http.server模块,通过一行命令快速搭建支持HTTPS的安全文件下载服务器,无需第三方工具,3分钟部署,保障局域网文件共享的隐私与安全。
1011 0

推荐镜像

更多