Python和Web--模块cgi的简单用例

简介: Python和Web--模块cgi的简单用例

Python和Web–模块cgi的简单用例
这两天学习Python Web编程的相关知识,其中一项是使用CGI(通用网关接口)技术。CGI是一种标准机制,属于服务器端,Web服务器可通过它将(通常是通过Web表达提供的)查询交给专用程序(如你编写的Python程序),并以网页的方式显示查询结果。要让CGI脚本能够通过Web进行访问(和运行),必须 将其放在Web服务器能够访问的地方、添加#!并设置合适的文件权限。

  1. 第一步:准备Web服务器
    本人使用的是macOS系统,操作系统自带Apache Web服务器,要开启这个服务。我只是想尝试使用CGI,所以只在Python中使用模块http.server直接运行一个临时Web服务器。与其他模块一样,通过向Python可执行文件提供开关-m来导入并运行这个模块。同时指定–cgi,启动的服务器支持CGI。命令如下:
(venv) liuxiaowei@MacBookAir% python -m http.server --cgi
Serving HTTP on :: port 8000 (http://[::]:8000/) ...

如果现在将浏览器地址栏输入http://127.0.0.1:8000或http://localhost:8000 ,将看到运行这个服务器所在的目录内容。CGI程序也必须放在通过Web访问的目录中。另外,必须将其标识为CGI脚本,以免Web服务器以网页的方式提供其源代码。为此有两种常用方式:

§ 将脚本放在子目录cgi-bin中

如下图:

image.png

§ 将脚本文件的扩展名指定为.cgi

  1. 第二步:添加#!行
    将脚本放在正确的位置(还可能给它指定特定的文件扩展名)后, 必须在其开头添加一个#!行。通过添加#!行,无须显示地执行Python解释器就能执行脚本。平时的话只是提供了便利,但对CGI脚本来说意义重大,因为如果没有#!行,Web服务器将不知道如何执行脚本。一般而言,只需在脚本开头添加如下行即可:
#!/usr/bin/env python3

注意:#!必须在第一行(之前没有空行)。如果这样不管用,就得确定Python可执行文件的绝对路径。并在#!行中添加。如下:

#!/usr/bin/python3

备注:本人系统同时安装了Python2和Python3,所以我执行的是python3。

  1. 第三步:设置文件权限
    必须确保谁都可以读取 和执行脚本文件(否则Web服务器将无法运行它),同时确保只有你才能写入(这样其他人都不能修改你的脚本)。本人的系统是macOS系统,所以修改文件权限的命令如下:
chmod 755 simeple.cgi

通常,CGI脚本不能修改计算机上的任何文件。要让它能够修改文件,必须显式地赋予它权限。

  1. 简单的CGI脚本
    代码如下:
#!/usr/bin/env python


print("Conent-type: text/plain")  # 指出这个网页是纯文本的,要指出网页是HTML的,应修改text/html
print()

print("hello, world!")

结果如下图:
image.png

  1. 使用模块cgi
    CGI脚本不只生成输出,输入是通过HTML表单以键-值对(字段)的方式提供给CGI脚本的。在CGI脚本中, 可以使用模块cgi 中的FieldStorage类来获取这些字段。当你创建FieldStorage实例(应只创建一个)时,它将从请求中取回输入变量(字段),并通过一个类似于字典的接口将它们提供给脚本。命令格式如下:
form = cgi.FieldStorage()
name = form.getvalue('name', 'Unknown')

这里提供了一个默认值(‘Unknown’),如果没有提供,默认值就是None。从FieldStorage中获取单个值的CGI脚本,示例代码如下:

#!/usr/bin/env python


import cgi
form = cgi.FieldStorage()

name = form.getvalue("name", "world")

print("Content_type: text/plain\n")
print("Hello, {}!".format(name))

运行结果如下:

image.png

表单默认值是world,CGI脚本的输入通常来自提交的表单,但是调用CGI脚本也可以直接指定参数。也就是在浏览器地址栏输入的URL后面加上问号变量名=值。如:http://127.0.0.1:8000/cgi-bin/simple2.cgi?name=xiaowei,如下图:

image.png

  1. 简单的表单
    创建用户提交的的表单,这个表单可以是独立的页面,在此将它放在脚本中实现。从CGI脚本中获取信息的主要方式有两种:方法GET和方法POST,GET用于获取信息并在URL中进行查询编码,而POST可用于任何类型的查询,但对查询进行编码的方式稍有不同。下面以包含HTML表单的问候脚本为例,我是用python编写一个小程序,直接生成一个cgi脚本文件。生成cgi脚本的小程序非常简单,就是利用‘with open‘,'w’模式。源码如下:
#_*_coding:utf-8_*_
# 作者      :liuxiaowei
# 创建时间   :3/9/22 11:02 AM
# 文件      :simple3.py
# IDE      :PyCharm

with open('simple3.cgi', 'w') as f:
    f.write('#!/usr/bin/env python\n\nimport cgi\nform = cgi.FieldStorage()\n\nname = form.getvalue("name", "world")\n'
            'print("""Content-type: text/html\n\n<html>\n\t<head>\n\t\t<title>Greeting Page</title>\n\t</head>\n\t<body>\n\t\t<h1>Hello, {}!</h1>\n\n\t\t<form action="simple3.cgi">\n\t\tChange name<input type="text" name = "name"/>\n\t\t<input type = "submit" />\n\t\t</form>\n\t</body>\n</html>""".format(name))')

执行之后生成的cgi脚本文件如下:

#!/usr/bin/env python

import cgi
form = cgi.FieldStorage()

name = form.getvalue("name", "world") # 参数name,默认值world,如果在浏览器中打开这个脚本没有提交任何值
                                                                            # 将使用默认值
print("""Content-type: text/html      

<html>
    <head>
        <title>Greeting Page</title>
    </head>
    <body>
        <h1>Hello, {
   }!</h1>

        <form action="simple3.cgi">
        Change name<input type="text" name = "name"/>
        <input type = "submit" />
        </form>
    </body>
</html>""".format(name))

运行之后,输出了一个简单的HTML页面,其中标题包含参数name的值,另外这个页面还包含一个HTML表单,该表单的属性action被设置为脚本的名称(simple3.cgi)。意味着提交表单后,将再次运行这个脚本。这个表单只包含一个输入元素–名为name的文本框,因此如果在文本框中输入新名字并提交表单,标题将发生变化,结果如下图:

image.png

相关文章
|
9月前
|
SQL 关系型数据库 数据库
Python SQLAlchemy模块:从入门到实战的数据库操作指南
免费提供Python+PyCharm编程环境,结合SQLAlchemy ORM框架详解数据库开发。涵盖连接配置、模型定义、CRUD操作、事务控制及Alembic迁移工具,以电商订单系统为例,深入讲解高并发场景下的性能优化与最佳实践,助你高效构建数据驱动应用。
1032 7
|
9月前
|
监控 安全 程序员
Python日志模块配置:从print到logging的优雅升级指南
从 `print` 到 `logging` 是 Python 开发的必经之路。`print` 调试简单却难维护,日志混乱、无法分级、缺乏上下文;而 `logging` 支持级别控制、多输出、结构化记录,助力项目可维护性升级。本文详解痛点、优势、迁移方案与最佳实践,助你构建专业日志系统,让程序“有记忆”。
787 0
|
9月前
|
JSON 算法 API
Python中的json模块:从基础到进阶的实用指南
本文深入解析Python内置json模块的使用,涵盖序列化与反序列化核心函数、参数配置、中文处理、自定义对象转换及异常处理,并介绍性能优化与第三方库扩展,助你高效实现JSON数据交互。(238字)
734 4
|
10月前
|
安全 大数据 程序员
Python operator模块的methodcaller:一行代码搞定对象方法调用的黑科技
`operator.methodcaller`是Python中处理对象方法调用的高效工具,替代冗长Lambda,提升代码可读性与性能。适用于数据过滤、排序、转换等场景,支持参数传递与链式调用,是函数式编程的隐藏利器。
283 4
|
9月前
|
Java 调度 数据库
Python threading模块:多线程编程的实战指南
本文深入讲解Python多线程编程,涵盖threading模块的核心用法:线程创建、生命周期、同步机制(锁、信号量、条件变量)、线程通信(队列)、守护线程与线程池应用。结合实战案例,如多线程下载器,帮助开发者提升程序并发性能,适用于I/O密集型任务处理。
806 0
|
9月前
|
XML JSON 数据处理
超越JSON:Python结构化数据处理模块全解析
本文深入解析Python中12个核心数据处理模块,涵盖csv、pandas、pickle、shelve、struct、configparser、xml、numpy、array、sqlite3和msgpack,覆盖表格处理、序列化、配置管理、科学计算等六大场景,结合真实案例与决策树,助你高效应对各类数据挑战。(238字)
1265 0
|
10月前
|
存储 数据库 开发者
Python SQLite模块:轻量级数据库的实战指南
本文深入讲解Python内置sqlite3模块的实战应用,涵盖数据库连接、CRUD操作、事务管理、性能优化及高级特性,结合完整案例,助你快速掌握SQLite在小型项目中的高效使用,是Python开发者必备的轻量级数据库指南。
830 0
|
9月前
|
算法 Java Go
【GoGin】(1)上手Go Gin 基于Go语言开发的Web框架,本文介绍了各种路由的配置信息;包含各场景下请求参数的基本传入接收
gin 框架中采用的路优酷是基于httprouter做的是一个高性能的 HTTP 请求路由器,适用于 Go 语言。它的设计目标是提供高效的路由匹配和低内存占用,特别适合需要高性能和简单路由的应用场景。
659 4
|
缓存 JavaScript 前端开发
鸿蒙5开发宝藏案例分享---Web开发优化案例分享
本文深入解读鸿蒙官方文档中的 `ArkWeb` 性能优化技巧,从预启动进程到预渲染,涵盖预下载、预连接、预取POST等八大优化策略。通过代码示例详解如何提升Web页面加载速度,助你打造流畅的HarmonyOS应用体验。内容实用,按需选用,让H5页面快到飞起!
|
JavaScript 前端开发 API
鸿蒙5开发宝藏案例分享---Web加载时延优化解析
本文深入解析了鸿蒙开发中Web加载完成时延的优化技巧,结合官方案例与实际代码,助你提升性能。核心内容包括:使用DevEco Profiler和DevTools定位瓶颈、四大优化方向(资源合并、接口预取、图片懒加载、任务拆解)及高频手段总结。同时提供性能优化黄金准则,如首屏资源控制在300KB内、关键接口响应≤200ms等,帮助开发者实现丝般流畅体验。

推荐镜像

更多