[Mac] 파이톤에서 CGI를 실행할 수 있는 간단한 HTTP 서버를 만들고 싶어요.

할 일


파이톤으로 CGI 이동을 위한 간단한 로컬 HTTP 서버를 구축합니다.
간단하게는 펄이 아닌 파이썬도 CGI 스크립트를 쓰고 싶어한다.

컨디션

  • MacOS Mojave
  • Python 3.7.5
  • CGI 소개


    CGI는 Common Gateway Interface의 약자로 웹 서버에 프로그램 처리의 결과를 표시하는 기능이다.
    CGI 소개
    한 마디로 하면 동적 웹 페이지를 만들기 위해 브라우저에서 값을 얻고 서버에서 처리한 후에 이런 기능을 되돌려준다고 생각합니다.

    로컬 HTTP 서버 준비


    먼저 서버를 만들어야 하기 때문에 로컬에서 HTTP 서버를 만들어 웹 페이지를 표시합니다.
    표시하고 싶은 페이지를 만들기 위해 작업하고 싶은 디렉터리에 인덱스를 넣습니다.쓰다
    이번에 보낸 데이터와 푸드를 season으로 만들었어요.
    index.html
    <html>
        <head>
            <title>サーバーテスト</title>
            <meta http-equiv="content-type" charset="utf-8">
        </head>
        <body>
        <form action="/cgi-bin/cgi_test.py" method="POST">
            <div>
                <label for="name">好きな食べ物</label>
                <input type="text" name="food" value="りんご">
                <label for="season">好きな季節</label>
                <input type="text" name="season" value="冬">
                <button>送信</button>
            </div>
        </form>
        </body>
    </html>
    
    여기서 주의해야 할 것은 동작의 경로이다
    "/cgi-bin/CGIスクリプトファイル名"
    
    라는 뜻이다.
    CGI 스크립트 파일의 상대 경로이며 여기에 지정된 스크립트 파일 이름을 사용하여 스크립트 파일을 만듭니다.

    서버 시작 테스트


    서버를 한 번 시작해 보세요.
    터미널에서 시작합니다.
    $ python3 -m http.server 8080
    
    실행하면 이렇게 될 것 같아서요.
    우선 8080호를 사용했는데 사용할 수 있는 번호라면 다른 번호도 괜찮아요.
    Serving HTTP on 0.0.0.0 port 8080 (http://0.0.0.0:8080/) ...
    
    그럼 움직이는지 확인해 보세요.
    http://localhost:8080/
    만약 순조롭게 진전된다면, 나는 다음과 같이 생각한다.
    그나저나 발송 버튼을 누르면 틀릴 거예요.

    CGI 스크립트에 대한 기술


    그러면 CGI 스크립트는 Pyhon으로 기술합니다.
    작업 디렉토리(index.}가 있는 디렉토리)에 CGI 스크립트를 기술하는 cgi-bin 디렉토리를 생성합니다.
    파일 구조는 다음과 같습니다.
    .
    ├── cgi-bin
    │   └── cgi_test.py
    └── index.html
    
    그리고 여기 있는 파일 이름은 아까 index입니다.>에서 지정한 이름을 사용하십시오.
    cgi_test.py
    #!/usr/bin/env python
    
    import cgi
    import cgitb
    cgitb.enable()
    
    print("Content-Type: text/html; charset=utf-8\n\n")
    
    print("<html><body>")
    form = cgi.FieldStorage()
    
    for key in form:
        value = form[key].value
        print('<p>%s: %s</p>' % (key, value))
    
    print("</body></html>")
    
    여기에 첫 줄은 반드시 써야 한다#!/usr/bin/env python.
    이걸 쓰지 않으면 OSError: [Errno 8] Exec format error: 오류가 발생합니다.
    이것은 지정한 해석기입니다. 자세한 내용은 아래의 문장을 참고하십시오.
    #!/빈/sh는 보통 댓글이 아니에요!Shebang이다!(Qiita)

    CGI 스크립트를 실행해 보도록 하겠습니다.


    그럼 실행에 들어가겠습니다.
    아까와 같이 터미널에서 서버를 시작합니다.
    여기서 CGI를 실행하려면 옵션--cgi을 추가합니다.
    python3 -m http.server 8080 --cgi
    
    http://localhost:8080/ 부팅을 확인한 후 발송 확인을 눌러 주십시오.

    성공하다

    하면, 만약, 만약...


    발송 단추를 눌렀는데도 표시할 수 없을 때 터미널에서 어떤 오류가 발생했는지 확인하십시오.

    · 권한이 755가 아닙니다(허가되지 않음)

    code 403, message CGI script is not executable
    
    → cgi-bin 디렉토리의 터미널에서 chmod 755 CGIスクリプト名.py.

    / 문자 코드가 설정되지 않았습니다.

    SyntaxError: Non-ASCII character '\xe5'
    
    → 파일의 맨 위에 추가# coding:utf-8합니다.

    참고 자료


    python에서 쉬운 웹 서버를 구축하여 CGI 테스트를 진행합니다.(Qiita)

    좋은 웹페이지 즐겨찾기