python CGI

  • CGI는 Common Gateway Interface의 약자다.
  • web application을 만들 수 있는 언어는 ruby, java, php 등 다양하지만 모두 CGI 규약을 따라 web server와 통신한다.
  • web server는 사용자의 요청을 받으면 약속된 이름의 데이터를 환경변수로 web application에 전달하여 서로 교류한다.
  • apache에서 python을 이용해 web application을 만들어 web server와 통신해 보자.
  • $ a2enmod CGI 명령으로 apache의 CGI를 켜 주고, sudo service apache2 restart 로 설정 적용
  • /var/log/apache2/error.log 안에 apache 실행시 발생한 에러 로그가 담겨있다.
  • 웹 브라우저가 웹 서버에 요청할 때 웹 서버는 응답으로 웹 페이지의 데이터 타입(헤더)와 함께 웹 페이지를 전송한다. python CGI로는 print("content-type:text/html; charset=UTF-8\n") 와 같이 헤더를 표기낸다.
  • 헤더를 출력한 다음 부터는 body 부분이 출력된다.
  • 특정 주소로 Redirection을 할 때에는 print("location : index.py?id=title")을 이용한다. ( ‘:’ 이후 부터 ‘"’ 까지는 원하는대로 작성)

formatting

  • string에서 특정 문자열을 다른 문자로 치환하는 기능 ex) '{} {}'.format('one','tow') ex) '{a} {b}'.format(a='hello', b='world')
  • python 파일에서 문자열과 format 함수를 이용하여 동적 html을 구현 가능하다.

CGI 모듈

  • import cgi 로 모듈을 로드해 사용한다.
  • form = cgi.FieldStorage() form은 jQuery와 같은 역할을 한다. ex) pageId = form['id'].value : page의 id를 가져온다.

HTML 연동

  • input 태그의 name 속성 : input 태그를 특정 이름으로 CGI에 전달함 ex)

    <p> <input type="text" name="title" placeholder="title"> </p>
    <p> <textarea rows="4" name="description"></textarea></p>
    <p> <input type="submit"></p>
    
  • form 태그 : 특정 파일로 form 태그 안의 태그들을 전송

    • action 속성 : form 안의 내용을 처리할 파일(목적지)를 설정한다. ex)

      <form action="create.py">
         <p> <input type="text" name="title" placeholder="title"> </p>
         <p> <textarea rows="4" name="description"></textarea></p>
         <p> <input type="submit"></p>
      </form>
      
    • url 쿼리 스트링 생성자 역할을 한다.

    • url 쿼리 스트링은 form 안의 input 태그의 name 속성들과 목적지(처리할 파일)를 포함하고 있다.

    • get 방식은 쿼리 스트링을 url에 넣어서 사용하는 것이 맞다. 하지만 post 방식은 url이 아닌 다른 곳에 내용을 담아 전송하게 된다.

    • method 속성은 get과 post 방식을 설정할 수 있다. ex)

      <form action="create.py" method="post">
        <p> <input type="text" name="title" placeholder="title"> </p>
        <p> <textarea rows="4" name="description"></textarea></p>
        <p> <input type="submit"></p>
      </form>
      
    • action 속성으로 연결한 python 파일에서 form 안의 내용들을 사용하려면 cgi.FieldStorage()을 사용한다. ex)

    import cgi
    form = cgi.FieldStorage()
    title = form["title"].value
    description = form["description"].value
    
    • form 안의 내용 중 사용자에게 노출이필요 없는 input 태그는 type=“hidden” 속성을 주어 숨긴다. ex) <input type="hidden" name="pageId" value={}>
  • 이벤트를 이용하여 form 안의 내용들을 특정 python 파일로 전송시키면 python 파일에서 내용을 처리하고 다른 html로 redirection 시키는 방식으로 웹 구성이 가능하다.

cross site scripting (xss)

  • 웹 페이지의 script란을 임의로 작성하여 의도되지 않은 동작을 하도록 하는 행위

  • 컴퓨터가 html 파일을 해석할 때, <script>를 만나면 출력 대상이 아닌, javascript로 처리해야 할 태그로 인식한다. xml 문법에 사용되는 특수문자를 대체하여 이를 막을 수 있다.

    • '<' : &lt;
    • '>' : &gt; ex) ''.replace('<','&lt;')
  • “python html sanitizer” 로 검색하면 관련 패키지 검색이 가능하다.

정리

  • python package Index (PyPI): python 패키지들의 목록이 저장되어 있는 곳, 필요한 패키지를 활용하자.
  • CGI는 느려서 최근에는 잘 쓰이지 않고, FastCGI, 파이썬 전용 WSGI 등이 쓰인다.
  • web framework : 웹에서 사용되는 공통적 작업들만 잘 추려서 만든 APIdjango, flask 가 이에 해당.
  • Database 연동
  • Crawling: 웹페이지를 다운로드, 분석이 필요 (urllib, beautiful Soup 패키지 활용 가능)
  • github의 trending 탭을 보면 현재 가장 인기 있는 패키지를 볼 수 있다.