2012-06-07 2 views
1

Google App Engine에서 Python으로 첫 번째 앱을 작성하려고합니다. 여기 앱의 링크 : http://contractpy.appspot.com/ - 실험용 앱 일뿐입니다. 전체 코드는 다음과 같습니다.GAE TypeError : 형식 문자열에 대한 인수가 충분하지 않습니다.

하지만이 오류를 받고 있어요 (로그를 보여 주었다) :

"owner":owner}) 
:

더 specificaly
if (resident_name and valid_resident(resident_name)) \ 
     and (user_SSN and valid_SSN(user_SSN)) \ 
     and ((not user_email) or (user_email and valid_email(user_email))): 
      self.redirect('/welcome?resident=%s&nacionality=%s?SSN=%s?driverLicense=%s?email=%s?witness =%s?owner=%s' % {"resident":resident_name, 
             "nacionality":user_nacionality, 
             "SSN":user_SSN, 
             "driverLicense":user_driverLicense, 
             "email":user_email, 
             "witness ":witness , 
             "owner":owner}) 

, 그것은이 라인이다 : 블록이 경우

(...) line 229, in post "owner":owner}) 
TypeError: not enough arguments for format string 

라인 229이에

나는 변화를 만들려고 노력했지만 비슷한 일기를 읽었지만 아무런 효과가 없었다. 누군가이 오류의 원인을 파악할 수 있습니까? 미리 도움을 청하십시오!

# -*- coding: utf-8 -*- 
# -*- coding: utf-8 -*- 
#!/usr/bin/env python 
# 
# Copyright 2007 Google Inc. 
# 
# Licensed under the Apache License, Version 2.0 (the "License"); 
# you may not use this file except in compliance with the License. 
# You may obtain a copy of the License at 
# 
#  http://www.apache.org/licenses/LICENSE-2.0 
# 
# Unless required by applicable law or agreed to in writing, software 
# distributed under the License is distributed on an "AS IS" BASIS, 
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 
# See the License for the specific language governing permissions and 
# limitations under the License. 
# 

import webapp2 

form = """ 

<html> 
    <head> 
    <title>Sign Up</title> 
    <style type="text/css"> 
     .label {text-align: right} 
     .error {color: red} 
    </style> 

    </head> 

    <body> 
    <h2>Signup</h2> 
    <form method="post"> 
     <table> 
     <tr> 
      <td class="label"> 
      resident 
      </td> 
      <td> 
      <input type="text" name="resident" value= "%(resident)s"> 
      </td> 
      <td class="error"> %(resident_error)s 

      </td> 
     </tr> 

     <tr> 
      <td class="label"> 
      nacionality 
      </td> 
      <td> 
      <input type="text" name="nacionality" value= " "> 
      </td> 
     </tr> 

     <tr> 
      <td class="label"> 
      License 
      </td> 
      <td> 
      <input type="text" name="driverLicense" value=""> 
      </td> 
     </tr> 

     <tr> 
      <td class="label"> 
      SSN 
      </td> 
      <td> 
      <input type="text" name="SSN" value="%(SSN)s"> 
      </td> 
      <td class="error"> %(SSN_error)s 
      </td> 
     </tr> 


     <tr> 
      <td class="label"> 
      Email (optional) 
      </td> 
      <td> 
      <input type="text" name="email" value="%(email)s"> 
      </td> 
      <td class="error"> %(email_error)s 

      </td> 
     </tr> 
     </table> 

<br> 
     <td class="label"> 
      Contract Type 
      <select name = "contractType"> 
       <option>House Rental Contract</option> 
       <option>Car Rental Contract</option> 
       <option>Other</option> 
      </select> 
      </td> 
<br> 
<br> 

<br> 
      owner 
      <select name = "owner"> 
       <option>House owner</option> 
       <option>Car owner</option> 
       <option>Other owner</option> 
      </select> 
<br> 
<br> 

<br> 
      Witness 
      <select name = "witness"> 
       <option>Carl Sagan</option> 
       <option>Mahatma Gandhi</option> 
      </select> 
<br> 
<br> 

     <input type="submit"> 
    </form> 
    </body> 

</html> 
""" 

welcome = """ 
<html> 
    <head> 
    <title>Unit 2 Signup</title> 
    </head> 

    <body> 

%(contractType)s 

In consideration of the agreements of the Resident(s), known as: %(resident)s The owner hereby rents them the dwelling located at %(residentAdress)s, for the period commencing on the %(dateStarts)s, and monthly thereafter until the last day of %(dateEnds)s, at which time this Agreement is terminated. Resident(s), in consideration of owners permitting them to occupy the above property, hereby agrees to the following terms: 

RENT: To pay as rental the sum of $ (rentalSum) per month, due and payable in advance from the first day of every month. Failure to pay rent when due will result in the owner taking immediate legal action to evict the Resident from the premises and seize the security deposit. 
LATE FEE: Rent received after the first of the month will be subject to a late fee of 10% plus (3.00) dollars per day. 

ACCEPTED THIS (dateContract), at (localContract). 

___________________________________________________ 
%(resident)s - Resident 

___________________________________________________ 
%(owner)s – owner 

___________________________________________________ 
%(witness)s – Witness 

    </body> 
</html> 

""" 

import re 

USER_RE = re.compile(r"^[a-zA-Z0-9_-]{3,20}$") 
def valid_resident(resident): 
    return USER_RE.match(resident) 

PASS_RE = re.compile(r"^.{3,20}$") 
def valid_SSN(SSN): 
    return PASS_RE.match(SSN) 

EMAIL_RE = re.compile(r"^[\S][email protected][\S]+\.[\S]+$") 
def valid_email(email): 
    return EMAIL_RE.match(email) 

