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.pswp.cn/news/719207.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/719207.shtml
英文地址,請注明出處:http://en.pswp.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…