CGI中使用Cookie

文章目录

  • CGI中使用Cookie
  • cookie的语法
  • 设置Cookie
  • 获取Cookie
  • 检索Cookie信息
  • 文件上传实例
    • 1. 创建HTML表单
    • 2. 编写Python脚本处理上传
  • 文件下载对话框

CGI中使用Cookie

在CGI(Common Gateway Interface)中使用Cookie涉及设置和获取由Web服务器发送到浏览器,并由浏览器随每个请求发送回服务器的数据。Cookies通常用于存储用户偏好、会话状态和身份验证信息等。

cookie的语法

Cookie的语法通常包括以下几个部分:

  • Cookie名称:一个由字母、数字、下划线、点号、加号、冒号、斜杠、问号、百分号和等号组成的字符串,用于标识Cookie。
  • 等号:将Cookie名称与值分开,确保值不会被视为Cookie名称。
  • 值:与Cookie名称等长的任意字符串,表示存储的数据。
  • 分号加空格:分隔Cookie的各个部分。
  • 路径:指定Cookie的作用路径,默认是当前页面。
  • 域名:指定Cookie适用的域名,默认是当前域名。
  • 有效期:指定Cookie的生存时间,可以是绝对时间或相对时间。
  • 其他可选字段:如Secure、HttpOnly、SameSite等,用于指定Cookie的安全性和作用范围。

设置Cookie

在CGI程序中设置Cookie,你需要使用http模块中的Cookie类。以下是一个设置Cookie的示例:

#!/usr/bin/env python3
import http.cookies# 创建一个Cookie对象
cookie = http.cookies.SimpleCookie()# 设置Cookie的名称、值、过期时间等
cookie['user_preference'] = 'dark_theme'
cookie['user_preference']['expires'] = 'Fri, 31 Dec 2023 23:59:59 GMT'# 打印Set-Cookie头
print("Content-Type: text/html")
print()  # Blank line required, end of headers
print("Set-Cookie: user_preference=dark_theme; expires=Fri, 31 Dec 2023 23:59:59 GMT; path=/")
print("<html>")
print("<head>")
print("<title>Set Cookie</title>")
print("</head>")
print("<body>")
print("<p>Cookie has been set.</p>")
print("</body>")
print("</html>")

获取Cookie

要从CGI请求中获取Cookie,你可以使用cgi.FieldStorage()类,但更常见的是使用http.cookies模块。以下是一个获取Cookie的示例:

#!/usr/bin/env python3
import http.cookies# 创建一个CookieJar对象来存储Cookie
cookie_jar = http.cookies.CookieJar()# 从请求头中加载Cookie
cookie_jar.extract_cookies(http.client.HTTPResponse(None), None)# 获取名为'user_preference'的Cookie
user_preference = cookie_jar._cookies.get('example.com', {}).get('user_preference', None)print("Content-Type: text/html")
print()  # Blank line required, end of headersif user_preference:print("<html>")print("<head>")print("<title>Get Cookie</title>")print("</head>")print("<body>")print("<p>User preference: {}</p>".format(user_preference.value))print("</body>")print("</html>")
else:print("<html>")print("<head>")print("<title>No Cookie</title>")print("</head>")print("<body>")print("<p>No user preference cookie found.</p>")print("</body>")print("</html>")

检索Cookie信息

这个模块提供了一个CookieJar类,用于处理和存储Cookie。以下是如何使用这个模块来检索Cookie的示例:

#!/usr/bin/env python3
import http.cookies# 创建一个CookieJar对象来存储Cookie
cookie_jar = http.cookies.CookieJar()# 从请求头中加载Cookie
cookie_jar.extract_cookies(http.client.HTTPResponse(None), None)# 检索所有Cookie
for cookie in cookie_jar:print(f"Name: {cookie.name}")print(f"Value: {cookie.value}")print(f"Domain: {cookie.domain}")print(f"Path: {cookie.path}")print(f"Expires: {cookie.expires}")print(f"Secure: {cookie.is_secure}")print(f"HttpOnly: {cookie.is_http_only}")print(f"SameSite: {cookie.samesite}")print()

