티스토리 뷰

728x90

"파이썬 프로그램의 형태 1 - 파이썬 배우기(Python)"에 이어지는 글입니다.

웹브라우저를 통해서 정보를 제공하는 사용자 인터페이스로 웹서버측에서 프로그래밍이 필요하고 아래와 같이 다양한 적용 방법이 있습니다.(참고 자료 http://docs.python.org/2/howto/webservers.html)



    • CGI(Common Gateway Interface)

    • mod_python

    • FastCGI, SCGI

    • mod_wsgi

    • Templates

    • Frameworks



■ CGI(Common Gateway Interface)


웹서버와 파이썬 프로그램간의 가장 전통적인 인터페이스로 속도 및 기타 문제로 사용 할 수는 있지만 추천하지 않습니다. 되도록 WSGI(Web Server Gateway Interface)를 사용하도록 제안하고 있습니다. 




가장 간단히 CGI를 테스트 해볼 수 있는 방법은 파이썬에 내장되어 있는 자체 서버(CGIHTTPServer)를 사용하는 것으로 아래의 그림과 같이 파이썬 폴더로 이동하여 "python -m CGIHTTPServer"로 실행시키면 8000포트로 웹서버가 가동 됩니다.


#!D:\Python27\python.exe
print 'Content-Type: text/html'
print
print '<html>'
print '<head><title>Hello Python</title></head>'
print '<body>'
print '<h1>Hello Python</h1>'
print '</body>'
print '</html>'


웹브라우저에서 프로그램을 테스트하기 이전에 파이썬 폴더에 "cgi-bin"이름의 폴더를 생성하고 그아래에 hello.py코드를 dnl와 같이 작성 합니다.



cgi-bin/hello.py가 준비되었으면 웹브라우저에서 "http://127.0.0.1:8000/cgi-bin/hello.py"로 입력하면 결과를 위와 같이 확인할 수 있습니다. CGI로 연결된 파이썬 프로그램의 표준 출력으로 웹 페이지의 내용을 일일이 기술해 주어야 합니다.


파이썬 자체 웹서버가 아닌 아파치와 같은 전문 웹서버의 경우에도 방식은 크게 다르지 않습니다. 아파치 웹서버를 가동시키고 아파치의 cgi-bin 폴더에 위에서 작성한 hello.py를 복사합니다.(소스 코드의 첫 라인에 파이썬 인터프리터의 경로를 정확히 입력해야 정상 동작 합니다) 아파치의 가동 포트를 특별히 변경하지 않았다면 80포트를 사용하므로 웹브라우저에서 "http://127.0.0.1/cgi-bin/hello.py"로 테스트하면 동일한 결과를 확인 할 수 있습니다.

 

위의 테스트처럼 CGI를 사용하면 그때마다 인터프리터가 로딩되어야 하는 단점이 있습니다. 아무튼 파이썬에서 CGI를 사용하려면 cgi, cgitb 모듈을 통해 사용자의 웹 입력을 다룰수 있고  print 함수를 통해 표준 출력으로 결과를 내보내면 그 결과가 웹브라우저로 전달되는 방식 입니다. 



■ mod_python(http://www.modpython.org/)


파이썬 인터프리터를 아파치 웹서버에 내장시켜 인터프리터 로딩에 따른 시간을 낭비를 줄이고 웹서버와의 인터페이스가 좀더 용이하도록 기능을 제공한 것입니다.  "<!--#python -->" 형식으로 SSI(Server Side Includes) 기능을 사용할 수 있도록 기능을 제공 합니다. mod_python을 아파치에 정상적으로 설치한다음 mod_python 관련 설정이 필요한데, mod_python의 일반 핸들러인지 Publisher 핸들러인지에 따라 설정 및 사용법에 차이가 있습니다.


AddHandler mod_python .py

  PythonHandler mod_python.publisher

  PythonDebug On

 

위의 내용은 Publisher 핸들러의 아파치 웹서버 설정입니다.


   <html>
      Please provide feedback below:
  <p>                          
  <form action="form.py/email" method="POST">

      Name:    <input type="text" name="name"><br>
      Email:   <input type="text" name="email"><br>
      Comment: <textarea name="comment" rows=4 cols=20></textarea><br>
      <input type="submit">

  </form>
  </html>


import smtplib

WEBMASTER = "webmaster"   # webmaster e-mail
SMTP_SERVER = "localhost" # your SMTP server

def email(req, name, email, comment):

    # make sure the user provided all the parameters
    if not (name and email and comment):
        return "A required parameter is missing, \
               please go back and correct the error"

    # create the message text
    msg = """\
From: %s                                                                                                                                          
Subject: feedback
To: %s

I have the following comment:

%s

Thank You,

%s

""" % (email, WEBMASTER, comment, name)

    # send it out
    conn = smtplib.SMTP(SMTP_SERVER)
    conn.sendmail(email, [WEBMASTER], msg)
    conn.quit()

    # provide feedback to the user
    s = """\
<html>

Dear %s,<br>                                                                                                                                      
Thank You for your kind comments, we
will get back to you shortly.

</html>""" % name

    return s


위의 코드들은 웹 브라우저에서 이름과 메일주소, 내용을 입력받는 HTML과 사용자가 내용을 입력한 다음 [submit] 버튼을 누르면 웹서버에서 수행되는 파이썬 코드입니다. 입력폼의 <form>태그의 action 속성에 파이썬 코드내의 어떤 함수를(form.py/email) 통해 기능을 수행할 것인지를 지정하면 mod_python에서 해당 함수로 웹 브라우저에서 전달한 입력을 인수로 전달하는 것을 확인 할 수 있습니다.(http://www.modpython.org/live/current/doc-html/tut-pub.html 참조)


  <Directory /mywebdir>

      AddHandler mod_python .py

      PythonHandler myscript

      PythonDebug On

  </Directory>

위의 내용은 mod_python의 일반  핸들러와 관련한 아파치 설정 입니다.


from mod_python import apache

def handler(req):

    req.content_type = "text/plain"
    req.write("Hello World!")

    return apache.OK


위의 코드는  mod_python의 일반  핸들러에 대응하는 파이썬 코드 예제 입니다.


AddHandler mod_python .psp

PythonHandler mod_python.psp


위의 내용은  PSP(Python Server Pages)  핸들러와 관련한 아파치 설정 입니다.


<html>
<%
import time
%>
Hello world, the time is: <%=time.strftime("%Y-%m-%d, %H:%M:%S")%>
</html>


위의 코드는 PSP(Python Server Pages)에 적용한 파이썬 코드 예제로 PHP, ASP, JSP처럼 태그 표시를 매개로 HTML코드와 파이썬 코드를 병기할 수 있습니다. PSP에서의 태그는 <% %>로 사용 합니다. 표현식은 <%= %>로 include 같은 지시자는 <%@ %>를 사용합니다.



■ FastCGI, SCGI(http://httpd.apache.org/mod_fcgid/)


CGI의 성능 문제를 웹서버에 인터프리터를 내장하는 것이 아닌 다른 방식으로 풀어 보려는 시도로 인터프리터를 웹서버에 내장하는 것이 아니라 대몬 형태로 가동시켜두고 웹서버에 내장한 인터페이스 모듈을 통해서 상호 통신하는 방식 입니다. SCGI는 단순히 "Simpler FastCGI"의 의미로 이해해도 된다. FactCGI나 mod_python 모두 직접 사용되기 보다 WSGI 적용에 활용되는 형태로 이용 됩니다. 아파치에서는 mod_fcgid 모듈을 제공하고 있습니다.



■ mod_wsgi(https://code.google.com/p/modwsgi/)


WSGI(Web Server Gateway Interface,  http://www.wsgi.org/ 참조)는  웹 서버와 응용 프로그램 간의 규약(specification)으로 서버와 응용 측면에서 각각의 인터페이스를 정의하고 있습니다.(PEP333) WSGI 서버는 클라이언트 요청을 WSGI 응용에 전달하고 WSGI 응용에서 전달한 결과를 클라이언트로 응답하는 역할을 담당하는 것으로 파이썬에 내장한 웹서버로도 WSGI 테스트가 가능하지만 mod_wsgi를 추천하고 있다. CGI, FastCGI, SCGI, mod_python 등이 WSGI 응용을 구현하기 위한 게이트웨이로 사용된다면, mod_wsgi는 이런 게이트웨이 없애고 웹서버에 직접 WSGI 응용을 내장한 것입니다.

 

mod_wsgi는 아파치 프로세스에 직접 내장하는 방식과 FastCGI 처럼 대몬 형태로 동작하는 두가지 모드로 사용 할 수 있습니다. 성능은 내장형이 좋지만 안정성을 위해서는 대몬 모드를 추천한다고 합니다. 아래는 Trac을 mod_wsgi에서 구동시키기 위한 WSGI 스크립트(*.wsgi)와 아파치 설정 파일 예제이다(http://trac.edgewall.org/wiki/TracModWSGI 참조)


import os


os.environ['PYTHON_EGG_CACHE'] = '/usr/local/trac/mysite/eggs'


import trac.web.main

def application(environ, start_response):

  environ['trac.env_path'] = '/usr/local/trac/mysite'

  return trac.web.main.dispatch_request(environ, start_response)


WSGIScriptAlias /trac /usr/share/trac/cgi-bin/trac.wsgi

<Directory /usr/share/trac/cgi-bin>

    WSGIApplicationGroup %{GLOBAL}

    Order deny,allow

    Allow from all

</Directory>



■ Templates


파이썬 코드만으로 웹페이지 작성하는 것은 디자인을 입히는 것도 쉽지 않고 일일이 코딩해야 하는 어려움이 있습니다. 그래서 통상 별도의 도구를 활용하여 웹페이지를 작성하고 페이지내의 특정한 곳에 코드를 삽입하여 조립하는 방식을 취합니다. 파이썬에서는 %연산자로 조립하거나 string 모듈의 Template을 활용하는 방법을 제공하고 있고 복잡한 템플릿을 위해 템플릿 엔진을 사용할 수도 있습니다. 데이터 내용의 수정없이 웹페이지의 디자인만 바꾸는 경우라면 파이썬 코드를 손 대지 않고 템플릿 파일만 수정하면 됩니다. 다음은 대표적인 템플릿 엔진들 입니다. 


>>>Mako : http://www.makotemplates.org/ 

python.org 사이트에 적용되었고 Pylons, Pyramid 프레임워크의 기본 템플릿 입니다. 아래는 Mako 템플릿 예제 입니다.


<%inherit file="base.html"/>
<%
    rows = [[v for v in range(0,10)] for row in range(0,10)]
%>
<table>
    % for row in rows:
        ${makerow(row)}
    % endfor
</table>

<%def name="makerow(row)">
    <tr>
    % for name in row:
        <td>${name}</td>\
    % endfor
    </tr>
</%def>

>>>Genshi : http://genshi.edgewall.org/ 

협업 플랫폼인 Trac의 템플릿으로 시작하여 여러 프로젝트로 확장되고 있습니다. 아래는 trac의 기본 템플릿 예제 입니다.


<html xmlns="http://www.w3.org/1999/xhtml"
      xmlns:py="http://genshi.edgewall.org/"
      xmlns:xi="http://www.w3.org/2001/XInclude">
  <head>
    <title>Available Projects</title>
  </head>

  <body>
    <h1>Available Projects</h1>
    <ul>
      <li py:for="project in projects" py:choose="">
        <a py:when="'href' in project" href="$project.href"  title="$project.description">$project.name</a>
        <py:otherwise>
          <small>$project.name: <em>Error</em> <br /> ($project.description)</small>
        </py:otherwise>
      </li>
    </ul>
  </body>
</html>


>>>Jinja : http://jinja.pocoo.org/docs/ 

Django 프레임워크의 템플릿으로 시작하여 여러 프로젝트로 확장되고 있습니다. 아래는 템플릿 예제 입니다.


<title>{% block title %}{% endblock %}</title>
<ul>
{% for user in users %}
  <li><a href="{{ user.url }}">{{ user.username }}</a></li>
{% endfor %}
</ul>



■ Frameworks


개발자로 하여금 세세한 부분에 대한 처리를 하지 않아도 손쉽게  웹 사이트를 개발할 수 있도록 여러 패키지와 모듈을 묶어 놓은 것으로 대표적인 프레임워크로는 아래와 같은 것들이 있습니다.


    • Django(https://www.djangoproject.com/)

    • TurboGears(http://www.turbogears.org/)

    • Zope2(https://pypi.python.org/pypi/Zope2)




728x90
댓글
최근에 올라온 글
최근에 달린 댓글
«   2024/04   »
1 2 3 4 5 6
7 8 9 10 11 12 13
14 15 16 17 18 19 20
21 22 23 24 25 26 27
28 29 30
글 보관함