CGI环境变量
CGI程序可以使用环境变量来获取有关Web服务器和客户端的信息。以下是一些常用的CGI环境变量:
HTTP_COOKIE:包含客户端发送的所有cookie。
HTTP_REFERER:包含客户端从中链接到当前页面的URL。
HTTP_USER_AGENT:包含客户端浏览器的名称和版本号。
PATH_INFO:包含与CGI脚本关联的附加路径信息。
QUERY_STRING:包含查询字符串,即URL中的所有参数。
REMOTE_ADDR:包含客户端的IP地址。
REMOTE_HOST:包含客户端的主机名(如果可用)。
REQUEST_METHOD:包含客户端使用的HTTP方法,如GET或POST。
SCRIPT_FILENAME:包含正在运行的CGI脚本的完整路径。
SCRIPT_NAME:包含正在运行的CGI脚本的名称。
SERVER_NAME:包含Web服务器的主机名。
SERVER_PORT:包含Web服务器的端口号。
SERVER_PROTOCOL:包含Web服务器使用的协议名称和版本号,如HTTP/1.1。
SERVER_SOFTWARE:包含Web服务器的名称和版本号。
CGI程序可以使用Python的os模块来访问这些环境变量。例如,要获取客户端的IP地址,可以使用以下代码:
import os remote_addr = os.environ['REMOTE_ADDR'] print('Your IP address is: {}'.format(remote_addr))
这将打印出类似于“Your IP address is: 192.168.0.1”的消息。
GET和POST方法
GET和POST方法是HTTP协议中最常用的两种请求方法,它们分别用于向Web服务器发送请求和提交表单数据。
GET方法
GET方法用于向Web服务器请求资源,例如网页、图片、音频、视频等。GET请求将请求参数附加在URL后面,以问号(?)分隔URL和请求参数,多个请求参数之间用&符号分隔。例如:
http://www.example.com/search?q=python&page=1
GET请求的优点是简单、快速、易于缓存,适用于请求数据量较小的资源。缺点是请求参数暴露在URL中,不安全,不适合提交敏感数据。
POST方法
POST方法用于向Web服务器提交表单数据,例如用户登录、注册、评论等。POST请求将请求参数放在请求体中,而不是URL中,请求体的格式由Content-Type头部指定,常见的格式有application/x-www-form-urlencoded、multipart/form-data和application/json等。
例如:
POST /login HTTP/1.1 Host: www.example.com Content-Type: application/x-www-form-urlencoded username=admin&password=123456
POST请求的优点是安全、可靠、支持多种数据格式和大数据量传输,适用于提交敏感数据和大数据量的表单。缺点是稍微复杂一些,需要服务器端进行额外的处理。
在Python中,可以使用标准库中的urllib和http.client模块来发送GET和POST请求,也可以使用第三方库(例如requests)来简化HTTP请求的处理。
CGI中使用Cookie
在CGI程序中使用cookie,可以在HTTP响应头中设置Set-Cookie标头。以下是一个简单的示例,用于在客户端浏览器中设置名为“mycookie”的cookie:
import os print("Content-type:text/html\r\n") print("Set-Cookie: mycookie=value; path=/") print("Cookie has been set.")
这将在客户端浏览器中设置名为“mycookie”的cookie,其值为“value”。请注意,此代码中的“path=/”指定可以访问cookie的所有页面的路径。
要从客户端浏览器中读取cookie,可以在CGI程序中使用Python的os模块。以下是一个示例,用于读取名为“mycookie”的cookie:
import os cookie_string = os.environ.get('HTTP_COOKIE') if cookie_string: cookies = cookie_string.split(';') for cookie in cookies: name, value = cookie.strip().split('=') if name == 'mycookie': print("Content-type:text/html\r\n") print("Value of cookie 'mycookie' is {}.".format(value)) break else: print("Content-type:text/html\r\n") print("Cookie 'mycookie' not found.")
这将从客户端浏览器中读取名为“mycookie”的cookie,并在网页上显示其值。如果未找到cookie,则显示“Cookie’mycookie’ not found.”消息。
Cookie设置
Cookie是一种在Web浏览器和Web服务器之间传递信息的机制,它可以在浏览器中存储一些信息,例如用户的登录状态、购物车内容等。Web服务器可以在HTTP响应中设置Cookie,浏览器可以在HTTP请求中发送Cookie,从而实现状态的保持。
在Python中,可以使用标准库中的http.cookiejar和urllib.request模块来处理Cookie。下面简单介绍一下如何使用这两个模块来设置和发送Cookie:
创建CookieJar对象。CookieJar是一个存储Cookie的容器,它可以在内存中保存Cookie。
import http.cookiejar cookie_jar = http.cookiejar.CookieJar()
创建HTTPCookieProcessor对象。HTTPCookieProcessor是一个处理Cookie的处理器,它可以从HTTP响应中提取Cookie,并将Cookie添加到HTTP请求中。
import urllib.request cookie_processor = urllib.request.HTTPCookieProcessor(cookie_jar) opener = urllib.request.build_opener(cookie_processor) urllib.request.install_opener(opener)
发送HTTP请求。可以使用urllib.request.urlopen函数发送HTTP请求,Cookie会自动保存到CookieJar中。
response = urllib.request.urlopen('http://www.example.com/')
获取Cookie。可以使用CookieJar对象的方法获取Cookie。
for cookie in cookie_jar: print(cookie.name, cookie.value)
以上是简单的Cookie设置和发送过程,实际上还有很多细节需要注意,例如Cookie的域名、路径、过期时间等。另外,如果需要在多个HTTP请求之间共享Cookie,可以将CookieJar保存到文件中,或者使用类似Redis这样的缓存服务器来保存Cookie。
检索Cookie信息
在CGI程序中,可以通过读取HTTP Cookie头来检索cookie信息。HTTP Cookie头包含一个或多个cookie,每个cookie由一个名称和一个值组成,两者之间用等号分隔。多个cookie由分号和空格分隔。以下是一个示例,用于读取名为“mycookie”的cookie:
import os cookie_string = os.environ.get('HTTP_COOKIE') if cookie_string: cookies = cookie_string.split('; ') for cookie in cookies: name, value = cookie.split('=') if name == 'mycookie': print("Value of cookie 'mycookie' is {}.".format(value)) break else: print("Cookie 'mycookie' not found.")
在这个示例中,我们首先使用os.environ.get(‘HTTP_COOKIE’)读取HTTP
Cookie头。然后,我们使用split(‘; ‘)将cookie字符串拆分为单个cookie。接下来,我们使用split(’=’)将每个cookie拆分为名称和值。最后,我们检查名称是否为“mycookie”,如果是,则打印出cookie的值。如果未找到cookie,则打印出“Cookie ‘mycookie’ not found.”消息。