这两天学了python cgi编程,挺好玩的 跟大家分享一下:

    目标:

        创建一个cgi脚本 接收来访者的参数

    步骤:

        创建一个cgi服务的根目录(随便创建,然后在终端或者cmd下切换到该目录下)

        python2.x的httpserver启动:python -m CGIHTTPServer 13333   会启动http server 在13333端口上

        python3.x的httpserver启动:python -m http.server --cgi 13333 这个--cgi不可以拿掉 否则cgi脚本运行不了

        然后这个时候 你就可以创建一个比如index.html 测试一下 访问了

        接下来 创建cgi-bin 目录 在当前目录下(目录名必须是这个,cgi脚本就放在这个目录下),此时相对于http服务来说 根目录还是上一层的目录

        可以创建一个index.py在cgi-bin下,内容:

#!/usr/bin/env python
import cgi   #内置模块
html='''
<html>
        <head>
        </head>
        <body>
                <form method="POST">
                        <input type="text" name="name">
                        <input type="text" name="age">
                        <input type="submit" name="return">
                </form>
                <b>My name is %s , I'm %s years old .</b> 
        </body>
</html>
'''
print("Content-Type:text/html")            #header
print()                                    #声明header结束
f=cgi.FieldStorage()                       #cgi的一个类 用来接收参数的
try:
        print(html%(f['name'].value,f["age"].value))
except:
        print(html%('\t','\t'))

    


        效果会在你访问的时候出现两个文本框:

       wKioL1gi10jz471XAAAzQU8Undc097.png-wh_50

        有几个坑:一个是python的cgi模块的启动位置 一定要是在cgi-bin的上层目录下;

其次是index.py一定是在cgi-bin下才行 而且权限不足的话会报错;三是在实例化cgi的fieldstorage类的时候,注意别声明多次,比如我在上边的代码的try那里才去实例化,类似这样:

    try :

        print(html%(cgi.FieldStorage["name"].value,cgi.FieldStorage["age"].value)

    except......

    这样写的结果会什么都不显示 因为第一次实例化会传递数据 但是第二次的时候没有提交的结果了,所以会有可能神马都不显示或者只显示一个;

    最后就是注意这个:

        print("Content-Type:text/html")

        print()

     这个一定要写上,这个是声明头部和头部结束的,不写有问题;暂时我也就总结这么多~

    跟我一起来一句英文吧:

        It always seems impossible until its done

        成功之前,一切看起来都是不可能的