关于我们

质量为本、客户为根、勇于拼搏、务实创新

< 返回新闻公共列表

36.从入门到精通:CGI环境变量 GET和POST方法 GET方法 POST方法 CGI中使用Cookie Cookie设置 检索Cookie信息

发布时间:2023-06-26 18:59:55

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.”消息。



/template/Home/leiyu/PC/Static