python - 使用 get_current_user() 方法时产生此 python AttributeError 的原因是什么?

标签 python google-app-engine syntax-error jinja2

这行代码:

        geted_nickname = user.nickname()

这个处理程序的:

class MainHandler(webapp2.RequestHandler):
    def get(self):
        user = users.get_current_user()
        if user == None:
            self.redirect(users.create_login_url(self.request.uri))
        geted_nickname = user.nickname()

正在产生此错误:

File "C:\Users\Py\Desktop\Apps\contract\main.py", line 99, in get
    geted_nickname = user.nickname()
AttributeError: 'NoneType' object has no attribute 'nickname'

因为 user 是一个 NoneType 对象,程序应该执行 if block self.redirect(users.create_login_url(self.request.uri)) ,但这是正在发生。为什么?如何解决?

感谢您的帮助!

这里是完整的代码:

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

from google.appengine.api import users

from google.appengine.ext.webapp.util import run_wsgi_app

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)

clauses = {u'Software development agreement':"Don't be evil", 'Car Rental Contract':"non-skid the tires", 'House Rental Contract':"Don't break stuff"}

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 Person(db.Model):
    person_name = db.StringProperty(required = True)
    nacionality = db.StringProperty(required = True)
    marital_status = db.StringProperty(required = True)
    profession = db.StringProperty(required = True)
    SSN = db.IntegerProperty(required = True)
    driver_license = db.IntegerProperty(required = True)
    address = db.address = db.PostalAddressProperty(required = True)

class Contract(db.Model):
    book_number = db.IntegerProperty(required = True)
    initial_page = db.IntegerProperty(required = True)
    final_page = db.IntegerProperty(required = True)
    contract_type = db.StringProperty(required = True)
    date = db.DateProperty (required = True, auto_now = True, auto_now_add = True)

class RegisteredUser(db.Model):
    user_name = db.UserProperty()
    user_nickname = db.StringProperty()
    name = db.StringProperty()
    user_position = db.StringProperty()
    org_name = db.StringProperty()
    org_address = db.StringProperty()
    org_city = db.StringProperty()
    org_state = db.StringProperty()

class ContractingParty(db.Model):
    person = db.ReferenceProperty(Person, required=True, collection_name="party_to_contracts")
    contract = db.ReferenceProperty(Contract, required=True)
    condition = db.StringProperty(required = True, choices=set(["active position", "passive position", "witness"]))

