【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应用程序。

目录
相关文章
|
7天前
|
数据采集 存储 JavaScript
构建你的第一个Python网络爬虫
【9月更文挑战第34天】在数字信息泛滥的时代,快速有效地获取和处理数据成为一项重要技能。本文将引导读者通过Python编写一个简易的网络爬虫,实现自动化地从网页上抓取数据。我们将一步步走过代码的编写过程,并探讨如何避免常见陷阱。无论你是编程新手还是想扩展你的技术工具箱,这篇文章都将为你提供有价值的指导。
48 18
|
17天前
|
机器学习/深度学习 人工智能 算法
【新闻文本分类识别系统】Python+卷积神经网络算法+人工智能+深度学习+计算机毕设项目+Django网页界面平台
文本分类识别系统。本系统使用Python作为主要开发语言,首先收集了10种中文文本数据集("体育类", "财经类", "房产类", "家居类", "教育类", "科技类", "时尚类", "时政类", "游戏类", "娱乐类"),然后基于TensorFlow搭建CNN卷积神经网络算法模型。通过对数据集进行多轮迭代训练,最后得到一个识别精度较高的模型,并保存为本地的h5格式。然后使用Django开发Web网页端操作界面,实现用户上传一段文本识别其所属的类别。
40 1
【新闻文本分类识别系统】Python+卷积神经网络算法+人工智能+深度学习+计算机毕设项目+Django网页界面平台
|
14天前
|
机器学习/深度学习 数据采集 网络安全
使用Python实现深度学习模型:智能网络安全威胁检测
使用Python实现深度学习模型:智能网络安全威胁检测
59 5
|
17天前
|
数据采集 存储 JavaScript
构建您的第一个Python网络爬虫:抓取、解析与存储数据
【9月更文挑战第24天】在数字时代,数据是新的金矿。本文将引导您使用Python编写一个简单的网络爬虫,从互联网上自动抓取信息。我们将介绍如何使用requests库获取网页内容,BeautifulSoup进行HTML解析,以及如何将数据存储到文件或数据库中。无论您是数据分析师、研究人员还是对编程感兴趣的新手,这篇文章都将为您提供一个实用的入门指南。拿起键盘,让我们开始挖掘互联网的宝藏吧!
|
17天前
|
开发框架 JSON 缓存
震撼发布!Python Web开发框架下的RESTful API设计全攻略,让数据交互更自由!
在数字化浪潮推动下,RESTful API成为Web开发中不可或缺的部分。本文详细介绍了在Python环境下如何设计并实现高效、可扩展的RESTful API,涵盖框架选择、资源定义、HTTP方法应用及响应格式设计等内容,并提供了基于Flask的示例代码。此外,还讨论了版本控制、文档化、安全性和性能优化等最佳实践,帮助开发者实现更流畅的数据交互体验。
37 1
|
17天前
|
机器学习/深度学习 人工智能 算法
【果蔬识别系统】Python+卷积神经网络算法+人工智能+深度学习+计算机毕设项目+Django网页界面平台
【果蔬识别系统】Python+卷积神经网络算法+人工智能+深度学习+计算机毕设项目+Django网页界面平台。果蔬识别系统,本系统使用Python作为主要开发语言,通过收集了12种常见的水果和蔬菜('土豆', '圣女果', '大白菜', '大葱', '梨', '胡萝卜', '芒果', '苹果', '西红柿', '韭菜', '香蕉', '黄瓜'),然后基于TensorFlow库搭建CNN卷积神经网络算法模型,然后对数据集进行训练,最后得到一个识别精度较高的算法模型,然后将其保存为h5格式的本地文件方便后期调用。再使用Django框架搭建Web网页平台操作界面,实现用户上传一张果蔬图片识别其名称。
37 0
【果蔬识别系统】Python+卷积神经网络算法+人工智能+深度学习+计算机毕设项目+Django网页界面平台
|
1天前
|
网络协议 Python
Python创建一个TCP服务器
Python创建一个TCP服务器
|
2天前
|
安全 网络协议 IDE
使用Python编写网络扫描程序
使用Python编写网络扫描程序
|
2天前
|
JSON API 开发者
深入解析Python网络编程与Web开发:urllib、requests和http模块的功能、用法及在构建现代网络应用中的关键作用
深入解析Python网络编程与Web开发:urllib、requests和http模块的功能、用法及在构建现代网络应用中的关键作用
8 0
|
2天前
|
网络协议 测试技术 网络安全
Python编程-Socket网络编程
Python编程-Socket网络编程
12 0