Python 3-CGI 프로그래밍
CGI (Common Gateway Interface)는 웹 서버와 사용자 지정 스크립트간에 정보가 교환되는 방식을 정의하는 표준 집합입니다. CGI 사양은 현재 NCSA에서 관리합니다.
CGI 란 무엇입니까?
CGI (Common Gateway Interface)는 HTTP 서버와 같은 정보 서버와 인터페이스하기위한 외부 게이트웨이 프로그램의 표준입니다.
현재 버전은 CGI / 1.1이며 CGI / 1.2가 진행 중입니다.
웹 브라우징
CGI의 개념을 이해하기 위해 하이퍼 링크를 클릭하여 특정 웹 페이지 또는 URL을 검색 할 때 어떤 일이 발생하는지 살펴 보겠습니다.
브라우저가 HTTP 웹 서버에 접속하여 URL, 즉 파일 이름을 요구합니다.
Web Server는 URL을 구문 분석하고 파일 이름을 찾습니다. 해당 파일을 찾으면 브라우저로 다시 보내고, 그렇지 않으면 잘못된 파일을 요청했음을 나타내는 오류 메시지를 보냅니다.
웹 브라우저는 웹 서버에서 응답을 받고 수신 된 파일 또는 오류 메시지를 표시합니다.
그러나 특정 디렉토리의 파일이 요청 될 때마다 해당 파일이 다시 전송되지 않도록 HTTP 서버를 설정할 수 있습니다. 대신 프로그램으로 실행되고 해당 프로그램이 출력하는 모든 내용이 브라우저에 표시되도록 다시 전송됩니다. 이 기능을 Common Gateway Interface 또는 CGI라고하며 프로그램을 CGI 스크립트라고합니다. 이러한 CGI 프로그램은 Python 스크립트, PERL 스크립트, 쉘 스크립트, C 또는 C ++ 프로그램 등이 될 수 있습니다.
CGI 아키텍처 다이어그램
웹 서버 지원 및 구성
CGI 프로그래밍을 진행하기 전에 웹 서버가 CGI를 지원하고 CGI 프로그램을 처리하도록 구성되어 있는지 확인하십시오. HTTP 서버에 의해 실행되는 모든 CGI 프로그램은 미리 구성된 디렉토리에 보관됩니다. 이 디렉토리를 CGI 디렉토리라고하며 관례 적으로 / var / www / cgi-bin으로 이름이 지정됩니다. 관례 상 CGI 파일의 확장자는.cgi, 하지만 파이썬 확장자로 파일을 유지할 수 있습니다. .py 게다가.
기본적으로 Linux 서버는 / var / www의 cgi-bin 디렉토리에있는 스크립트 만 실행하도록 구성됩니다. CGI 스크립트를 실행하기 위해 다른 디렉토리를 지정하려면 httpd.conf 파일에 다음 줄을 주석 처리하십시오.
<Directory "/var/www/cgi-bin">
AllowOverride None
Options ExecCGI
Order allow,deny
Allow from all
</Directory>
<Directory "/var/www/cgi-bin">
Options All
</Directory>
여기서는 Web Server가 성공적으로 실행되고 있으며 Perl 또는 Shell 등과 같은 다른 CGI 프로그램을 실행할 수 있다고 가정합니다.
첫 번째 CGI 프로그램
다음은 hello.py 라는 CGI 스크립트에 연결된 간단한 링크 입니다. 이 파일은 / var / www / cgi-bin 디렉토리에 보관되며 다음과 같은 내용이 있습니다. CGI 프로그램을 실행하기 전에 다음을 사용하여 파일 모드를 변경했는지 확인하십시오.chmod 755 hello.py 파일을 실행 가능하게 만드는 UNIX 명령.
#!/usr/bin/python
print ("Content-type:text/html\r\n\r\n")
print ('<html>')
print ('<head>')
print ('<title>Hello Word - First CGI Program</title>')
print ('</head>')
print ('<body>')
print ('<h2>Hello Word! This is my first CGI program</h2>')
print ('</body>')
print ('</html>')
Note− 스크립트의 첫 번째 줄은 Python 실행 파일의 경로 여야합니다. Linux에서는 #! / usr / bin / python3이어야합니다.
브라우저에 다음 URL을 입력하십시오.
http://localhost:8080/cgi-bin/hello.py
Hello Word! This is my first CGI program
이 hello.py 스크립트는 STDOUT 파일, 즉 화면에 출력을 기록하는 간단한 Python 스크립트입니다. 인쇄 할 첫 번째 줄인 중요하고 추가 기능이 하나 있습니다.Content-type:text/html\r\n\r\n. 이 행은 브라우저로 다시 전송되며 브라우저 화면에 표시 할 컨텐츠 유형을 지정합니다.
지금 쯤이면 CGI의 기본 개념을 이해 했어야하며 Python을 사용하여 많은 복잡한 CGI 프로그램을 작성할 수 있습니다. 이 스크립트는 다른 외부 시스템과 상호 작용하여 RDBMS와 같은 정보를 교환 할 수도 있습니다.
HTTP 헤더
라인 Content-type:text/html\r\n\r\n콘텐츠를 이해하기 위해 브라우저로 전송되는 HTTP 헤더의 일부입니다. 모든 HTTP 헤더는 다음과 같은 형식이됩니다.
HTTP Field Name: Field Content
For Example
Content-type: text/html\r\n\r\n
CGI 프로그래밍에서 자주 사용하게 될 다른 중요한 HTTP 헤더는 거의 없습니다.
Sr. 아니. | 헤더 및 설명 |
---|---|
1 | Content-type: 반환되는 파일의 형식을 정의하는 MIME 문자열입니다. 예는 Content-type : text / html입니다. |
2 | Expires: Date 정보가 무효화되는 날짜입니다. 브라우저에서 페이지를 새로 고쳐야하는시기를 결정하는 데 사용됩니다. 유효한 날짜 문자열은 01 Jan 1998 12:00:00 GMT 형식입니다. |
삼 | Location: URL 요청 된 URL 대신 반환되는 URL입니다. 이 필드를 사용하여 요청을 모든 파일로 리디렉션 할 수 있습니다. |
4 | Last-modified: Date 자원을 마지막으로 수정 한 날짜입니다. |
5 | Content-length: N 리턴되는 데이터의 길이 (바이트)입니다. 브라우저는이 값을 사용하여 파일의 예상 다운로드 시간을보고합니다. |
6 | Set-Cookie: String 문자열을 통해 전달되는 쿠키 설정 |
CGI 환경 변수
모든 CGI 프로그램은 다음 환경 변수에 액세스 할 수 있습니다. 이러한 변수는 CGI 프로그램을 작성하는 동안 중요한 역할을합니다.
Sr. 아니. | 변수 이름 및 설명 |
---|---|
1 | CONTENT_TYPE 콘텐츠의 데이터 유형입니다. 클라이언트가 첨부 된 콘텐츠를 서버로 보낼 때 사용됩니다. 예를 들어, 파일 업로드. |
2 | CONTENT_LENGTH 쿼리 정보의 길이입니다. POST 요청에만 사용할 수 있습니다. |
삼 | HTTP_COOKIE 키 및 값 쌍의 형태로 설정된 쿠키를 반환합니다. |
4 | HTTP_USER_AGENT User-Agent 요청 헤더 필드에는 요청을 시작한 사용자 에이전트에 대한 정보가 포함됩니다. 웹 브라우저의 이름입니다. |
5 | PATH_INFO CGI 스크립트의 경로입니다. |
6 | QUERY_STRING GET 메서드 요청과 함께 전송되는 URL 인코딩 정보입니다. |
7 | REMOTE_ADDR 요청하는 원격 호스트의 IP 주소입니다. 이것은 유용한 로깅 또는 인증에 유용합니다. |
8 | REMOTE_HOST 요청하는 호스트의 완전한 이름입니다. 이 정보를 사용할 수없는 경우 REMOTE_ADDR을 사용하여 IR 주소를 가져올 수 있습니다. |
9 | REQUEST_METHOD 요청하는 데 사용되는 방법입니다. 가장 일반적인 방법은 GET 및 POST입니다. |
10 | SCRIPT_FILENAME CGI 스크립트의 전체 경로입니다. |
11 | SCRIPT_NAME CGI 스크립트의 이름입니다. |
12 | SERVER_NAME 서버의 호스트 이름 또는 IP 주소 |
13 | SERVER_SOFTWARE 서버가 실행중인 소프트웨어의 이름과 버전. |
다음은 모든 CGI 변수를 나열하는 작은 CGI 프로그램입니다. 결과를 보려면이 링크를 클릭 하십시오. 환경 가져 오기
#!/usr/bin/python
import os
print ("Content-type: text/html\r\n\r\n");
print ("<font size=+1>Environment</font><\br>");
for param in os.environ.keys():
print ("<b>%20s</b>: %s<\br>" % (param, os.environ[param]))
GET 및 POST 메서드
브라우저에서 웹 서버로 그리고 궁극적으로 CGI 프로그램으로 일부 정보를 전달해야 할 때 많은 상황에 직면했을 것입니다. 대부분의 경우 브라우저는 두 가지 방법을 사용하여이 정보를 웹 서버에 전달합니다. 이러한 메서드는 GET 메서드와 POST 메서드입니다.
GET 메서드를 사용하여 정보 전달
GET 메서드는 페이지 요청에 추가 된 인코딩 된 사용자 정보를 보냅니다. 페이지와 인코딩 된 정보는? 다음과 같이 문자-
http://www.test.com/cgi-bin/hello.py?key1=value1&key2=value2
GET 메서드는 브라우저에서 웹 서버로 정보를 전달하는 기본 방법이며 브라우저의 위치 : 상자에 표시되는 긴 문자열을 생성합니다.
서버에 전달할 비밀번호 또는 기타 민감한 정보가있는 경우 GET 메소드를 사용하지 마십시오.
GET 메서드에는 크기 제한이 있습니다. 요청 문자열에는 1024 자만 보낼 수 있습니다.
GET 메소드는 QUERY_STRING 헤더를 사용하여 정보를 전송하며 QUERY_STRING 환경 변수를 통해 CGI 프로그램에서 액세스 할 수 있습니다.
URL과 함께 키와 값 쌍을 연결하여 정보를 전달하거나 HTML <FORM> 태그를 사용하여 GET 메소드를 사용하여 정보를 전달할 수 있습니다.
간단한 URL 예 : Get 메서드
다음은 GET 메서드를 사용하여 hello_get.py 프로그램에 두 값을 전달하는 간단한 URL입니다.
/cgi-bin/hello_get.py?first_name=ZARA&last_name=ALI아래는 hello_get.py웹 브라우저에서 제공하는 입력을 처리하는 스크립트입니다. 우리는 사용할 것입니다cgi 모듈은 전달 된 정보에 매우 쉽게 액세스 할 수 있도록합니다.
#!/usr/bin/python
# Import modules for CGI handling
import cgi, cgitb
# Create instance of FieldStorage
form = cgi.FieldStorage()
# Get data from fields
first_name = form.getvalue('first_name')
last_name = form.getvalue('last_name')
print ("Content-type:text/html\r\n\r\n")
print ("<html>")
print ("<head>")
print ("<title>Hello - Second CGI Program</title>")
print ("</head>")
print ("<body>")
print ("<h2>Hello %s %s</h2>" % (first_name, last_name))
print ("</body>")
print ("</html>")
이것은 다음 결과를 생성합니다-
Hello ZARA ALI
간단한 FORM 예 : GET 메서드
이 예제는 HTML FORM 및 제출 버튼을 사용하여 두 개의 값을 전달합니다. 이 입력을 처리하기 위해 동일한 CGI 스크립트 hello_get.py를 사용합니다.
<form action = "/cgi-bin/hello_get.py" method = "get">
First Name: <input type = "text" name = "first_name"> <br />
Last Name: <input type = "text" name = "last_name" />
<input type = "submit" value = "Submit" />
</form>
위 양식의 실제 출력은 다음과 같습니다. 이름과 성을 입력 한 다음 제출 버튼을 클릭하여 결과를 확인합니다.
POST 방법을 사용하여 정보 전달
일반적으로 정보를 CGI 프로그램에 전달하는보다 안정적인 방법은 POST 방법입니다. 이것은 GET 메소드와 똑같은 방식으로 정보를 패키징하지만? 뒤에 텍스트 문자열로 보내는 대신에 정보를 패키지화합니다. URL에서 별도의 메시지로 보냅니다. 이 메시지는 표준 입력의 형태로 CGI 스크립트에 들어옵니다.
다음은 GET 및 POST 메서드를 처리하는 동일한 hello_get.py 스크립트입니다.
#!/usr/bin/python
# Import modules for CGI handling
import cgi, cgitb
# Create instance of FieldStorage
form = cgi.FieldStorage()
# Get data from fields
first_name = form.getvalue('first_name')
last_name = form.getvalue('last_name')
print "Content-type:text/html\r\n\r\n"
print "<html>"
print "<head>"
print "<title>Hello - Second CGI Program</title>"
print "</head>"
print "<body>"
print "<h2>Hello %s %s</h2>" % (first_name, last_name)
print "</body>"
print "</html>"
HTML FORM 및 제출 버튼을 사용하여 두 개의 값을 전달하는 위와 동일한 예제를 다시 살펴 보겠습니다. 이 입력을 처리하기 위해 동일한 CGI 스크립트 hello_get.py를 사용합니다.
<form action = "/cgi-bin/hello_get.py" method = "post">
First Name: <input type = "text" name = "first_name"><br />
Last Name: <input type = "text" name = "last_name" />
<input type = "submit" value = "Submit" />
</form>
다음은 위 양식의 실제 출력입니다. 성과를 입력하고 제출 버튼을 클릭하면 결과를 볼 수 있습니다.
체크 박스 데이터를 CGI 프로그램에 전달
두 개 이상의 옵션을 선택해야하는 경우 확인란이 사용됩니다.
다음은 두 개의 확인란이있는 양식의 HTML 코드 예입니다.
<form action = "/cgi-bin/checkbox.cgi" method = "POST" target = "_blank">
<input type = "checkbox" name = "maths" value = "on" /> Maths
<input type = "checkbox" name = "physics" value = "on" /> Physics
<input type = "submit" value = "Select Subject" />
</form>
이 코드의 결과는 다음과 같습니다.
아래는 체크 박스 버튼에 대한 웹 브라우저의 입력을 처리하는 체크 박스 .cgi 스크립트입니다.
#!/usr/bin/python
# Import modules for CGI handling
import cgi, cgitb
# Create instance of FieldStorage
form = cgi.FieldStorage()
# Get data from fields
if form.getvalue('maths'):
math_flag = "ON"
else:
math_flag = "OFF"
if form.getvalue('physics'):
physics_flag = "ON"
else:
physics_flag = "OFF"
print "Content-type:text/html\r\n\r\n"
print "<html>"
print "<head>"
print "<title>Checkbox - Third CGI Program</title>"
print "</head>"
print "<body>"
print "<h2> CheckBox Maths is : %s</h2>" % math_flag
print "<h2> CheckBox Physics is : %s</h2>" % physics_flag
print "</body>"
print "</html>"
라디오 버튼 데이터를 CGI 프로그램에 전달
라디오 버튼은 하나의 옵션 만 선택해야 할 때 사용됩니다.
다음은 두 개의 라디오 버튼이있는 양식의 HTML 코드 예입니다.
<form action = "/cgi-bin/radiobutton.py" method = "post" target = "_blank">
<input type = "radio" name = "subject" value = "maths" /> Maths
<input type = "radio" name = "subject" value = "physics" /> Physics
<input type = "submit" value = "Select Subject" />
</form>
이 코드의 결과는 다음과 같습니다.
다음은 웹 브라우저에서 라디오 버튼에 대한 입력을 처리하는 radiobutton.py 스크립트입니다.
#!/usr/bin/python
# Import modules for CGI handling
import cgi, cgitb
# Create instance of FieldStorage
form = cgi.FieldStorage()
# Get data from fields
if form.getvalue('subject'):
subject = form.getvalue('subject')
else:
subject = "Not set"
print "Content-type:text/html\r\n\r\n"
print "<html>"
print "<head>"
print "<title>Radio - Fourth CGI Program</title>"
print "</head>"
print "<body>"
print "<h2> Selected Subject is %s</h2>" % subject
print "</body>"
print "</html>"
CGI 프로그램에 텍스트 영역 데이터 전달
TEXTAREA 요소는 여러 줄 텍스트를 CGI 프로그램에 전달해야 할 때 사용됩니다.
다음은 TEXTAREA 상자가있는 양식의 HTML 코드 예입니다.
<form action = "/cgi-bin/textarea.py" method = "post" target = "_blank">
<textarea name = "textcontent" cols = "40" rows = "4">
Type your text here...
</textarea>
<input type = "submit" value = "Submit" />
</form>
이 코드의 결과는 다음과 같습니다.
다음은 웹 브라우저에서 입력을 처리하는 textarea.cgi 스크립트입니다.
#!/usr/bin/python
# Import modules for CGI handling
import cgi, cgitb
# Create instance of FieldStorage
form = cgi.FieldStorage()
# Get data from fields
if form.getvalue('textcontent'):
text_content = form.getvalue('textcontent')
else:
text_content = "Not entered"
print "Content-type:text/html\r\n\r\n"
print "<html>"
print "<head>";
print "<title>Text Area - Fifth CGI Program</title>"
print "</head>"
print "<body>"
print "<h2> Entered Text Content is %s</h2>" % text_content
print "</body>"
드롭 다운 상자 데이터를 CGI 프로그램에 전달
드롭 다운 상자는 사용할 수있는 옵션이 많지만 하나 또는 두 개만 선택 될 때 사용됩니다.
다음은 하나의 드롭 다운 상자가있는 양식의 HTML 코드 예입니다.
<form action = "/cgi-bin/dropdown.py" method = "post" target = "_blank">
<select name = "dropdown">
<option value = "Maths" selected>Maths</option>
<option value = "Physics">Physics</option>
</select>
<input type = "submit" value = "Submit"/>
</form>
이 코드의 결과는 다음과 같습니다.
아래는 웹 브라우저에서 제공하는 입력을 처리하는 dropdown.py 스크립트입니다.
#!/usr/bin/python
# Import modules for CGI handling
import cgi, cgitb
# Create instance of FieldStorage
form = cgi.FieldStorage()
# Get data from fields
if form.getvalue('dropdown'):
subject = form.getvalue('dropdown')
else:
subject = "Not entered"
print "Content-type:text/html\r\n\r\n"
print "<html>"
print "<head>"
print "<title>Dropdown Box - Sixth CGI Program</title>"
print "</head>"
print "<body>"
print "<h2> Selected Subject is %s</h2>" % subject
print "</body>"
print "</html>"
CGI에서 쿠키 사용
HTTP 프로토콜은 상태 비 저장 프로토콜입니다. 상업용 웹 사이트의 경우 서로 다른 페이지간에 세션 정보를 유지해야합니다. 예를 들어 하나의 사용자 등록은 여러 페이지를 완료 한 후 종료됩니다. 모든 웹 페이지에서 사용자의 세션 정보를 유지하는 방법은 무엇입니까?
많은 상황에서 쿠키 사용은 더 나은 방문자 경험이나 사이트 통계에 필요한 선호도, 구매, 수수료 및 기타 정보를 기억하고 추적하는 가장 효율적인 방법입니다.
어떻게 작동합니까?
귀하의 서버는 쿠키 형태로 방문자의 브라우저에 일부 데이터를 보냅니다. 브라우저는 쿠키를 수락 할 수 있습니다. 그렇다면 방문자의 하드 드라이브에 일반 텍스트 레코드로 저장됩니다. 이제 방문자가 사이트의 다른 페이지에 도착하면 쿠키를 검색 할 수 있습니다. 검색되면 서버는 저장된 내용을 알고 / 기억합니다.
쿠키는 5 개의 가변 길이 필드의 일반 텍스트 데이터 레코드입니다.
Expires− 쿠키가 만료되는 날짜. 비어있는 경우 방문자가 브라우저를 종료 할 때 쿠키가 만료됩니다.
Domain − 사이트의 도메인 이름.
Path− 쿠키를 설정하는 디렉토리 또는 웹 페이지의 경로. 디렉토리 나 페이지에서 쿠키를 검색하려는 경우 비어있을 수 있습니다.
Secure−이 필드에 "secure"라는 단어가 포함 된 경우 쿠키는 보안 서버를 통해서만 검색 될 수 있습니다. 이 필드가 비어 있으면 그러한 제한이 없습니다.
Name = Value − 쿠키는 키와 값 쌍의 형태로 설정 및 검색됩니다.
쿠키 설정
브라우저에 쿠키를 보내는 것은 매우 쉽습니다. 이러한 쿠키는 HTTP 헤더와 함께 콘텐츠 유형 필드로 전송됩니다. 사용자 ID와 비밀번호를 쿠키로 설정한다고 가정합니다. 쿠키 설정은 다음과 같이 수행됩니다.
#!/usr/bin/python
print "Set-Cookie:UserID = XYZ;\r\n"
print "Set-Cookie:Password = XYZ123;\r\n"
print "Set-Cookie:Expires = Tuesday, 31-Dec-2007 23:12:40 GMT;\r\n"
print "Set-Cookie:Domain = www.tutorialspoint.com;\r\n"
print "Set-Cookie:Path = /perl;\n"
print "Content-type:text/html\r\n\r\n"
...........Rest of the HTML Content....
이 예에서 쿠키 설정 방법을 이해 했어야합니다. 우리는 사용Set-Cookie 쿠키를 설정하기위한 HTTP 헤더.
만료, 도메인 및 경로와 같은 쿠키 속성을 설정하는 것은 선택 사항입니다. 매직 라인을 보내기 전에 쿠키가 설정되어있는 것이 주목할 만합니다."Content-type:text/html\r\n\r\n.
쿠키 검색
설정된 모든 쿠키를 검색하는 것은 매우 쉽습니다. 쿠키는 CGI 환경 변수 HTTP_COOKIE에 저장되며 다음과 같은 형식을 갖습니다.
key1 = value1;key2 = value2;key3 = value3....
다음은 쿠키를 검색하는 방법의 예입니다.
#!/usr/bin/python
# Import modules for CGI handling
from os import environ
import cgi, cgitb
if environ.has_key('HTTP_COOKIE'):
for cookie in map(strip, split(environ['HTTP_COOKIE'], ';')):
(key, value ) = split(cookie, '=');
if key == "UserID":
user_id = value
if key == "Password":
password = value
print "User ID = %s" % user_id
print "Password = %s" % password
이것은 위 스크립트에 의해 설정된 쿠키에 대해 다음과 같은 결과를 생성합니다-
User ID = XYZ
Password = XYZ123
파일 업로드 예
파일을 업로드하려면 HTML 양식에 enctype 속성이 multipart/form-data. 파일 유형이있는 입력 태그는 "찾아보기"버튼을 만듭니다.
<html>
<body>
<form enctype = "multipart/form-data" action = "save_file.py" method = "post">
<p>File: <input type = "file" name = "filename" /></p>
<p><input type = "submit" value = "Upload" /></p>
</form>
</body>
</html>
이 코드의 결과는 다음과 같습니다.
위의 예는 서버에 파일을 업로드하는 사람들을 저장하기 위해 의도적으로 비활성화되었지만 서버에서 위 코드를 시도해 볼 수 있습니다.
다음은 스크립트입니다. save_file.py 파일 업로드 처리-
#!/usr/bin/python
import cgi, os
import cgitb; cgitb.enable()
form = cgi.FieldStorage()
# Get filename here.
fileitem = form['filename']
# Test if the file was uploaded
if fileitem.filename:
# strip leading path from file name to avoid
# directory traversal attacks
fn = os.path.basename(fileitem.filename)
open('/tmp/' + fn, 'wb').write(fileitem.file.read())
message = 'The file "' + fn + '" was uploaded successfully'
else:
message = 'No file was uploaded'
print """\
Content-Type: text/html\n
<html>
<body>
<p>%s</p>
</body>
</html>
""" % (message,)
Unix / Linux에서 위의 스크립트를 실행하면 다음과 같이 파일 구분 기호를 교체해야합니다. 그렇지 않으면 open () 문 위의 Windows 시스템에서 제대로 작동합니다.
fn = os.path.basename(fileitem.filename.replace("\\", "/" ))
"파일 다운로드"대화 상자를 올리는 방법?
때때로 사용자가 링크를 클릭 할 수있는 옵션을 제공하고 싶을 때 실제 내용을 표시하는 대신 사용자에게 "파일 다운로드"대화 상자를 팝업합니다. 이것은 매우 쉽고 HTTP 헤더를 통해 달성 할 수 있습니다. 이 HTTP 헤더는 이전 섹션에서 언급 한 헤더와 다릅니다.
예를 들어, 원하는 경우 FileName 주어진 링크에서 다운로드 할 수있는 파일의 구문은 다음과 같습니다.
#!/usr/bin/python
# HTTP Header
print "Content-Type:application/octet-stream; name = \"FileName\"\r\n";
print "Content-Disposition: attachment; filename = \"FileName\"\r\n\n";
# Actual File Content will go here.
fo = open("foo.txt", "rb")
str = fo.read();
print str
# Close opend file
fo.close()
이 튜토리얼을 즐기 셨기를 바랍니다. 그렇다면 다음 주소로 피드백을 보내주십시오. 연락처