我们首先创建了一个CookieJar对象,然后使用extract_cookies方法从请求头中加载Cookie。之后,我们遍历CookieJar对象中的所有Cookie,并打印出它们的名称、值、域名、路径、过期时间、是否安全(Secure)、是否仅通过HTTP头(HttpOnly)以及SameSite属性。

文件上传实例

文件上传是Web应用程序中的一个常见功能,允许用户将文件(如图片、文档等)从客户端上传到服务器。以下是使用HTML和Python实现文件上传功能的基本步骤。

1. 创建HTML表单

首先,你需要创建一个包含元素的HTML表单,该元素类型设置为"file",允许用户选择要上传的文件。

<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><title>File Upload Example</title>
</head>
<body><form action="upload_script.py" method="POST" enctype="multipart/form-data"><input type="file" name="file_to_upload"><input type="submit" value="Upload File"></form>
</body>
</html>

2. 编写Python脚本处理上传

接下来,你需要一个Python脚本来处理上传的文件。这个脚本将接收文件数据,并可以选择将其保存到服务器的文件系统中。

#!/usr/bin/env python3
import cgi
import os# 创建一个FieldStorage对象来处理表单数据
form = cgi.FieldStorage()# 检查是否有文件被上传
if 'file_to_upload' in form:file_item = form['file_to_upload']# 获取文件名filename = file_item.filename# 确保文件名不是非法的if not filename.endswith('.txt'):print("Content-Type: text/html")print()print("<html><body>Invalid file type. Only .txt files are allowed.</body></html>")exit()# 保存文件到服务器with open(os.path.join('/uploads', filename), 'wb') as file:file.write(file_item.file.read())print("Content-Type: text/html")print()print("<html><body>File successfully uploaded.</body></html>")
else:print("Content-Type: text/html")print()print("<html><body>No file was uploaded.</body></html>")

我们首先创建了一个FieldStorage对象来处理表单数据。然后,我们检查是否有名为file_to_upload的文件项。如果有,我们获取文件名并确保它是一个合法的.txt文件。之后,我们将文件保存到服务器的/uploads目录下。

文件下载对话框

在Web浏览器中,文件下载通常是由服务器响应的Content-Disposition头部触发的,该头部指示响应应该被解释为下载。当服务器返回一个带有Content-Disposition: attachment头的响应时,浏览器会自动提示用户保存文件。
以下是一个简单的Python脚本示例,它将创建一个HTTP响应,并设置Content-Disposition头部以触发文件下载对话框。

#!/usr/bin/env python3
import http.server
import socketserver
import os# 定义本地服务器地址和端口
address = ('127.0.0.1', 8000)# 定义文件下载路径
download_path = '/path/to/your/file.txt'# 创建HTTP服务器
class DownloadHandler(http.server.SimpleHTTPRequestHandler):def do_GET(self):# 检查请求的路径是否与要下载的文件匹配if self.path == download_path:# 设置Content-Disposition头部以触发下载self.send_response(200)self.send_header('Content-Disposition', 'attachment; filename="file.txt"')self.end_headers()# 打开文件并发送内容with open(download_path, 'rb') as file:self.copyfile(file, self.wfile)returnelse:# 如果请求的路径不是下载路径,则返回404错误self.send_response(404)self.end_headers()# 启动服务器
httpd = socketserver.TCPServer(address, DownloadHandler)
httpd.serve_forever()

们定义了一个简单的HTTP服务器,它监听本地主机的8000端口。当服务器接收到对特定路径(在本例中为/path/to/your/file.txt)的GET请求时,它会发送一个带有Content-Disposition: attachment头的响应,从而触发浏览器下载该文件。
要测试这个脚本,你需要将其保存为download_server.py,然后使用Python运行它。同时,确保download_path变量指向一个实际存在的文件。
在浏览器中,访问http://127.0.0.1:8000/path/to/your/file.txt,你应该会看到一个下载对话框,提示你保存文件。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/719207.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

