최고의 Python3 CGI 프로그램 튜토리얼 2024년, 이 튜토리얼에서는 CGI는 무엇인가,웹 브라우징,CGI 차트,웹 서버 구성 및 지원,첫 번째 CGI 프로그램,HTTP 헤더,CGI 환경 변수,GET과 POST 방법,CGI는 쿠키를 사용합니다,쿠키 설정,쿠키 정보 검색,파일 다운로드 대화 상자,를 배울 수 있습니다.
다음과 같이 현재 NCSA에 의해 유지 CGI는 NCSA의 CGI 정의된다 :
CGI (공통 게이트웨이 인터페이스)와 같은 서버에서 실행되는 프로그램이며, 공통 게이트웨이 인터페이스 : HTTP 서버와 같은 HTML 페이지를 제공하는 클라이언트 인터페이스.
더 나은 CGI 작동 방식을 이해하기 위해, 우리는 프로세스의 웹 페이지 또는 URL에 링크를 클릭 할 수 있습니다 :
CGI 프로그램은 파이썬 스크립트, PERL 스크립트, 쉘 스크립트, C 또는 C ++ 프로그램이 될 수 있습니다.
당신이 CGI 프로그래밍을 수행하기 전에 웹 서버가 CGI 및 CGI 처리기를 지원하도록 구성되어 있는지 확인하십시오.
아파치는 CGI 구성을 지원합니다 :
는 CGI 디렉토리를 설정합니다 :
ScriptAlias /cgi-bin/ /var/www/cgi-bin/
CGI 프로그램을 실행하는 모든 HTTP 서버에서 사전 구성된 디렉토리에 저장된다. 이 디렉토리는 CGI 디렉토리라고하며, 규칙에 따라, 그것은는 / var / www /에서의 cgi-bin 디렉토리 지정됩니다.
CGI 파일 확장자가 .cgi는, 파이썬은 또한 평 확장을 사용할 수 있습니다.
기본적으로 CGI-bin 디렉토리를 실행하는 리눅스 서버 구성은 / var / www가있다.
당신이 CGI 스크립트를 실행하려면 다른 디렉토리를 지정하려면 다음과 같이 당신은 httpd.conf 구성 파일을 수정할 수 있습니다 :
<Directory "/var/www/cgi-bin"> AllowOverride None Options +ExecCGI Order allow,deny Allow from all </Directory>
평 접미사 AddHandler에 추가, 그래서 우리는 최종 평 파이썬 스크립트 파일에 액세스 할 수 있습니다 :
AddHandler cgi-script .cgi .pl .py
우리는 hello.py라는 첫 번째 CGI 프로그램을 작성하기 위해 파이썬을 사용하여 다음과 같이 파일 인 / var / www /에서의 cgi-bin 디렉토리에 있습니다 :
#!/usr/bin/python3 print ("Content-type:text/html") print () # 空行,告诉服务器结束头部 print ('<html>') print ('<head>') print ('<meta charset="utf-8">') print ('<title>Hello Word - 我的第一个 CGI 程序!</title>') print ('</head>') print ('<body>') print ('<h2>Hello Word! 我是来自本教程的第一CGI程序</h2>') print ('</body>') print ('</html>')
당신은 파일 수정 hello.py를 저장 한 후, 755에 파일 권한을 수정 :
chmod 755 hello.py
다음과 같이 위의 프로그램이있는 결과를 액세스 할 수있는 브라우저에 표시됩니다 :
브라우저 종류에 보내고 "text / html과"같은 내용을 표시하기 위해 브라우저를 말해 다음 hello.py이 스크립트는 간단한 파이썬 스크립트, 제 1 출력 라인 "text / html과 콘텐츠 형식"의 스크립트입니다.
빈 줄을 인쇄 출력은 헤더 정보의 서버 종료를 알리는 데 사용됩니다.
hello.py의 파일 내용 : HTTP 헤더 부분은 "콘텐츠 타입 텍스트 / HTML"은, 그것은 브라우저 파일 지시 브라우저 컨텐트 유형으로 전송 될 것이다.
다음과 같이 HTTP 헤더 형식은 다음과 같습니다
HTTP 字段名: 字段内容
예를 들면 :
Content-type: text/html
다음 표는 HTTP 헤더 CGI 프로그램의 정보가 종종 사용된다 설명 :
머리 | 기술 |
---|---|
콘텐츠 형식 : | 상기 정보 요구에 상응하는 MIME 엔티티. 예를 들어 콘텐츠 유형 : 텍스트 / html로 |
만료 날짜 : | 응답 일시 만료 |
위치 : URL | 새로운 리소스의 요청 또는 식별을 완료되지 않은 위치 URL 요청에받는 리디렉션 |
마지막으로 수정 된 날짜 : | 요청 된 자원이 마지막으로 수정 |
콘텐츠 길이 : N | 콘텐츠 길이 요청 |
설정 - 쿠키 : 문자열 | HTTP 쿠키 설정 |
모든 CGI 프로그램은 CGI 프로그램에 중요한 역할을 다음과 같은 환경 변수를 받았다 :
변수 이름 | 기술 |
---|---|
CONTENT_TYPE | 이 값을 나타내는 정보 전송의 MIME 타입에 대한 환경 변수있다. 현재, 환경 변수는 일반적으로 CONTENT_TYPE 있습니다 : 응용 프로그램 / x-www-form-urlencoded를, 그는 말했다 HTML 양식의 데이터. |
CONTENT_LENGTH | 전송 모드 서버와 CGI 프로그램 정보, POST 경우 경우에도 환경 변수 STDIN 입력 표준에서 유효한 데이터를 읽을 수있는 바이트의 수. 입력 데이터를 판독이 환경 변수는 사용되어야한다. |
HTTP_COOKIE | 클라이언트 내에서 COOKIE 내용. |
HTTP_USER_AGENT | 정보를 제공하는 것은 클라이언트 브라우저 또는 다른 소유 데이터의 버전 번호를 포함한다. |
PATH_INFO | 이 환경 변수의 값은 즉시 추가적인 경로 정보 후 CGI 프로그램의 이름을 나타낸다. 그것은 종종 인수 CGI 프로그램으로 나타납니다. |
QUERY_STRING | 전송 모드 서버와 CGI 프로그램 정보 인 경우 정보가 전달 된 경우에도 이러한 환경 변수의 값을 얻는다. 이 정보는 물음표 '?'세퍼레이터 가운데 둘은 CGI 프로그램의 이름 따른다. |
REMOTE_ADDR | 이 환경 변수의 값은, 클라이언트의 IP 어드레스는, 예를위한 요구를, 상기 192.168.1.67를 보낸다. 이 값은 항상 존재한다. 그리고 웹 서버의 고유 식별자에 웹 클라이언트가 상이한 웹 클라이언트를 구별하는 CGI 프로그램에 사용될 수 제공 할 필요가있다. |
REMOTE_HOST | 이 환경 변수의 값은 CGI의 요청 클라이언트의 호스트 이름을 포함한다. 당신이 확인하지 않는 경우,이 환경 변수를 정의 할 필요가 없습니다. |
REQUEST_METHOD | 이 스크립트라는 방법을 제공한다. HTTP / 1.0 프로토콜 스크립트에만 GET과 POST 의미. |
SCRIPT_FILENAME | CGI 스크립트의 전체 경로 |
SCRIPT_NAME | CGI 스크립트의 이름 |
SERVER_NAME | 이것은 당신의 웹 서버의 호스트 이름, 별명 또는 IP 주소입니다. |
SERVER_SOFTWARE | 이 환경 변수의 값은 HTTP 서버의 전화 CGI 프로그램 이름 및 버전 번호를 포함한다. 예를 들어, 아파치 / 2.2.14 (유닉스)의 위의 값 |
다음은 간단한 CGI 스크립트 출력 CGI 환경 변수입니다 :
#!/usr/bin/python3 import os print ("Content-type: text/html") print () print ("<meta charset=\"utf-8\">") print ("<b>环境变量</b><br>") print ("<ul>") for key in os.environ.keys(): print ("<li><span style='color:green'>%30s </span> : %s </li>" % (key,os.environ[key])) print ("</ul>")
다음과 같이 위의 점 test.py를 저장하고 755에 파일 권한을 수정, 실행 결과는 다음과 같습니다
서버에 브라우저 클라이언트는 방법은 GET과 POST 방식 모두있는 두 가지 방법으로 정보를 제공합니다.
서버에 상기 인코딩 된 사용자 정보를 전송하는 방법을 얻는, 상기 데이터 정보는 다음과 같이 나눌 수 페이지 요청의 URL에 포함 된 "?"
http://www.test.com/cgi-bin/hello.py?key1=value1&key2=value2다른 의견의 일부에 대한 요청을 GET :
다음은 프로그램을 hello_get.py하는 두 개의 매개 변수를 전송하는 GET 메소드를 사용하여 간단한 URL입니다 :
/cgi-bin/test.py?name=本教程&url=http://www.w3write.com
코드 hello_get.py 파일 :
#!/usr/bin/python3 # CGI处理模块 import cgi, cgitb # 创建 FieldStorage 的实例化 form = cgi.FieldStorage() # 获取数据 site_name = form.getvalue('name') site_url = form.getvalue('url') print ("Content-type:text/html") print () print ("<html>") print ("<head>") print ("<meta charset=\"utf-8\">") print ("<title>本教程 CGI 测试实例</title>") print ("</head>") print ("<body>") print ("<h2>%s官网:%s</h2>" % (site_name, site_url)) print ("</body>") print ("</html>")
당신은 파일 수정 hello_get.py을 저장 한 후, 755에 파일 권한을 수정 :
chmod 755 hello_get.py
브라우저 출력을 요청합니다
다음 다음은 두 가지가 HTML 폼 통해 GET 방법을 사용하여 서버에 데이터를 송신하고, 동일한 서버 스크립트 hello_get.py 파일을 제출 hello_get 코드 :
<!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title>本教程(w3write.com)</title> </head> <body> <form action="/cgi-bin/hello_get.py" method="get"> 站点名称: <input type="text" name="name"> <br /> 站点 URL: <input type="text" name="url" /> <input type="submit" value="提交" /> </form> </body> </html>
기본적으로 만 스크립트 파일을 저장할 수있는 CGI-bin 디렉토리, 우리는 테스트 디렉토리하에 권한 755로 저장 hello_get 파일을 수정한다 :
chmod 755 hello_get
다음과 같이 GIF 프리젠 테이션은 다음과 같습니다
서버가 더 안전하고 신뢰할하는 POST 메소드를 사용하여 사용자 암호 데이터를 전송하기 위해 POST를 사용할 필요가 민감한 정보와 같은 데이터를 전달한다.
다음은 또한 브라우저가 제출 POST 폼 데이터를 처리 할 수도있다 hello_get.py :
#!/usr/bin/python3 # CGI处理模块 import cgi, cgitb # 创建 FieldStorage 的实例化 form = cgi.FieldStorage() # 获取数据 site_name = form.getvalue('name') site_url = form.getvalue('url') print ("Content-type:text/html") print () print ("<html>") print ("<head>") print ("<meta charset=\"utf-8\">") print ("<title>本教程 CGI 测试实例</title>") print ("</head>") print ("<body>") print ("<h2>%s官网:%s</h2>" % (site_name, site_url)) print ("</body>") print ("</html>")
다음은 POST 방법 (방법 = "게시물")하여 서버 스크립트 hello_get.py에 데이터를 제출하는 형태이다 :
<!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title>本教程(w3write.com)</title> </head> <body> <form action="/cgi-bin/hello_get.py" method="post"> 站点名称: <input type="text" name="name"> <br /> 站点 URL: <input type="text" name="url" /> <input type="submit" value="提交" /> </form> </body> </html> </form>
다음과 같이 GIF 프리젠 테이션은 다음과 같습니다
다음과 같은 하나 이상의 옵션 데이터를 전송하는 데 사용되는 체크 박스, HTML 코드 :
<!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title>本教程(w3write.com)</title> </head> <body> <form action="/cgi-bin/checkbox.py" method="POST" target="_blank"> <input type="checkbox" name="w3big" value="on" /> 本教程 <input type="checkbox" name="google" value="on" /> Google <input type="submit" value="选择站点" /> </form> </body> </html>
코드 checkbox.py 파일 :
#!/usr/bin/python3 # 引入 CGI 处理模块 import cgi, cgitb # 创建 FieldStorage的实例 form = cgi.FieldStorage() # 接收字段数据 if form.getvalue('google'): google_flag = "是" else: google_flag = "否" if form.getvalue('w3big'): w3big_flag = "是" else: w3big_flag = "否" print ("Content-type:text/html") print () print ("<html>") print ("<head>") print ("<meta charset=\"utf-8\">") print ("<title>本教程 CGI 测试实例</title>") print ("</head>") print ("<body>") print ("<h2> 本教程是否选择了 : %s</h2>" % w3big_flag) print ("<h2> Google 是否选择了 : %s</h2>" % google_flag) print ("</body>") print ("</html>")
checkbox.py 권한을 수정합니다 :
chmod 755 checkbox.py
브라우저 액세스 지프 프리젠 테이션 차트 :
다음 라디오 만 서버로 데이터를 전송하고, HTML 코드 :
<!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title>本教程(w3write.com)</title> </head> <body> <form action="/cgi-bin/radiobutton.py" method="post" target="_blank"> <input type="radio" name="site" value="w3big" /> 本教程 <input type="radio" name="site" value="google" /> Google <input type="submit" value="提交" /> </form> </body> </html>
다음과 같이 radiobutton.py 스크립트 코드는 다음과 같습니다
#!/usr/bin/python3 # 引入 CGI 处理模块 import cgi, cgitb # 创建 FieldStorage的实例 form = cgi.FieldStorage() # 接收字段数据 if form.getvalue('site'): site = form.getvalue('site') else: site = "提交数据为空" print ("Content-type:text/html") print () print ("<html>") print ("<head>") print ("<meta charset=\"utf-8\">") print ("<title>本教程 CGI 测试实例</title>") print ("</head>") print ("<body>") print ("<h2> 选中的网站是 %s</h2>" % site) print ("</body>") print ("</html>")
radiobutton.py 권한을 수정합니다 :
chmod 755 radiobutton.py
브라우저 액세스 지프 프리젠 테이션 차트 :
다음과 같이 서버에 데이터의 여러 행 텍스트 영역 패스, HTML 코드는 다음과 같습니다
<!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title>本教程(w3write.com)</title> </head> <body> <form action="/cgi-bin/textarea.py" method="post" target="_blank"> <textarea name="textcontent" cols="40" rows="4"> 在这里输入内容ko. </textarea> <input type="submit" value="提交" /> </form> </body> </html>
다음과 같이 textarea.py 스크립트 코드는 다음과 같습니다
#!/usr/bin/python3 # 引入 CGI 处理模块 import cgi, cgitb # 创建 FieldStorage的实例 form = cgi.FieldStorage() # 接收字段数据 if form.getvalue('textcontent'): text_content = form.getvalue('textcontent') else: text_content = "没有内容" print ("Content-type:text/html") print () print ("<html>") print ("<head>") print ("<meta charset=\"utf-8\">") print ("<title>本教程 CGI 测试实例</title>") print ("</head>") print ("<body>") print ("<h2> 输入的内容是:%s</h2>" % text_content) print ("</body>") print ("</html>")
textarea.py 권한을 수정합니다 :
chmod 755 textarea.py
브라우저 액세스 지프 프리젠 테이션 차트 :
HTML 드롭 다운 상자 코드를 다음과 같이 :
<!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title>本教程(w3write.com)</title> </head> <body> <form action="/cgi-bin/dropdown.py" method="post" target="_blank"> <select name="dropdown"> <option value="w3big" selected>本教程</option> <option value="google">Google</option> </select> <input type="submit" value="提交"/> </form> </body> </html>
dropdown.py 스크립트 코드를 다음과 같이 :
#!/usr/bin/python3 # 引入 CGI 处理模块 import cgi, cgitb # 创建 FieldStorage的实例 form = cgi.FieldStorage() # 接收字段数据 if form.getvalue('dropdown'): dropdown_value = form.getvalue('dropdown') else: dropdown_value = "没有内容" print ("Content-type:text/html") print () print ("<html>") print ("<head>") print ("<meta charset=\"utf-8\">") print ("<title>本教程 CGI 测试实例</title>") print ("</head>") print ("<body>") print ("<h2> 选中的选项是:%s</h2>" % dropdown_value) print ("</body>") print ("</html>")
dropdown.py 권한을 수정합니다 :
chmod 755 dropdown.py
브라우저 액세스 지프 프리젠 테이션 차트 :
큰 단점에서 HTTP 프로토콜은 프로그래머에게 불편의 큰 거래를 제공하여 사용자의 신원을 판단 할 문제이지만,이 결핍 위해 만든 쿠키 기능이 나타납니다.
ID를 결정하는 기능을 달성하도록 클라이언트 하드 디스크에 고객의 브라우저를 통해 고객이 고객이 다음 스크립트를 방문 할 때 데이터를 검색, 데이터 레코드를 작성하는 동안 스크립트에 액세스 쿠키는 쿠키 일반적 신원 확인에 사용했다.
다음과 같이 HTTP 쿠키를 달성하기 위해 HTTP 헤더를 통해 전송되고, 그 파일을 전송했다, 헤더 설정 쿠키 구문은 다음과 같습니다
Set-cookie:name=name;expires=date;path=path;domain=domain;secure
쿠키 설정, 쿠키는 HTTP 헤더에 개별적으로 매우 간단 전송됩니다된다. 다음 예는 이름을 설정하고 쿠키에 만료 :
#!/usr/bin/python3 # print ('Content-Type: text/html') print ('Set-Cookie: name="本教程";expires=Wed, 28 Aug 2016 18:30:00 GMT') print () print (""" <html> <head> <meta charset="utf-8"> <title>本教程(w3write.com)</title> </head> <body> <h1>Cookie set OK!</h1> </body> </html> """)
cookie_set.py 위의 코드를 저장하고 cookie_set.py 권한을 수정 :
chmod 755 cookie_set.py
위의 예는 쿠키 정보를 설정하려면 Set-Cookie 헤더를 사용 옵션은 쿠키를 같은 시간이 만료 만료 도메인 도메인, 경로 경로와 같은 다른 속성을 설정합니다. 이 정보가 제공됩니다 : "콘텐츠 형식 text / html과"전에.
쿠키 정보 검색 페이지는 쿠키 정보가 저장되어 다음과 같이 CGI 환경 변수 HTTP_COOKIE으로, 저장 형식은 매우 간단하다 :
key1=value1;key2=value2;key3=value3koko
여기 쿠키 정보를 검색하는 간단한 CGI 프로그램은 :
#!/usr/bin/python3 # 导入模块 import os import Cookie print ("Content-type: text/html") print () print (""" <html> <head> <meta charset="utf-8"> <title>本教程(w3write.com)</title> </head> <body> <h1>读取cookie信息</h1> """) if 'HTTP_COOKIE' in os.environ: cookie_string=os.environ.get('HTTP_COOKIE') c=Cookie.SimpleCookie() c.load(cookie_string) try: data=c['name'].value print ("cookie data: "+data+"<br>") except KeyError: print ("cookie 没有设置或者已过去<br>") print (""" </body> </html> """)
cookie_get.py 위의 코드를 저장하고 cookie_get.py 권한을 수정 :
chmod 755 cookie_get.py
다음과 같이 더 많은 색 지프 쿠키 설정은 다음과 같습니다
HTML 설정 파일은 다음과 같이 / 코드를 폼 데이터를으로 multipart하기에 enctype 속성을 설정해야합니다 업로드 :
<!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title>本教程(w3write.com)</title> </head> <body> <form enctype="multipart/form-data" action="/cgi-bin/save_file.py" method="post"> <p>选中文件: <input type="file" name="filename" /></p> <p><input type="submit" value="上传" /></p> </form> </body> </html>
다음과 같이 save_file.py 스크립트 파일의 코드는 다음과 같습니다
#!/usr/bin/python3 import cgi, os import cgitb; cgitb.enable() form = cgi.FieldStorage() # 获取文件名 fileitem = form['filename'] # 检测文件是否上传 if fileitem.filename: # 设置文件路径 fn = os.path.basename(fileitem.filename) open('/tmp/' + fn, 'wb').write(fileitem.file.read()) message = '文件 "' + fn + '" 上传成功' else: message = '文件没有上传' print ("""\ Content-Type: text/html\n <html> <head> <meta charset="utf-8"> <title>本教程(w3write.com)</title> </head> <body> <p>%s</p> </body> </html> """ % (message,))
save_file.py 위의 코드를 저장하고 save_file.py 권한을 수정 :
chmod 755 save_file.py
다음과 같이 더 많은 색 지프 쿠키 설정은 다음과 같습니다
유닉스 / 리눅스를 사용하는 경우, 당신은 할 수 있습니다 오픈 () 문을 사용할 필요가 창에서 파일 분리를 교체해야합니다 :
fn = os.path.basename(fileitem.filename.replace("\\", "/" ))
우리는 프로그램을 다운로드 현재 디렉토리에 foo.txt의 파일을 만듭니다.
다음 함수 코드가 구현하는 HTTP 헤더 정보를 설정하여 파일을 다운로드 :
#!/usr/bin/python3 # HTTP 头部 print ("Content-Disposition: attachment; filename=\"foo.txt\"") print () # 打开文件 fo = open("foo.txt", "rb") str = fo.read(); print (str) # 关闭文件 fo.close()