2010-12-02 5 views
0

양식 데이터를 가져 와서 셸 명령을 실행 한 다음 자체 버전 중 하나 또는 다른 버전을 표시하는 할당 (Python 2.4) 용 작은 CGI 스크립트를 작성하고 있습니다. 페이지가 방금 한 일에 따라 예 : 주석을 추가하면 "모든 항목 목록"보기보다는 "항목"버전의 페이지가 다시로드되어 새 주석이 통합됩니다. 프로그램에 몇 가지 위치가 있는데, 프로그램 자체를 다시로드해야합니다. 한 장소에서 그것은 작동하고 한 곳에서 그렇지 않습니다. 그리고 저는 그 차이를 보려고 내 뇌를 깨고 있습니다.파이썬 CGI 스크립트 - 리다이렉트가 항상 작동하지 않는 경우

if mode == "change": 
    if newcomment != "": 
     comment_command = "some shell command \"" + item + "\" " + comment 
     os.system(comment_command) 
    if rating != "": 
     rate_command = "same command \"" + item + "\" " + rating 
     os.system(rate_command) 
# this NEVER works! 
    print "%s%s" % ("Location:http://blahblah/cgi-bin/myproject.cgi?item=", urllib.quote_plus(item)) 

elif mode == "newitem": 
    add_command = "command \"" + newitem + "\"" 
    result = os.system(add_command) 
    retcode = os.WEXITSTATUS(result) 
    # redirect depending on results 
    if retcode == 1: 
     # this one always works! 
     print "%s%s" % ("Location:http://blahblah/cgi-bin/myproject.cgi?item=", urllib.quote_plus(newitem)) 
    else: 
     print("Location:http://blahblah/cgi-bin/myproject.cgi") 

이 코드로 충분합니다. 나는 왜 그것이 한 곳에서 작동하는지, 다른 곳에서 작동하는지 보지 못한다. ?item= version이 한 곳에서 작동한다는 것을 제외하면 리디렉션에서 리디렉션을 시도하고 "지나치게 빠지다"는 것을 모두 무시한다고 가정합니다. os.system에 대해 이해할 수없는 것이 있습니까?

답변

0

os.system 명령을 인쇄해도 위치 헤더가 유효하지 않을 수 있습니다.

  • 은 os.system을 출력 아무것도
  • 이 아니라고 확인이해야하는 경우, 위치 헤더는 데이터가
  • 대신 os.system을의 서브 프로세스 모듈 선호 인쇄하기 전에 이동해야한다 :
 
    import subprocess; 
    subprocess.Popen(command, shell=True).communicate() 
+0

첫 번째 명령이 값을 반환하고 두 번째 명령이 값을 반환하지 않기 때문에 이것이 올바른 트랙 일 것이라고 확신합니다. 나는 그 값으로 무엇이든 할 필요가 없다. 나는 그 라인의 os.system 명령어를 subprocess.Popen으로 바꾸려고 시도했지만, 여전히 똑같은 일을한다. 명령을 실행 한 다음 반환하는 값을 덤프하는 방법이 있습니까? 고맙습니다. – umbraphile

+0

그게 그가 당신에게 준 것입니다. 서브 프로세스 모듈 문서를 읽으십시오. –

+0

a = Popen()은 Popen 객체를 제공합니다. a.communicate()를 실행 한 다음 종료 코드 값에 대해 a.returncode를 수행하십시오. – tito

0

위치 헤더 전에 실제로 아무것도 출력하지 않았는지 확인하고 확인하십시오. 그 이전에 출력물이 있다면, 실제로 위치 헤더를 얻지는 않을 것입니다.

관련 문제