java导出多个xml文件的压缩zip

代码&#xff1a; // 设置响应头response.setCharacterEncoding("UTF-8");//设置响应的字符编码为UTF-8response.setContentType("application/octet-stream");//设置响应的内容类型为二进制流&#xff0c;通常用于文件下载。response.setHeader("Con…

解释一下前端框架中的虚拟DOM(virtual DOM)和实际DOM(real DOM)之间的关系。

聚沙成塔每天进步一点点 ⭐ 专栏简介 前端入门之旅&#xff1a;探索Web开发的奇妙世界 欢迎来到前端入门之旅&#xff01;感兴趣的可以订阅本专栏哦&#xff01;这个专栏是为那些对Web开发感兴趣、刚刚踏入前端领域的朋友们量身打造的。无论你是完全的新手还是有一些基础的开发…

leetcode日记(36)全排列

想思路想了很久……思路对了应该会很好做。 我的思路是这样的&#xff1a;只变化前n个数字&#xff0c;不断增加n&#xff0c;由2到nums.size()&#xff0c;使用递归直到得到所有结果 代码如下&#xff1a; class Solution { public:vector<vector<int>> permut…

正信法律:借款纠纷的民事起诉状怎么写

在借款纠纷中&#xff0c;当协商无果时&#xff0c;诉诸法律成为债权人追回债务的有效途径。而民事起诉状作为启动诉讼程序的法律文书&#xff0c;其撰写质量直接关系到案件的受理与判决。本文旨在简明扼要地阐述如何撰写一份规范的借款纠纷民事起诉状。 起诉状需包含以下几个关…

阿克曼转向车型导航末段位姿调整控制

1目标 分析RPP算法时控制器算法学习1-RPP受控纯追踪算法发现,在终点时如果角度还有较大偏差,该算法无法进行很好的调整,故开始尝试在末端接近目标点时,用自己的控制算法去调整位姿,姑且命名为TEA算法(Target-End-Adjust Algorithm for Ackermann) 2控制思路 step1. 将…

【百度】B端数据中台组_大数据研发工程师(J68899)

北京市技术3人2023-12-14 工作职责&#xff1a; 负责百家号和Feed相关大数据的基础建设负责数仓引擎、Spark底层的优化和基础建设为百度系APP相关业务分析及策略优化提供大数据支持参与百度系APP日志数据架构开发和APP端性能分析平台建设 职责要求&#xff1a; 本科及以上学…

C# Onnx segment-anything 分割万物 一键抠图

目录 介绍 效果 模型信息 sam_vit_b_decoder.onnx sam_vit_b_encoder.onnx 项目 代码 下载 C# Onnx segment-anything 分割万物 一键抠图 介绍 github地址&#xff1a;https://github.com/facebookresearch/segment-anything The repository provides code for runn…

设计模式(十二)享元模式

请直接看原文: 原文链接:设计模式&#xff08;十二&#xff09;享元模式-CSDN博客 -------------------------------------------------------------------------------------------------------------------------------- 享元模式定义 享元模式是结构型设计模式的一种&am…

Kubernetes-1

学习Kubernetes第一天 k8s-11、什么是Kubernetes2、配置Kubernetes2.1、准备三台全新的虚拟机2.2、关闭防火墙和SElinux2.3、修改主机名2.4、升级操作系统(三台一起操作)2.5、配置主机hosts文件&#xff0c;相互之间通过主机名互相访问2.6、配置master和node之间的免密通道2.7、…

KMP算法和Manacher算法

KMP算法 KMP算法解决的问题 KMP算法用来解决字符串匹配问题: 找到长串中短串出现的位置. KMP算法思路 暴力比较与KMP的区别 暴力匹配: 对长串的每个位,都从头开始匹配短串的所有位. KMP算法: 将短字符串前后相同的部分存储在 n e x t next next数组里,让之前匹配过的信息指…

我的单片机入门之旅

