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

相关文章
|
22天前
|
存储 缓存 算法
Python闭包|你应该知道的常见用例(下)
Python闭包|你应该知道的常见用例(下)
14 1
Python闭包|你应该知道的常见用例(下)
|
7天前
|
测试技术 Python
手动解决Python模块和包依赖冲突的具体步骤是什么?
需要注意的是,手动解决依赖冲突可能需要一定的时间和经验,并且需要谨慎操作,避免引入新的问题。在实际操作中,还可以结合使用其他方法,如虚拟环境等,来更好地管理和解决依赖冲突😉。
|
10天前
|
JSON 前端开发 API
使用Python和Flask构建简易Web API
使用Python和Flask构建简易Web API
|
15天前
|
关系型数据库 数据库 数据安全/隐私保护
Python Web开发
Python Web开发
46 6
|
17天前
|
Python
在Python中,可以使用内置的`re`模块来处理正则表达式
在Python中,可以使用内置的`re`模块来处理正则表达式
39 5
|
20天前
|
开发框架 前端开发 JavaScript
利用Python和Flask构建轻量级Web应用的实战指南
利用Python和Flask构建轻量级Web应用的实战指南
59 2
|
23天前
|
前端开发 API 开发者
Python Web开发者必看!AJAX、Fetch API实战技巧,让前后端交互如丝般顺滑!
在Web开发中,前后端的高效交互是提升用户体验的关键。本文通过一个基于Flask框架的博客系统实战案例,详细介绍了如何使用AJAX和Fetch API实现不刷新页面查看评论的功能。从后端路由设置到前端请求处理,全面展示了这两种技术的应用技巧,帮助Python Web开发者提升项目质量和开发效率。
38 1
|
22天前
|
Web App开发 测试技术 数据安全/隐私保护
自动化测试的魔法:使用Python进行Web应用测试
【10月更文挑战第32天】本文将带你走进自动化测试的世界,通过Python和Selenium库的力量,展示如何轻松对Web应用进行自动化测试。我们将一起探索编写简单而强大的测试脚本的秘诀,并理解如何利用这些脚本来确保我们的软件质量。无论你是测试新手还是希望提升自动化测试技能的开发者,这篇文章都将为你打开一扇门,让你看到自动化测试不仅可行,而且充满乐趣。
|
7月前
|
Python 人工智能 数据可视化
Python模块与包(八)
Python模块与包(八)
53 0
Python模块与包(八)
|
7天前
|
数据可视化 Python
如何在Python中解决模块和包的依赖冲突?
解决模块和包的依赖冲突需要综合运用多种方法,并且需要团队成员的共同努力和协作。通过合理的管理和解决冲突,可以提高项目的稳定性和可扩展性