craftApprentice
craftApprentice

Reputation: 2777

Python GAE datastoreAttributeError: 'NoneType' object has no attribute

Running the code bellow, I'm getting this error:

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'

Since I'm putting this initial row in the bd Contract (as sugested here and others similar questions):

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

I also make a test to verify if the query is returning 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

When I print this: q = db.GqlQuery("SELECT * FROM Contract ORDER BY date DESC")

I get this:

When I print this:

contract = q.get()

I get None

How to fix that making put() work?

# -*- 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)

Upvotes: 0

Views: 1469

Answers (2)

Mari
Mari

Reputation: 26

Try this:

first_query = db.GqlQuery("SELECT * FROM Contract ORDER BY date DESC").get()

You have to use get() to select the last record (and not the query object). So, the code will run inside the if block.

Upvotes: 1

Ashwini Chaudhary
Ashwini Chaudhary

Reputation: 250951

May be because the query is returning nothing, try this :

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

Upvotes: 1

Related Questions