我的单片机入门之旅 前言 单片机作为现代电子技术的重要组成部分&#xff0c;广泛应用于各个领域。而作为一个初学者&#xff0c;我对单片机一无所知。但是&#xff0c;通过不断的学习和实践&#xff0c;我逐渐掌握了单片机的基本概念和使用方法。在我的单片机入门之旅中&…

【每日前端面经】2024-03-03

题目来源: 牛客 说说你对Vue3的理解&#xff1f; Vue2面对对象编程&#xff0c;Vue3函数时编程对TS支持的更好选项式API替代组合式API响应式原理由Object.defineProperty变为Proxy支持template中存在多个根节点重写虚拟DOM增加setup修饰符支持tree-shaking&#xff0c;减小体…

代码随想录算法训练营(动态规划10,11 股票问题)| 121. 买卖股票的最佳时机 122.买卖股票的最佳时机II

动态规划10 动态规划5步曲&#xff0c;个人感觉应该加一步状态分析 状态分析&#xff1a; 列出所有的状态&#xff0c;将状态归纳后定义dp数组状态转移&#xff0c;状态怎么转移也就是递推公式是什么 买卖股票的动规五部曲分析如下&#xff1a; 1 确定dp数组&#xff08;d…

pytorch中的可学习查找表实现之nn.Embedding

假设我们需要一个查找表&#xff08;Lookup Table&#xff09;&#xff0c;我们可以根据索引数字快速定位查找表中某个具体位置并读取出来。最简单的方法&#xff0c;可以通过一个二维数组或者二维list来实现。但如果我希望查找表的值可以通过梯度反向传播来修改&#xff0c;那…

上传项目的全部依赖到maven私有仓库-nexus

背景 项目之前的私有仓库不能使用了&#xff0c;本地仓库可以&#xff0c;但是一旦clean就没了&#xff0c;所以在本地有依赖的时候可以自己搭建一个maven私有仓库然后将依赖全部上传上去 搭建&#xff1a;使用docker-compose方式搭建 docker-compose文件 version: "3…

C语言入门到精通之练习47:一个偶数总能表示为两个素数之和。

题目&#xff1a;一个偶数总能表示为两个素数之和。 程序分析&#xff1a;我去&#xff0c;这是什么题目&#xff0c;要我证明这个问题吗&#xff1f;真不知道怎么证明。那就把一个偶数串联成两个素数吧。 实例 #include<stdio.h> #include<stdlib.h> int Isprime…

Python算法100例-3.1 回文数

完整源代码项目地址&#xff0c;关注博主私信源代码后可获取 1.问题描述2.问题分析3.算法设计4.确定程序框架5.完整的程序6.问题拓展7.巧用字符串技巧 1&#xff0e;问题描述 打印所有不超过n&#xff08;取n<256&#xff09;的其平方具有对称性质的数&#xff08;也称回…

在国内如何申请US,visa卡?

随着跨境与AI的发展大家对美国虚拟卡的需求也越来越多&#xff0c;比如说亚马逊、ebay、Etsy、ChatGPTPLUS、midjourney、POE等等软件以及海淘的需要&#xff0c;所以我们需要用到美国虚拟卡的场景就越来越多 如何获得一张US 虚拟信用卡&#xff1f; 方法很简单&#xff0c;点…

一线大厂软件测试面试题及答案解析,2024最强版...

【软件测试面试突击班】2024吃透软件测试面试最全八股文攻略教程&#xff0c;一周学完让你面试通过率提高90%&#xff01;&#xff08;自动化测试&#xff09; 1、什么是兼容性测试?兼容性测试侧重哪些方面? 参考答案: 兼容测试主要是检查软件在不同的硬件平台、软件平台上…

CNAN知识图谱辅助推荐系统

CNAN知识图谱辅助推荐系统 文章介绍了一个基于KG的推荐系统模型&#xff0c;代码也已开源&#xff0c;可以看出主要follow了KGNN-LS 。算法流程大致如下&#xff1a; 1. 算法介绍 算法除去attention机制外&#xff0c;主要的思想在于&#xff1a;user由交互过的item来表示、i…