运行下面的代码,我收到了这个错误:
Traceback (most recent call last):
File "C:\Program Files (x86)\Google\google_appengine\lib\webapp2\webapp2.py", line 1536, in __call__
rv = self.handle_exception(request, response, e)
File "C:\Program Files (x86)\Google\google_appengine\lib\webapp2\webapp2.py", line 1530, in __call__
rv = self.router.dispatch(request, response)
File "C:\Program Files (x86)\Google\google_appengine\lib\webapp2\webapp2.py", line 1278, in default_dispatcher
return route.handler_adapter(request, response)
File "C:\Program Files (x86)\Google\google_appengine\lib\webapp2\webapp2.py", line 1102, in __call__
return handler.dispatch()
File "C:\Program Files (x86)\Google\google_appengine\lib\webapp2\webapp2.py", line 572, in dispatch
return self.handle_exception(e, self.app.debug)
File "C:\Program Files (x86)\Google\google_appengine\lib\webapp2\webapp2.py", line 570, in dispatch
return method(*args, **kwargs)
File "C:\Users\CG\Documents\ud\contract\main.py", line 81, in get
numBook = contract.book_number
AttributeError: 'NoneType' object has no attribute 'book_number'
因为我把这个初始行放在bd合同中(如su here和其他类似的问题):
first_query = db.GqlQuery("SELECT * FROM Contract ORDER BY date DESC")
if first_query is None: # Puting something in db if it's empty
first_record = Contract(book_number = 1, initial_page = 1, final_page = 1)
first_record.put()
我还进行测试以验证查询是否返回none:
first_query = db.GqlQuery("SELECT * FROM Contract ORDER BY date DESC")
if first_query is None: # Puting something in db if it's empty
first_record = Contract(book_number = 1, initial_page = 1, final_page = 1)
first_record.put()
else:
numBook = 0
numInitialPage = 0
numFinalPage = 0
当我打印时: q = db.GqlQuery(“SELECT * FROM Contract ORDER BY date DESC”)
我明白了:
当我打印时:
contract = q.get()
我得到无
如何解决make put()的问题?
# -*- 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 os
import webapp2
import jinja2
jinja_environment = jinja2.Environment(autoescape=True,
loader=jinja2.FileSystemLoader(os.path.join(os.path.dirname(__file__), 'templates')))
import re
from google.appengine.ext import db
USER_RE = re.compile(r"^[a-zA-Z0-9_ -]{3,20}$")
def valid_person(person):
return USER_RE.match(person)
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)
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 ' + monthExt[todayMonth] + ' of ' + todayYear)
class Contract(db.Model):
book_number = db.IntegerProperty(required = True)
initial_page = db.IntegerProperty(required = True)
final_page = db.IntegerProperty(required = True)
date = db.DateTimeProperty(auto_now_add=True)
class MainHandler(webapp2.RequestHandler):
def get(self):
first_query = db.GqlQuery("SELECT * FROM Contract ORDER BY date DESC")
if first_query is None: # Puting something in db if it's empty
first_record = Contract(book_number = 1, initial_page = 1, final_page = 1)
first_record.put()
q = db.GqlQuery("SELECT * FROM Contract ORDER BY date DESC")
contract = q.get() # return only the first entity
numBook = contract.book_number
numInitialPage = contract.initial_page
numFinalPage = contract.final_page
template_values = {"person": "",
"nacionality": "",
"SSN": "",
"driverLicense": "",
"email":"",
"person_error": "",
"SSN_error": "",
"driverLicense_error": "",
"address": "",
"email_error": "",
"numBook": numBook,
"numInitialPage": numInitialPage,
"numFinalPage": numFinalPage,
}
template = jinja_environment.get_template('index.html')
self.response.out.write(template.render(template_values))
def post(self):
person_name = self.request.get("person")
user_nacionality = self.request.get('nacionality')
user_profession = self.request.get('profession')
user_maritalStatus = self.request.get('maritalStatus')
user_SSN = self.request.get('SSN')
user_email = self.request.get('email')
user_driverLicense = self.request.get('driverLicense')
person_error = ""
SSN_error = ""
driverLicense_error = ""
geted_email_error = ""
address = self.request.get('address')
contractType = self.request.get("contractType")
owner = self.request.get("owner")
witness = self.request.get("witness")
numBook = self.request.get("numBook")
numInitialPage = self.request.get("numInitialPage")
numFinalPage = self.request.get("numFinalPage")
if (person_name and valid_person(person_name)) and (user_SSN and valid_SSN(user_SSN)) and ((not user_email) or (user_email and valid_email(user_email))):
a = Person(firstName = person_name,
nacionality = user_nacionality,
maritalStatus = user_maritalStatus,
profession = user_profession,
SSN = int(user_SSN),
driverLicense = int(user_driverLicense)
#address = user_address
)
a.put()
self.redirect('/your_contract?person=%s&nacionality=%s&profession=%s&maritalStatus=%s&SSN=%s&driverLicense=%s&email=%s&witness=%s&owner=%s&contractType=%s&address=%s&numBook=%s&numInitialPage=%s&numFinalPage=%s' % (person_name, user_nacionality, user_profession, user_maritalStatus, user_SSN, user_driverLicense, user_email,
witness, owner, contractType, address, numBook, numInitialPage, numFinalPage))
else:
if not person_name or not valid_person(person_name):
person_error = "Oh no!!! this person name isn't valid!"
if not user_SSN or not valid_SSN(user_SSN):
SSN_error = "Oh no!!! SSN isn't valid!"
if user_email and not valid_email(user_email):
geted_email_error = "Oh no!!! e-mail isn't valid!"
template_values = {"person": person_name,
"nacionality": user_nacionality,
"maritalStatus": user_maritalStatus,
"profession": user_profession,
"SSN": user_SSN,
"driverLicense": user_driverLicense,
"email": user_email,
"person_error": person_error,
"SSN_error": SSN_error,
"driverLicense_error": user_driverLicense,
"address": address,
"email_error": geted_email_error}
template = jinja_environment.get_template('index.html')
self.response.out.write(template.render(template_values))
class your_contractHandler(webapp2.RequestHandler):
def get(self):
geted_person_name = self.request.get('person')
geted_user_nacionality = self.request.get("nacionality")
geted_user_profession = self.request.get("profession")
geted_user_maritalStatus = self.request.get("maritalStatus")
geted_user_SSN = self.request.get('SSN')
geted_user_email = self.request.get('email')
geted_user_driverLicense = self.request.get('driverLicense')
geted_person_error = ""
geted_SSN_error = ""
geted_driverLicense_error = ""
geted_address = self.request.get('address')
geted_owner = self.request.get("owner")
geted_witness = self.request.get("witness")
geted_contractType = self.request.get("contractType")
geted_dateToday = dateToday()
your_contract = jinja_environment.get_template('your_contract.html')
geted_numBook = self.request.get('numBook')
geted_numInitialPage = self.request.get('numInitialPage')
geted_numFinalPage = self.request.get('numFinalPage')
contract = Contract(book_number = geted_numBook, initial_page = geted_numInitialPage, final_page = geted_numFinalPage)
contract.put()
your_contract_values = {"person":geted_person_name,
"nacionality":geted_user_nacionality,
"maritalStatus": geted_user_maritalStatus,
"profession": geted_user_profession,
"SSN":geted_user_SSN,
"driverLicense":geted_user_driverLicense,
"address":geted_address,
"email":geted_user_email,
"contractType":geted_contractType,
"dateContract":geted_dateToday,
"numBook":geted_numBook,
"numInitialPage":geted_numInitialPage,
"numFinalPage":geted_numInitialPage,
}
template = jinja_environment.get_template('index.html')
self.response.out.write(your_contract.render(your_contract_values))
class Contract(db.Model):
book_number = db.IntegerProperty(required = True)
initial_page = db.IntegerProperty(required = True)
final_page = db.IntegerProperty(required = True)
date = db.DateTimeProperty(auto_now_add=True)
app = webapp2.WSGIApplication([('/', MainHandler), ('/your_contract', your_contractHandler)],
debug=True)
答案 0 :(得分:1)
可能是因为查询没有返回任何内容,请尝试:
q = db.GqlQuery("SELECT * FROM Contract ORDER BY date DESC")
contract = q.get() # return only the first entity
if contract is not None:
numBook = contract.book_number
else:
print('contract is None')
答案 1 :(得分:1)
试试这个:
first_query = db.GqlQuery("SELECT * FROM Contract ORDER BY date DESC").get()
您必须使用 get()来选择最后一条记录(而不是查询对象)。因此,代码将在if块内运行。