class MainHandler(webapp2.RequestHandler):
    def get(self):
        user = users.get_current_user()
        if user == None:
            self.redirect(users.create_login_url(self.request.uri))
        geted_nickname = user.nickname()
        registeredUser = db.GqlQuery("SELECT * FROM RegisteredUser WHERE user_nickname =:nickname", nickname = geted_nickname).get()
        if registeredUser is None:
            self.redirect('/register?user_nickname=%s' % (geted_nickname))
        contract = db.GqlQuery("SELECT * FROM Contract ORDER BY date DESC").get()
        if contract == None:
            numBook = 1
            numInitialPage = 1
            numFinalPage = 1
        else:
            numBook = contract.book_number
            numInitialPage = contract.final_page +1
            numFinalPage = numInitialPage
        template_values = {"numBook": numBook,
                           "numInitialPage": numInitialPage,
                           "numFinalPage": numFinalPage}
        template = jinja_environment.get_template('index.html')
        self.response.out.write(template.render(template_values))

    def post(self):
        choosed_contract_type = self.request.get("contract_type")
        numBook = self.request.get("numBook")
        numInitialPage = self.request.get("numInitialPage")
        numFinalPage = self.request.get("numFinalPage")

        person_name = self.request.get("person_name")
        user_nacionality = self.request.get('nacionality')
        user_profession = self.request.get('profession')
        user_marital_status = self.request.get('marital_status')
        user_driver_license = self.request.get('driver_license')
        driver_license_error = ''
        user_SSN = self.request.get('SSN')
        SSN_error = ""
        address = self.request.get('address')

        person_name2 = self.request.get("person_name2")
        user_nacionality2 = self.request.get('nacionality2')
        user_profession2 = self.request.get('profession2')
        user_marital_status2 = self.request.get('marital_status2')
        user_driver_license2 = self.request.get('driver_license2')
        user_SSN2 = self.request.get('SSN2')
        SSN_error2 = ""
        address2 = self.request.get('address2')

        bsubmit = self.request.get('bsubmit')

        if (bsubmit == 'Submit Contract') and (person_name and valid_person(person_name)) and (user_SSN and valid_SSN(user_SSN)):
            contract_record = Contract(book_number = int(numBook),
                                       initial_page = int(numInitialPage),
                                       final_page = int(numFinalPage),
                                       contract_type = choosed_contract_type)
            contract_record.put()
            contract_id = contract_record.key().id()

            person_record = Person(person_name = person_name,
                               nacionality = user_nacionality,
                               profession = user_profession,
                               marital_status = user_marital_status,
                               driver_license = int(user_driver_license),
                               SSN = int(user_SSN),
                               address = address)
            person_record.put()
            person_id = person_record.key().id()

            person_record2 = Person(person_name = person_name2,
                               nacionality = user_nacionality2,
                               profession = user_profession2,
                               marital_status = user_marital_status2,
                               driver_license = int(user_driver_license2),
                               SSN = int(user_SSN2),
                               address = address2)
            person_record2.put()
            person_id2 = person_record2.key().id()

            self.redirect('/your_contract?contract_id=%s&person_id=%s&person_id2=%s' % (contract_id, person_id, person_id2))

        else:
            if not person_name or not valid_person(person_name):
                person_name_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!"
            template_values = {"person_name": person_name,
                                "nacionality": user_nacionality,
                                "marital_status": user_marital_status,
                                "profession": user_profession,
                                "SSN": user_SSN,
                                "driver_license": user_driver_license,
##                                "email": user_email,
                                "person_name_error": person_name_error,
                                "SSN_error": SSN_error,
                                "driver_license_error": user_driver_license,
                                "address": address,

                                "person_name2":person_name2,
                                "nacionality2":user_nacionality2,
                                "marital_status2":user_marital_status2,
                                "profession2":user_profession2,
                                "driver_license2":user_driver_license2,
                                "SSN2":user_SSN2,
                                "address2":user_address2,

                                "contract_type":choosed_contract_type,
                                "numBook":geted_numBook,
                                "numInitialPage":geted_numInitialPage,
                                "numFinalPage":geted_numInitialPage,
                                }
            template = jinja_environment.get_template('index.html')
            self.response.out.write(template.render(template_values))

