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

目录
相关文章
|
25天前
|
安全 Linux 网络安全
Web安全-Linux网络协议
Web安全-Linux网络协议
50 4
|
1月前
|
数据库 开发者 Python
web应用开发
【9月更文挑战第1天】web应用开发
38 1
|
20天前
|
数据可视化 图形学 UED
只需四步,轻松开发三维模型Web应用
为了让用户更方便地应用三维模型,阿里云DataV提供了一套完整的三维模型Web模型开发方案,包括三维模型托管、应用开发、交互开发、应用分发等完整功能。只需69.3元/年,就能体验三维模型Web应用开发功能!
41 8
只需四步,轻松开发三维模型Web应用
|
10天前
|
安全 API 开发者
Web 开发新风尚!Python RESTful API 设计与实现,让你的接口更懂开发者心!
在当前的Web开发中,Python因能构建高效简洁的RESTful API而备受青睐,大大提升了开发效率和用户体验。本文将介绍RESTful API的基本原则及其在Python中的实现方法。以Flask为例,演示了如何通过不同的HTTP方法(如GET、POST、PUT、DELETE)来创建、读取、更新和删除用户信息。此示例还包括了基本的路由设置及操作,为开发者提供了清晰的API交互指南。
44 6
|
9天前
|
存储 JSON API
实战派教程!Python Web开发中RESTful API的设计哲学与实现技巧,一网打尽!
在数字化时代,Web API成为连接前后端及构建复杂应用的关键。RESTful API因简洁直观而广受欢迎。本文通过实战案例,介绍Python Web开发中的RESTful API设计哲学与技巧,包括使用Flask框架构建一个图书管理系统的API,涵盖资源定义、请求响应设计及实现示例。通过准确使用HTTP状态码、版本控制、错误处理及文档化等技巧,帮助你深入理解RESTful API的设计与实现。希望本文能助力你的API设计之旅。
31 3
|
10天前
|
JSON API 数据库
从零到英雄?一篇文章带你搞定Python Web开发中的RESTful API实现!
在Python的Web开发领域中,RESTful API是核心技能之一。本教程将从零开始,通过实战案例教你如何使用Flask框架搭建RESTful API。首先确保已安装Python和Flask,接着通过创建一个简单的用户管理系统,逐步实现用户信息的增删改查(CRUD)操作。我们将定义路由并处理HTTP请求,最终构建出功能完整的Web服务。无论是初学者还是有经验的开发者,都能从中受益,迈出成为Web开发高手的重要一步。
32 4
|
8天前
|
开发框架 JSON 缓存
震撼发布!Python Web开发框架下的RESTful API设计全攻略,让数据交互更自由!
在数字化浪潮推动下,RESTful API成为Web开发中不可或缺的部分。本文详细介绍了在Python环境下如何设计并实现高效、可扩展的RESTful API,涵盖框架选择、资源定义、HTTP方法应用及响应格式设计等内容,并提供了基于Flask的示例代码。此外,还讨论了版本控制、文档化、安全性和性能优化等最佳实践,帮助开发者实现更流畅的数据交互体验。
25 1
|
9天前
|
运维 安全 网络安全
Web安全-企业网络架构
Web安全-企业网络架构
15 1
|
10天前
|
JSON API 开发者
惊!Python Web开发新纪元,RESTful API设计竟能如此性感撩人?
在这个Python Web开发的新纪元里,RESTful API的设计已经超越了简单的技术实现,成为了一种追求极致用户体验和开发者友好的艺术表达。通过优雅的URL设计、合理的HTTP状态码使用、清晰的错误处理、灵活的版本控制以及严格的安全性措施,我们能够让RESTful API变得更加“性感撩人”,为Web应用注入新的活力与魅力。
24 3
|
10天前
|
SQL 安全 Go
SQL注入不可怕,XSS也不难防!Python Web安全进阶教程,让你安心做开发!
在Web开发中,安全至关重要,尤其要警惕SQL注入和XSS攻击。SQL注入通过在数据库查询中插入恶意代码来窃取或篡改数据,而XSS攻击则通过注入恶意脚本来窃取用户敏感信息。本文将带你深入了解这两种威胁,并提供Python实战技巧,包括使用参数化查询和ORM框架防御SQL注入,以及利用模板引擎自动转义和内容安全策略(CSP)防范XSS攻击。通过掌握这些方法,你将能够更加自信地应对Web安全挑战,确保应用程序的安全性。
39 3
下一篇
无影云桌面