2014-09-17 2 views
0

클래스의 경우 사용자가 -50에서 50까지의 숫자를 처리하는 추가 게임에 대한 대답을 입력 할 수있게하는 CGI Python 스크립트를 만들어야합니다. 사용자가 프로그램에서 총 카운터에 1을 더하고 사용자에게 새로운 문제를 부여해야하는 잘못된 3 회 연속 대답. 사용자가 문제를 해결하면 프로그램은 총 카운터와 올바른 카운터에 하나를 더하고 사용자에게 새로운 문제를 제공해야합니다.CGI Python Script - Addition Game

http://silo.cs.indiana.edu:14544/cgi-bin/0917/dgerman

을 그리고 여기에 코드입니다 :

#!/usr/bin/python 
import random, cgi, cgitb 

cgitb.enable() 
print "Content-type: text/html\n\n", 
data = cgi.FieldStorage() 
(count, total, correct) = (0, 0, 0) 
n1 = random.randrange(-50, 50) 
n2 = random.randrange(-50, 50) 
answer = n1 + n2 

if data.keys(): 
    number = data.getvalue('number') 
    if data.number == answer: 
     message = "You are correct!" 
     total += 1 
     correct += 1 
    else: 
     message = "Nope, please try again." 
    count += 1 
    total += 1  
else: 
    message = "Welcome." 
print """ 
%s <p> 
<form> 
What is %s + %s? Answer: <input type=text name=number> 
<input type=submit name=action value = Proceed><br> 
You have %s out of %s correct! 
</form> 
""" % (message, n1, n2, correct, total) 
print "You have ", 3-count, " tries left!" 
+1

는 코드에 코드를 넣어 (내가 구식 HTML (3)을 쓴 이후로는 인용 부호가없는 속성과 닫히지 않은 태그 등으로, 오랜 시간이 지났 때문에 ... 잘못 세부 사항 중 일부를 입수했습니다 수 있습니다) 블록. 모든 코드를 선택하고 툴바에서 '{}'버튼을 눌러서이 작업을 수행하십시오. –

+1

발생하는 특정 문제는 무엇입니까? 당신이 잘못한 것을 우리에게 말하지 않으면 우리는 당신을 도울 수 없습니다. – DiMono

+0

프로그램에서 사용자가 올바르게 시도한 횟수를 추적하지 않고 사용자가 제출 버튼을 클릭 할 때마다 2 개의 새 숫자를 만듭니다 (사용자가 질문을 올바르게 입력하면 2 개의 새 숫자가 생성되어야합니다. 3 회 연속 부정확하게하십시오.) –

답변

1

당신은 기본적인 요청 - 응답을 놓치고

는 여기 웹 페이지 내 스크립트는, 몇 가지 문제가 HTTP의 성격. 하나의 CGI 요청으로 사용자에게 입력을 여러 번 요청할 수는 없으며 처음에는 하나의 입력 만 받아 들일 수 있으며 하나의 출력은 반환 할 수 있습니다.

전통적인 방법은 코드를 깨뜨리는 것입니다. 따라서 각 출력은 다음 입력과 함께 CGI 스크립트를 다시 호출하는 (또는 다른 호출을하는) 양식이있는 웹 페이지입니다. 어떤 상태 (예 : answer, counttotal)는 숨겨진 양식 변수 또는 쿠키에 저장됩니다.

현대적인 방법은 브라우저에서 실행되는 AJAX 응용 프로그램을 작성하는 것입니다. JavaScript 코드는 상태를 추적하고 "웹 서비스"요청을 작성한 다음 페이지의 DOM을 적절히 수정합니다. 완전히 새로운 페이지. 그러나 먼저 CGI 방법을 배우는 것이 좋습니다.


CgiScripts 파이썬 위키에는 좋은 예가 있습니다. 처음으로 페이지를 방문하면 양식에서 message을 보내지 않으므로 Previous message: <no message>을 표시하고 submit과 같은 페이지로 다시 안내하는 메시지를 입력 할 수있는 양식을 제공합니다. 제출 하시겠습니까? message이므로 Previous message: My message that I typed을 표시하고 동일한 양식을 제공합니다.