class your_contractHandler(webapp2.RequestHandler):
    def get(self):
        contract_id = self.request.get('contract_id')
        contract = Contract.get_by_id(int(contract_id))
        geted_contract_type = contract.contract_type
        geted_clauses = clauses[geted_contract_type]
        geted_numBook = contract.book_number
        geted_numInitialPage = contract.initial_page
        geted_numFinalPage = contract.final_page

        geted_dateToday = dateToday()

        user = users.get_current_user()
        geted_nickname = user.nickname()
        registered_user = db.GqlQuery("SELECT * FROM RegisteredUser WHERE user_nickname =:nickname", nickname = geted_nickname).get()
        geted_autor_ato = registered_user.user_name
        user_position = registered_user.user_position
        org_name = registered_user.org_name
        org_city = registered_user.org_city
        org_state = registered_user.org_state

        person_id = self.request.get('person_id')
        person = Person.get_by_id(int(person_id))
        geted_person_name = person.person_name
        geted_user_nacionality = person.nacionality
        geted_user_profession = person.profession
        geted_user_marital_status = person.marital_status
        geted_user_driver_license = person.driver_license
        geted_user_SSN = person.SSN
        geted_user_address = person.address

        person_id2 = self.request.get('person_id2')
        person2 = Person.get_by_id(int(person_id2))
        geted_person_name2 = person2.person_name
        geted_user_nacionality2 = person2.nacionality
        geted_user_profession2 = person2.profession
        geted_user_marital_status2 = person2.marital_status
        geted_user_driver_license2 = person2.driver_license
        geted_user_SSN2 = person2.SSN
        geted_user_address2 = person2.address

        your_contract = jinja_environment.get_template('your_contract.html')
        your_contract_values = {"autor_ato":geted_autor_ato,
                                "user_position":user_position,
                                "org_name":org_name,
                                "org_city":org_city,
                                "org_state":org_state,
                                "contract_type":geted_contract_type,
                                "clauses":geted_clauses,
                                "dateContract":geted_dateToday,
                                "numBook":geted_numBook,
                                "numInitialPage":geted_numInitialPage,
                                "numFinalPage":geted_numInitialPage,

                                "person_name":geted_person_name,
                                "nacionality":geted_user_nacionality,
                                "marital_status":geted_user_marital_status,
                                "profession": geted_user_profession,
                                "driver_license":geted_user_driver_license,
                                "SSN":geted_user_SSN,
                                "address":geted_user_address,

                                "person_name2":geted_person_name2,
                                "nacionality2":geted_user_nacionality2,
                                "marital_status2":geted_user_marital_status2,
                                "profession2": geted_user_profession2,
                                "driver_license2":geted_user_driver_license2,
                                "SSN2":geted_user_SSN2,
                                "address2":geted_user_address2,
                                }
        template = jinja_environment.get_template('index.html')
        self.response.out.write(your_contract.render(your_contract_values))

class RegisterHandler(webapp2.RequestHandler):
    def get(self):
        user = users.get_current_user()
        if not user:
            self.redirect(users.create_login_url(self.request.uri))
        nickname = user.nickname()
        template_values = {"user_nickname": nickname}
        template = jinja_environment.get_template('register.html')
        self.response.out.write(template.render(template_values))

    def post(self):
        user = users.get_current_user()
        geted_user_nickname = user.nickname()
        geted_user_name = self.request.get("user_name")
        geted_user_position = self.request.get('position')
        geted_org_name = self.request.get('org_name')
        geted_org_address = self.request.get('org_adress')
        geted_address = self.request.get('address')
        geted_city = self.request.get('city')
        registered_user = RegisteredUser(user = user,
                               user_name = geted_user_name,
                               user_nickname = geted_user_nickname,
                               position = geted_user_position,
                               org_name = geted_org_name,
                               org_address = geted_org_address,
                               city = geted_city,
                               )
        registered_user.put()
##        registered_user_id = registered_user.key().id()
        self.redirect('/')

app = webapp2.WSGIApplication([('/', MainHandler), ('/your_contract', your_contractHandler), ('/register', RegisterHandler)],
                              debug=True)

最佳答案

根据docs调用 redirect 不会停止代码执行,除非 abort 设置为 True。它建议返回重定向的结果,例如:

return redirect('/some-path') 

在您的例子中,您的方法一直在执行,user(即 None)正在查找一个不存在的属性。

关于python - 使用 get_current_user() 方法时产生此 python AttributeError 的原因是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11837693/

相关文章:

python - 为什么在引发错误时继续不起作用

python - Julia 是否有与 Python 相同的方式来读取和写入数据(数组和字符串)?

Python 2字节二进制数组转换为整数或 float

java - 以编程方式访问 Google App Engine 配额详细信息

scala - 错误: value saveAsTextFile is not a member of Unit

python - 我如何让 Python 计算一个单词中有多少个字母?

PHP App Engine 部署问题

node.js - Google App Engine - Node : Cannot find module 'firebase-admin'

vba - 插入工作表

循环时Python缩进错误