def escape_html(s): 
    for (i,o) in (("&","&"), (">",">"), ("<","<"), ('"','"')): 
     s = s.replace(i,o) 
     return s 

import time 

import datetime 

def dateToday(): 
    today = datetime.datetime.today() 
    todayDay = str(today.day) 
    todayMonth = str(today.month) 
    monthExt = {'1':' January ', '2':'February', '3':' March ', '4':'April', '5':'May', '6':'June', '7 ':' July ', '8':'August', '9':'September', '10':'October', '11':'November ', '12':'December'} 
    todayYear = str(today.year) 
    return(todayDay + ' of ' + monthExtenso[todaymonth] + ' of ' + todayYear) 

class MainHandler(webapp2.RequestHandler): 
    def get(self): 
     self.response.out.write(form %{"resident": "", 
             "SSN": "", 
             "driverLicense": "", 
             "email":"", 
             "resident_error": "", 
             "SSN_error": "", 
             "driverLicense_error": "", 
             "email_error": ""}) 

    def write_form(self, text_write): 
     self.response.out.write(text_write) 

    def post(self): 
     resident_name = self.request.get(escape_html("resident")) 
     user_nacionality = self.request.get("nacionality") 
     user_SSN = self.request.get(escape_html('SSN')) 
     user_email = self.request.get(escape_html('email')) 
     user_driverLicense = self.request.get(escape_html('driverLicense')) 
     resident_error = "" 
     SSN_error = "" 
     driverLicense_error = "" 
     contract_type = self.request.get("contractType") 
     owner = self.request.get("owner") 
     witness = self.request.get("witness ") 

     if (resident_name and valid_resident(resident_name)) \ 
     and (user_SSN and valid_SSN(user_SSN)) \ 
     and ((not user_email) or (user_email and valid_email(user_email))): 
      self.redirect('/welcome?resident=%s&nacionality=%s?SSN=%s?driverLicense=%s?email=%s?witness =%s?owner=%s' % {"resident":resident_name, 
             "nacionality":user_nacionality, 
             "SSN":user_SSN, 
             "driverLicense":user_driverLicense, 
             "email":user_email, 
             "witness":witness, 
             "owner":owner}) 
     else: 
      if not valid_resident(resident_name): 
       resident_error = "Oh no!!! this resident name isn't valid!" 
      if not valid_SSN(user_SSN): 
       SSN_error = "Oh no!!! SSN isn't valid!" 
      if user_email and not valid_email(user_email): 
       email_error = "Oh no!!! e-mail isn't valid!" 
      self.write_form(form % {"resident":resident_name, 
             "resident_error":resident_error, 
             "SSN":user_SSN, 
             "SSN_error":SSN_error, 
             "driverLicense":user_driverLicense, 
             "email":user_email, 
             }) 

class WelcomeHandler(webapp2.RequestHandler): 
    def get(self): 
     geted_resident_name = self.request.get('resident') 
     geted_user_nacionality = self.request.get("nacionality") 
     geted_user_SSN = self.request.get('SSN') 
     geted_user_email = self.request.get('email') 
     geted_user_driverLicense = self.request.get('driverLicense') 
     geted_resident_error = "" 
     geted_SSN_error = "" 
     geted_driverLicense_error = "" 
     #geted_contract_type = self.request.get("contractType") 
     geted_owner = self.request.get("owner") 
     geted_witness = self.request.get("witness ") 



     self.response.out.write(welcome % {"resident":geted_resident_name, 
             "nacionality":geted_user_nacionality, 
             "SSN":geted_user_SSN, 
             "SSN_error":geted_SSN_error, 
             "driverLicense":geted_user_driverLicense, 
             "email":geted_user_email, 
             "witness ":geted_witness , 
             "owner":geted_owner, 
             }) 


app = webapp2.WSGIApplication([('/', MainHandler), ('/welcome', WelcomeHandler)], 
           debug=True) 

답변

3

튜플이 아닌 DICT해야합니다 문자열 형식에 사용되는 % 운영자에 오른쪽 인수입니다. 귀하의 경우, dict은 형식 문자열에서 %s의 첫 번째 항목을 대체하며 다른 항목을 대체 할 수있는 다른 객체를 남기지 않습니다. 다음과 같이 대체 할 항목의 튜플을 수동으로 만들어야합니다.

('/welcome?resident=%s&nacionality=%s?SSN=%s?driverLicense=%s?email=%s?witness =%s? 
owner=%s' % (resident_name, user_nacionality, user_SSN, user_driverLicense, user_email, 
witness, owner) 
+0

흥미 롭습니다 ... 나는 사전으로 사용되는 것으로 생각되는 다른 작업용 응용 프로그램을 사용했습니다. 그러나 당신의 sugestion은 오류를 해결했습니다. 고마워, 울블! – craftApprentice

1

충분하지 않은 인수는 문자열의 X 형식 매개 변수가있을 때 발생하지만, 당신은 단지 다음과 일치 (여기서 x> y)를하려면 y 인수를 전달됩니다.

귀하의 경우 %를 놓치 셨습니다. % s % (으)로 변경하십시오.

self.redirect('/welcome?resident=%s&nacionality=%s?SSN=%s?driverLicense=%s?email=s%?witness =%s?owner=%s' % {"resident":resident_name, 
             "nacionality":user_nacionality, 
             "SSN":user_SSN, 
             "driverLicense":user_driverLicense, 
             "email":user_email, 
             "witness ":witness , 
             "owner":owner}) 
+0

감사합니다. Shay. 정말로 typping 오류가있었습니다 ("email = s %"). 하지만 (% s)을 고쳤으며 메시지 오류가 지속됩니다. 어떤 팁이 잘못 될까요? – craftApprentice

관련 문제