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天前
|
安全 大数据 程序员
Python operator模块的methodcaller:一行代码搞定对象方法调用的黑科技
`operator.methodcaller`是Python中处理对象方法调用的高效工具,替代冗长Lambda,提升代码可读性与性能。适用于数据过滤、排序、转换等场景,支持参数传递与链式调用,是函数式编程的隐藏利器。
47 4
|
1月前
|
存储 安全 数据处理
Python 内置模块 collections 详解
`collections` 是 Python 内置模块,提供多种高效数据类型,如 `namedtuple`、`deque`、`Counter` 等,帮助开发者优化数据处理流程,提升代码可读性与性能,适用于复杂数据结构管理与高效操作场景。
102 0
|
2月前
|
数据安全/隐私保护 Python
抖音私信脚本app,协议私信群发工具,抖音python私信模块
这个实现包含三个主要模块:抖音私信核心功能类、辅助工具类和主程序入口。核心功能包括登录
|
3月前
|
Linux 数据库 数据安全/隐私保护
Python web Django快速入门手册全栈版,共2590字,短小精悍
本教程涵盖Django从安装到数据库模型创建的全流程。第一章介绍Windows、Linux及macOS下虚拟环境搭建与Django安装验证;第二章讲解项目创建、迁移与运行;第三章演示应用APP创建及项目汉化;第四章说明超级用户创建与后台登录;第五章深入数据库模型设计,包括类与表的对应关系及模型创建步骤。内容精炼实用,适合快速入门Django全栈开发。
117 1
|
3月前
|
测试技术 Python
Python测试报告生成:整合错误截图,重复用例执行策略,调整测试顺序及多断言机制。
如何组织这一切呢?你可以写一本名为“Python测试之道”的动作指南手册,或者创建一个包含测试策略、测试顺序、多断言机制的脚本库。只要你的测试剧本编写得足够独到,你的框架就会像一位执行任务的超级英雄,将任何潜伏于代码深处的错误无情地揪出来展现在光天化日之下。这些整理好的测试结果,不仅有利于团队协作,更像冒险故事中的精彩篇章,带给读者无尽的探索乐趣和深刻的思考。
106 10
|
5月前
|
Python
Python教程:os 与 sys 模块详细用法
os 模块用于与操作系统交互,主要涉及夹操作、路径操作和其他操作。例如,`os.rename()` 重命名文件,`os.mkdir()` 创建文件夹,`os.path.abspath()` 获取文件绝对路径等。sys 模块则用于与 Python 解释器交互,常用功能如 `sys.path` 查看模块搜索路径,`sys.platform` 检测操作系统等。这些模块提供了丰富的工具,便于开发中处理系统和文件相关任务。
234 14
|
5月前
|
数据采集 人工智能 测试技术
Python有哪些好用且实用的Web框架?
Python 是一门功能强大的编程语言,在多个领域中得到广泛应用,包括爬虫、人工智能、游戏开发、自动化测试和 Web 开发。在 Web 开发中,Python 提供了多种框架以提高效率。以下是几个常用的 Python Web 框架:1) Django:开源框架,支持多种数据库引擎,适合新手;2) Flask:轻量级框架,基于简单核心并通过扩展增加功能;3) Web2py:免费开源框架,支持快速开发;4) Tornado:同时作为 Web 服务器和框架,适合高并发场景;5) CherryPy:简单易用的框架,连接 Web 服务器与 Python 代码。这些框架各有特色,可根据需求选择合适的工具。
277 14
|
6月前
|
缓存 Shell 开发工具
[oeasy]python071_我可以自己做一个模块吗_自定义模块_引入模块_import_diy
本文介绍了 Python 中模块的导入与自定义模块的创建。首先,我们回忆了模块的概念,即封装好功能的部件,并通过导入 `__hello__` 模块实现了输出 &quot;hello world!&quot; 的功能。接着,尝试创建并编辑自己的模块 `my_file.py`,引入 `time` 模块以获取当前时间,并在其中添加自定义输出。
101 5
|
Web App开发 网络协议 测试技术
|
4月前
|
Web App开发 前端开发 JavaScript
鸿蒙5开发宝藏案例分享---Web适配一多开发实践
这是一份实用的鸿蒙Web多设备适配开发指南,针对开发者在不同屏幕尺寸下的布局难题提供了解决方案。文章通过三大法宝(相对单位、媒体查询和窗口监听)详细介绍如何实现智能适配,并提供了多个实战案例,如宫格布局、对话框变形和自适应轮播图等。此外,还分享了调试技巧及工具推荐,帮助开发者快速上手并优化性能。最后鼓励读者实践探索,并提示更多官方资源等待发现。

推荐镜像

更多