생활코딩

Coding Everybody

코스 전체목록

닫기

활용 - 생성 구현 2 - 전송한 정보의 처리

수업소개

html form을 이용해서 전송한 데이터를 Python 애플리케이션이 받아서 처리하는 방법을 소개합니다. 

 

 

강의

 

 

 

소스코드

process_create.py

#!/usr/local/bin/python3

import cgi
form = cgi.FieldStorage()
title = form["title"].value
description = form['description'].value

opened_file = open('data/'+title, 'w')
opened_file.write(description)
opened_file.close()

#Redirection
print("Location: index.py?id="+title)
print()

 

댓글

댓글 본문
  1. DCNOMAD
    베리믹스님이 말씀하신대로 하니까 해결되네요! 코드 자체의 근본적인 원리를 모르니까 복붙작업이네요 ㅠㅠ
    대화보기
    • Yeonghun KO
      정말 감사합니다!! 저도 오류가 떴는데 알고보니 index.py를 복사해서 복사한 파일을 create.py 라고 이름을 수정하고 create.py에서 작업을 했어야 했는데 그게 아니라 계속 index.py에서 작업했네요... 이때까지 보면은, 제가했던 실수는 사소한 동작미스에서 기인한것같은 느낌이 드네요 허허
    • 김호준
      print() 를 해주지 않으면 오류가 발생하는데 이유가 무엇인가요?
    • Yeojin
      해결했어요,
      맨 위에 print("content-type: text/html; charset=euc-kr\n")
      를 그대로 놔둬서 생겼던 문제였던거 같네요. ㅎㅎ
      대화보기
      • Yeojin
        moon님, 해결하셨나요?
        저도 같은 문제로 고생했는데, 해결이 안되요 ㅠㅠ
        위에꺼랑 똑같이도 해보고, import sys도 해보고 하는데, 리디렉션이 안되고, 해당 URL이 그대로 프린트되네요..ㅜㅜ
        대화보기
        • 영상 잘보고 있습니다!!

          윈도우 10 사용해서 따라하는 중인데

          제출을 눌러도 화면에 텍스트로 출려되지도 않고 internal server error 이 계속 뜨네요 ㅠㅠ
          대체 무슨 문제인지 모르겠습니다 ㅠㅠ
        • 악어
          2020-03-14 완료
        • 스티븐잡숴
          완료
        • 완료 - 계속 malformed header 에러가 떠서 해결법을 찾느라 고생했는데
          원인은 중간에 테스트 용도로 써놓은 print 문을 제가 삭제하지 않아서였네요.

          index.py에서 맨 처음에
          print("Content-Type: text/html")을 삽입해서 다음에 올 내용들이
          html 파일이라 지정한 것처럼, 여기서는
          print("Location: ...) 로 Location 헤더를 사용하는 것이 의도인데,
          그에 앞서 엉뚱한 것들이 print되니까 당연히 존재하지 않는 헤더를 지정한 것으로 브라우저가 해석해서 에러가 발생했습니다.
          에러를 해결하느라 https://developer.mozilla.org......ers 이걸 읽어보게 되어 나름의 성과는 있었네요..
        • 쑤우
          수강완료. 감사합니다.
        • 굼벵이
          완료
        • 20191004 Ted 완료!
        • 베리믹스
          저도 win10 환경이에요, 마지막 Redirection 부분에서 동일하게 코드 작성하면 HTML에서 해당 페이지로 이동 안되고 그대로 출력 안되시는 분들 아래코드로 복사붙혀넣기로 한번 확인해보세요.

          #!python
          import sys # 모듈 임시경로 등록
          import codecs # 한글처리
          import cgi

          sys.stdout = codecs.getwriter("utf-8")(sys.stdout.detach()) # 한글처리 2

          form = cgi.FieldStorage()
          title = form.getvalue('title')
          description = form.getvalue('description')

          opened_file = open('data/'+title, 'w', encoding='utf-8')
          opened_file.write(description)
          opened_file.close()

          print('Location: index.py?id='+title)
          print()
          대화보기
          • 끄어
            permission error가 계속 발생햇는데, data폴더쪽에서 sudo chmod 777넣어서 어떻게 잘됫읍미다..
          • 김영인
            저는 맥북 사용하고 있는데, 한글로 전송해도 잘 되네요 ㅎㅎ
          • bright_kim
            Excellent
          • 정훈
            위코드에서 redirection 이후 실행시에 아래의 에러가 발생하는 것으로 보입니다. malformed header의 의미가 무엇인지 혹시 알려주시면 감사하겠습니다.

            [Mon Jan 28 23:08:18.768105 2019] [cgid:error] [pid 30401] [client ::1:53842] malformed header from script 'process_create.py': Bad header: num mum is, referer: http://localhost.......py
          • 와 이제 사용자와 상호작용할수 있는 웹페이지를 만들수 있게 되었네요ㅠㅠㅠ 이고잉님 언제나 감사합니당!!!^ㅁ^
          • JuicyFresh
            감사합니다.
          • warmhoon
            title 에 "/" (슬래쉬)가 들어가면 폴더로 인식하고 data폴더 밑에 파일이 없다고 오류가 나오는것 같아요~
          • Lethesriver
            호그와트에서 마법을 배우는 기분입니다
            자바, 파이썬, WEB1 거쳐서 배우고 있는데 너무 신기하고 재밌네요ㅠㅠ
            감사합니다
          • 민턴쟁이
            타이틀 정보에 #등을 넣어보니 index.py파일로 이동하는걸 보니
            역시 보안까지 완강해야 겠죠

            이고잉님 너무 감사 합니다. ~~
            좋은 수업 잘듣고 갑니다.
          • 호동
            안녕하세요. codeanywhere로 따라해 보고 잇는데요. 글쓰기를 하면 다음과 같은 오류가 뜨는데 뭐가 문제인지 모르겠어서요.
            Traceback (most recent call last):
            File "/home/cabox/workspace/process_create.py", line 10, in <module>
            open_file = open('data/' + title, 'w');
            PermissionError: [Errno 13] Permission denied: 'data/Python'
          • Sungwoong Pyeon
            해결했습니다 정말 감사합니다. 핵심 키는
            <form enctype="multipart/form-data" action="process_create.py" method="post">
            enctype="multipart/form-data" 이거 였습니다.
            다시 한번 답변 감사합니다.
            대화보기
            • egoing
              아래와 같이 검색을 해보니 몇몇 사례들이 보이네요.
              https://www.google.co.kr......F-8

              참고해보셔요~
              대화보기
              • Sungwoong Pyeon
                제가 <p><input type="file" name="pic" accept="image/*"></p> 위에서 설명해주신 방법으로 이미지도 추가해보려고 합니다. images directory 아래에 이미지 이름으로 파일생성은 됩니다. 하지만 이미지는 저장되지 않네요.
                예를들어 nodejs.jpg로 파일생성은 되는데 파일을 클릭해보면 사진은 없습니다. 조언 부탁드립니다.
              • moon
                넵 답변 감사합니다~
                대화보기
                • egoing
                  아래 주소를 보시면 전송된 폼의 정보를 확인하는 방법이 있습니다. 이걸 보시고 제대로 폼이 전송 되었는지 확인해보셔요

                  https://wpscholar.com......me/
                  대화보기
                  • moon
                    넵 확인 했습니당~
                    (크롬) 개발자 도구의 Network 탭의 내용에서는 별도의 에러 메세지는 없습니다.
                    다만 에디션(VS code)에서 코드 실행 시 "process_create.py"의 title = form['title'].value
                    라인에서 KeyErro메세지를 확인 할수 있었습니다...

                    에러 메세지는 다음과 같습니다.
                    Traceback (most recent call last):
                    File "d:\Bitnami\wampstack-7.1.18-1\apache2\htdocs\Syntex\process_create.py", line 7, in <module>
                    title = form['title'].value
                    File "D:\python-3.7.0\lib\cgi.py", line 527, in __getitem__
                    raise KeyError(key)
                    KeyError: 'title'
                    제가 해석하기에는 ..
                    "creat.py"의 form문의 title 값을 불러오지 못하는것 같은데...
                    어떻게 해결해야 할지를 모르겠습니다...
                    https://github.com......ect

                    코드 한번 봐주시면 감사 하겠습니다!
                    도와 주세욤!!!
                    수업 항상 감사히 듣고 있습니다.
                    대화보기
                    • egoing
                      (크롬) 개발자 도구의 Network 탭의 내용을 모니터링 해보셨는지요?
                      대화보기
                      • moon
                        문의 드립니다.
                        현재 Win10에서 수업을 잘 따라하고 있습니다.
                        마지막 Redirection 부분에서 동일하게 코드 작성하면 HTML에서 해당 페이지로 이동 안되고 그대로 출력 됩니다~

                        어떻게 해결 해야 할까요?
                      • ChoeDoby
                        저도 그 에러가 나서 한번 에러로그를 찾아보았는데요, 에러로그에 보면
                        Premature end of script headers라고 되어있습니다. 이걸 구글링 해보면
                        HTTP header와 body 사이에는 적어도 하나는 필요하다고 되어있는데
                        index.py와 create.py에는 그 사이에 이미 공백이 존재했고,
                        process_create.py 파일에서는 다른 바디부분이 존재하지 않기 때문에 print()를 통해
                        공백을 추가해 줘야 했던 것 같습니다.
                        대화보기
                        • daengdaengLee
                          codeanywhere에서 실습하는 중 에러가 나는 부분 공유합니다.

                          data 디렉토리에 대해 apache 서버에서 쓰기 권한이 없어서 Permission denied 에러가 발생합니다.
                          해당 디렉토리의 권한 설정을 바꿔주면 동작합니다.

                          // workspace 디렉토리에서
                          $ sudo chgrp www-data ./data
                          $ sudo chmod g+rwx ./data

                          실행시키면 정상 동작합니다.

                          자세한 내용, 원리를 아시는 분은 댓글로 내용을 추가해주세요 :)
                        • SongSong
                          안녕하세요
                          index.py 와 create.py 에서는 print()를 붙이지 않아도 전혀문제없었는데

                          현재 파일(process_create.py) 에서만 마지막에 print() 이부분을 빼면 에러가 발생하네요

                          저 부분이 어떤 의미를 가지길래 위와같은 차이가 존재하는지 궁금합니다!!!
                        • 초보개발자
                          open 함수 관련해서 한글 utf-8 문제는

                          import codecs

                          opened_file=codecs.open('data/'+title,'w','utf-8')

                          이런식으로 open 함수 앞에 codecs. 붙여주고 인자로 'utf-8' 적어주니까 한글 안깨지네요!
                        • quantico
                          코드애니웨어에서 form전송을 하면 (104)Connection reset by peer
                          AH02550: Failed to flush CGI outputto client, referer
                          위와 같은 에러가 납니다. 도와주세요
                        버전 관리
                        egoing
                        현재 버전
                        선택 버전
                        graphittie 자세히 보기