그래서, 당신의 문제에 그 번역 :

페이지를 방문하여 처음으로, 어떤 임의의 숫자는 포착되지 않은 것, 더 추측이 지금까지 이루어지지 않은 것, 새로운 생각이 없을 것 확인하여 코드에서 Welcome 메시지를 인쇄합니다. 여태까지는 그런대로 잘됐다. 그러나 당신이 포함하는 양식은 응답이나 추측 등을 되돌려 줄 필드 (숨김 또는 볼 수 있음)가 있어야하므로 다음 요청시 FieldStorage에서 빼낼 수 있습니다.

제출하면 제출할 때 이며 모든 코드가 전송되므로 코드에 "올바른"또는 "아니요"라는 메시지가 표시됩니다. "싫은"경우에는 다음 추측을 위해 양식에 올바른 모든 것을 다시 넣어야합니다. "올바른"경우 다른 필드 또는 다른 필드의 값이 다를 수 있습니다 (예 : count = 0으로 설정하고 count을 범용 코드로 변환하면 0이 다음 요청이 그냥 브라우저에서 "소스보기"를 수행하여도 사용자가 쉽게 부정 행위를 할 수있게 걱정이 있다면 ... 음, 당신 말이 맞아


FieldStorage.클라이언트에게 보내지 않는 키를 사용하여 숨겨진 값을 암호화하려고 시도 할 수는 있지만 크랙 될 수 있습니다. 일반적인 해결책은 정보를 서버 측에 저장하는 방법을 찾지 만 로컬 상태가없는 것입니다. 예를 들어, 데이터베이스를 작성할 수 있습니다. 누군가 처음 연결하면 세션 ID를 만들어 쿠키에 저장합니다. 이제 각 요청이 이루어지면 쿠키의 ID를 사용하여 데이터베이스에서 마지막 요청으로부터 상태를 복원 한 다음 다음 양식을 반환하기 전에 업데이트 된 상태를 저장할 수 있습니다.


숨겨진 양식 필드는 어떻게 작성합니까?

기존 코드에는 입력 필드 <input type=text name=number>이 있습니다. 이것은 빈칸으로 시작하고 사용자가 원하는 것을 입력 할 수있게 해주는 텍스트 상자로 나타나며 양식이 제출되면 텍스트 상자의 내용을 양식 변수 number으로 전송하므로 사용자의 data.getvalue('number')이 텍스트를 검색 할 수 있습니다.

미리 값을 채우려면 value='%s' 속성을 추가하십시오.

표시되거나 수정 가능한 입력란이 아니게하려면 type='text' 대신 type='hidden'을 사용합니다. 그런 다음 양식에 붙어있는 모든 가치는 그대로 귀하에게 되돌려 보내집니다.

당신은 페이지가로드 사이의 correct 값을 유지하려는 경우 따라서, 예를 들어, 당신은 당신의 HTML이 추가 : 물론, 당신의 현재 값이 %s 작성

<input type=hidden name=correct value='%s'> 

그리고 correct.

그런 다음 correct = 0을 수행하는 대신 correct = int(data.getvalue('correct', '0'))을 수행하십시오. 따라서 모든 요청에서 첫 번째 요청에서 0에서 다시 시작하는 대신 마지막 시간에서 correct 값부터 시작합니다.

+0

저는 CGI에 완전히 익숙하지 않아 실제로 어떻게 작동하는지 전혀 이해하지 못합니다. 어떻게 숨겨진 필드를 볼 수 있습니까? 그리고 그것들은 무엇을 의미합니까? –

+0

@JTFarley : CGI 튜토리얼을 SO 답변으로 쓸 수는 없지만 "CGI tutorial"또는 "Python CGI tutorial"을 google로 작성하면 [this one] (http : /www.tutorialspot.com/python/python_cgi_programming.htm) (권장 사항이 아니라 첫 번째 검색 결과 ...). 하지만 적어도 숨겨진 필드에 대한 질문에 대답 할 수는 있습니다. 대답을 편집하겠습니다. – abarnert