1

Pythonを使用してGoogleAppEngineで最初のアプリを作成しようとしています。ここにアプリのリンクがあります:http://contractpy.appspot.com/-これは単なる実験的なアプリです。コード全体は次のとおりです。

しかし、このエラーが発生します(ログに表示されます):

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

行229はこのifブロックにあります:

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})

より具体的には、次の行です。

"owner":owner})

私は変更を加え、同様のawnswersを読み込もうとしましたが、何も機能しませんでした。誰かがこのエラーの原因を理解できますか?助けてくれてありがとう!

# -*- 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]+@[\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)
4

2 に答える 2

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)
于 2012-06-07T14:03:45.893 に答える
1

文字列にx個のフォーマットパラメータがあるが、それに一致するy個の引数のみを渡した場合(x> y)、十分な引数が発生しません。

あなたの場合、ミス%があります。s%を%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})
于 2012-06-07T13:18:29.887 に答える