파이썬 CGI 프로그램
CGI는 무엇인가
다음과 같이 현재 NCSA에 의해 유지 CGI는 NCSA의 CGI 정의된다 :
CGI (공통 게이트웨이 인터페이스)와 같은 서버에서 실행되는 프로그램이며, 공통 게이트웨이 인터페이스 : HTTP 서버와 같은 HTML 페이지를 제공하는 클라이언트 인터페이스.
웹 브라우징
더 나은 CGI 작동 방식을 이해하기 위해, 우리는 프로세스의 웹 페이지 또는 URL에 링크를 클릭 할 수 있습니다 :
- 하나는 HTTP 웹 서버에 URL에 액세스하여 연결하는 브라우저를 사용합니다.
- 도 2를 참조하면, 웹 서버는, 그렇지 않으면 에러 메시지를 반환 요청 메시지는 URL을 해석하고 파일의 내용을 리턴 있다면,이 경우 서버에 액세스 한 파일을보고한다 수신한다.
- 도 3을 참조하면, 브라우저는 서버로부터 정보를 수신하고, 수신 된 파일 또는 에러 메시지를 표시한다.
CGI 프로그램은 파이썬 스크립트, PERL 스크립트, 쉘 스크립트, C 또는 C ++ 프로그램이 될 수 있습니다.
CGI 차트
웹 서버 구성 및 지원
당신이 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
첫 번째 CGI 프로그램
우리는 hello.py라는 첫 번째 CGI 프로그램을 작성하기 위해 파이썬을 사용하여 다음과 같이 파일 인 / var / www /에서의 cgi-bin 디렉토리에 있습니다 :
#!/usr/bin/python # -*- coding: UTF-8 -*- 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과 콘텐츠 형식"의 스크립트입니다.
빈 줄을 인쇄 출력은 헤더 정보의 서버 종료를 알리는 데 사용됩니다.
HTTP 헤더
hello.py의 파일 내용 : HTTP 헤더 부분은 "콘텐츠 타입 텍스트 / HTML"은, 그것은 브라우저 파일 지시 브라우저 컨텐트 유형으로 전송 될 것이다.
다음과 같이 HTTP 헤더 형식은 다음과 같습니다
HTTP 字段名: 字段内容
예를 들면 :
Content-type: text/html
다음 표는 HTTP 헤더 CGI 프로그램의 정보가 종종 사용된다 설명 :
머리 | 기술 |
---|---|
콘텐츠 형식 : | 상기 정보 요구에 상응하는 MIME 엔티티. 예를 들어 콘텐츠 유형 : 텍스트 / html로 |
만료 날짜 : | 응답 일시 만료 |
위치 : URL | 새로운 리소스의 요청 또는 식별을 완료되지 않은 위치 URL 요청에받는 리디렉션 |
마지막으로 수정 된 날짜 : | 요청 된 자원이 마지막으로 수정 |
콘텐츠 길이 : N | 콘텐츠 길이 요청 |
설정 - 쿠키 : 문자열 | HTTP 쿠키 설정 |
CGI 환경 변수
모든 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/python # -*- coding: UTF-8 -*- # filename:test.py 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 방법
서버에 브라우저 클라이언트는 방법은 GET과 POST 방식 모두있는 두 가지 방법으로 정보를 제공합니다.
데이터 전송의 GET 메소드를 사용하여
서버에 상기 인코딩 된 사용자 정보를 전송하는 방법을 얻는, 상기 데이터 정보는 다음과 같이 나눌 수 페이지 요청의 URL에 포함 된 "?"
http://www.test.com/cgi-bin/hello.py?key1=value1&key2=value2다른 의견의 일부에 대한 요청을 GET :
- GET 요청은 캐시 할 수 있습니다
- GET 요청은 브라우저 기록에 남아
- 요청 북마크 할 수 있습니다 GET
- 민감한 데이터를 처리 할 때 요청이 사용되어서는 안 GET
- GET 요청은 길이 제한이
- 요청은 데이터를 검색하는 데 사용되어야 GET
단순 URL의 예 : 방법을 GET
다음은 프로그램을 hello_get.py하는 두 개의 매개 변수를 전송하는 GET 메소드를 사용하여 간단한 URL입니다 :
/cgi-bin/test.py?name=本教程&url=http://www.w3big.com
코드 hello_get.py 파일 :
#!/usr/bin/python # -*- coding: UTF-8 -*- # filename:test.py # 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
브라우저 출력을 요청합니다
간단한 형태의 예 : 방법을 GET
다음 다음은 두 가지가 HTML 폼 통해 GET 방법을 사용하여 서버에 데이터를 송신하고, 동일한 서버 스크립트 hello_get.py 파일을 제출 hello_get.html 코드 :
<!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title>本教程(w3big.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.html 파일을 수정한다 :
chmod 755 hello_get.html
다음과 같이 GIF 프리젠 테이션은 다음과 같습니다
데이터를 전달하기 위해 POST 메서드를 사용하여
서버가 더 안전하고 신뢰할하는 POST 메소드를 사용하여 사용자 암호 데이터를 전송하기 위해 POST를 사용할 필요가 민감한 정보와 같은 데이터를 전달한다.
다음은 또한 브라우저가 제출 POST 폼 데이터를 처리 할 수도있다 hello_get.py :
#!/usr/bin/python # -*- coding: UTF-8 -*- # 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>本教程(w3big.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>
다음과 같이 GIF 프리젠 테이션은 다음과 같습니다
CGI 프로그램은 체크 박스를 통해 데이터를 전달하는
다음과 같은 하나 이상의 옵션 데이터를 전송하는 데 사용되는 체크 박스, HTML 코드 :
<!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title>本教程(w3big.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/python # -*- coding: UTF-8 -*- # 引入 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
브라우저 액세스 지프 프리젠 테이션 차트 :
CGI 프로그램을 통해 무선 데이터 전송
다음 라디오 만 서버로 데이터를 전송하고, HTML 코드 :
<!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title>本教程(w3big.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/python # -*- coding: UTF-8 -*- # 引入 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
브라우저 액세스 지프 프리젠 테이션 차트 :
CGI 프로그램을 통해 텍스트 영역의 데이터를 전송
다음과 같이 서버에 데이터의 여러 행 텍스트 영역 패스, HTML 코드는 다음과 같습니다
<!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title>本教程(w3big.com)</title> </head> <body> <form action="/cgi-bin/textarea.py" method="post" target="_blank"> <textarea name="textcontent" cols="40" rows="4"> 在这里输入内容... </textarea> <input type="submit" value="提交" /> </form> </body> </html>
다음과 같이 textarea.py 스크립트 코드는 다음과 같습니다
#!/usr/bin/python # -*- coding: UTF-8 -*- # 引入 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
브라우저 액세스 지프 프리젠 테이션 차트 :
드롭 다운 패스 데이터를 CGI 프로그램을 통해.
HTML 드롭 다운 상자 코드를 다음과 같이 :
<!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title>本教程(w3big.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/python # -*- coding: UTF-8 -*- # 引入 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
브라우저 액세스 지프 프리젠 테이션 차트 :
CGI는 쿠키를 사용합니다
큰 단점에서 HTTP 프로토콜은 프로그래머에게 불편의 큰 거래를 제공하여 사용자의 신원을 판단 할 문제이지만,이 결핍 위해 만든 쿠키 기능이 나타납니다.
ID를 결정하는 기능을 달성하도록 클라이언트 하드 디스크에 고객의 브라우저를 통해 고객이 고객이 다음 스크립트를 방문 할 때 데이터를 검색, 데이터 레코드를 작성하는 동안 스크립트에 액세스 쿠키는 쿠키 일반적 신원 확인에 사용했다.
쿠키 구문
다음과 같이 HTTP 쿠키를 달성하기 위해 HTTP 헤더를 통해 전송되고, 그 파일을 전송했다, 헤더 설정 쿠키 구문은 다음과 같습니다
Set-cookie:name=name;expires=date;path=path;domain=domain;secure
- 이름 = 이름 :; 여러 이름 값이있는 경우 (번호 ""및 ""이름이 사용될 수 없다) 쿠키의 값을 ";", 예를 들어 분리 : NAME1 = NAME1; NAME2 = NAME2 ; NAME3 = NAME3.
- 형식 쿠키 유효 기간 : = 날짜를 만료 = "Wdy, DD- 만료 월 - YYYY의 HH를 : MM를 : SS를"
- 경로 = 경로 : 경로 설정 쿠키 지원, 경로, 예를 들어 경로, 발효 디렉토리 엔트리의 모든 파일 및 서브 디렉토리의 쿠키 인 경우 : 경로 = "/ CGI-빈 /" 경로가 파일 인 경우, 쿠키 그것은 예를 들어,이 파일의 발효를 의미 = "이 방법으로 / cgi-bin / cookie.cgi"경로입니다.
- 도메인 = 도메인 : 쿠키의 도메인 네임 예를 들어, 유효 : 도메인 = "www.w3big.com"
- 고정이 플래그가 지정된 경우에만 쿠키 SSL 프로토콜 HTTPS 서버를 통해 전송 될 수있다.
- 쿠키는 쿠키 변수를 검색하여 정보를 얻을 수 있고, 환경 변수 HTTP_COOKIE 달성 CGI 프로그램을 설정하여 수신된다.
쿠키 설정
쿠키 설정, 쿠키는 HTTP 헤더에 개별적으로 매우 간단 전송됩니다된다. 다음 예는 이름을 설정하고 쿠키에 만료 :
#!/usr/bin/python # -*- coding: UTF-8 -*- # 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>本教程(w3big.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=value3....
여기 쿠키 정보를 검색하는 간단한 CGI 프로그램은 :
#!/usr/bin/python # -*- coding: UTF-8 -*- # 导入模块 import os import Cookie print "Content-type: text/html" print print """ <html> <head> <meta charset="utf-8"> <title>本教程(w3big.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>本教程(w3big.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/python # -*- coding: UTF-8 -*- 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>本教程(w3big.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/python # -*- coding: UTF-8 -*- # HTTP 头部 print "Content-Disposition: attachment; filename=\"foo.txt\""; print # 打开文件 fo = open("foo.txt", "rb") str = fo.read(); print str # 关闭文件 fo.close()