Проблема при импорте классов из файла моделей в GAE - PullRequest
0 голосов
/ 26 октября 2009

Я очень плохо знаком с python и после краткого введения в python + движок приложений Google, я начал работать над пилотным проектом. Я загрузил 2 объекта UserDetails и PhoneBook с данными на движок приложения. Теперь в моем пользовательском интерфейсе я пытаюсь сначала взять имя пользователя, затем запросить его, чтобы получить идентификатор пользователя из UserDetails, затем, используя полученный идентификатор пользователя, я запрашиваю телефонную книгу, чтобы получить записи его телефонной книги. Вот мой код для пользовательского интерфейса,

#!/usr/bin/env python

import wsgiref.handlers
from google.appengine.ext import db
from google.appengine.ext import webapp
from google.appengine.ext.webapp import template
from models import UserDetails,PhoneBook
#import models

class showPhoneBook(db.Model):
    """ class to store the user_name to db """
    user_name = db.StringProperty(required=True)

class MyHandler(webapp.RequestHandler):
    def get(self):
        """ Query type 1 """
        #p = db.GqlQuery('SELECT * FROM UserDetails WHERE user_name = :1', user_name)

        """ Query type 2 """
        #p = UserDetails.gql('WHERE user_name = :1', user_name)

        """ Query type 3 """
        p = UserDetails.all().filter('user_name = ', user_name)
        result1 = p.get()
        for itr1 in result1:
            userId = itr.user_id

        """ Query type 1 """    
        #q = db.GqlQuery('SELECT * FROM PhoneBook WHERE user_id = :1', userId)

        """ Query type 2 """
        #q = PhoneBook.gql('WHERE user_id = :1', userId)

        """ Query type 3 """
        q = PhoneBook.all().filter('user_id = ', userId)
        values = {
            'phoneBookValues': q
        }
        self.response.out.write(
            template.render('phonebook.html', values))
    def post(self):
        phoneBookuserID = showPhoneBook(
            user_name = self.request.get('username'))
        phonebookuserID.put()
        self.redirect('/')

def main():
    app = webapp.WSGIApplication([
        (r'.*',MyHandler)], debug=True)
    wsgiref.handlers.CGIHandler().run(app)

if __name__ == "__main__":
    main()

Проблема в том, что я получаю в своих журналах сообщение об ошибке, что GAE не может импортировать класс UserDetails / phone из моделей,

<type 'exceptions.ImportError'>: cannot import name UserDetails
Traceback (most recent call last):
  File "/base/data/home/apps/bulkloader160by2/1-4.337299749289926105/main.py", line 7, in <module>
    from models import UserDetails,PhoneBook

и когда я удаляю from models import UserDetails,PhoneBook и использую import models, я получаю,

global name 'UserDetails' is not defined
Traceback (most recent call last):
  File "/base/python_lib/versions/1/google/appengine/ext/webapp/__init__.py", line 507, in __call__
    handler.get(*groups)
  File "/base/data/home/apps/bulkloader160by2/1-4.337300095868541686/main.py", line 19, in get
    p = UserDetails.all().filter('user_name = ', user_name)
NameError: global name 'UserDetails' is not defined

Это мой файл models.py, в котором определены мои классы UserDetails и PhoneBook. Я сохранил этот файл в корневом каталоге.

#!/usr/bin/env python

from google.appengine.ext import db

#Table structure of User Details table
class UserDetails(db.Model):
  user_id = db.IntegerProperty(required = True)
  user_name = db.StringProperty(required = True)
  mobile_number = db.PhoneNumberProperty(required = True)

#Table structure of Phone Book table
class PhoneBook(db.Model):
  contact_id = db.IntegerProperty(required=True)
  user_id = db.IntegerProperty(required=True)
  contact_name = db.StringProperty(required=True)
  contact_number = db.PhoneNumberProperty(required=True)

Будучи новичком в python, я не могу понять, почему не могу импортировать мои классы из моего файла models.py и как установить / получить имя пользователя от post(self) до get(self).

Пожалуйста, прости меня, если я наивен, но твоя помощь очень ценится, если ты поможешь мне правильно настроить мой код.

Спасибо.

Ответы [ 2 ]

1 голос
/ 26 октября 2009

Первая ошибка, которую вы получаете, возникает, когда он может нормально импортировать модуль ('models'), но не может найти в нем члена ('UserDetails'). Как правило, это имеет место, если вы неправильно набрали имя класса или не определили его в этом модуле.

Ожидается вторая ошибка, потому что вы импортируете модуль 'models', но затем пытаетесь ссылаться на UserDetails по его неквалифицированному имени - вам нужно ссылаться на него как 'models.UserDetails', если вы импортируете только модуль .

Однако, исходя из предоставленного вами кода, я не вижу в этом ничего плохого, и это заставляет меня поверить, что это то, что вы изменили для вставленных вами фрагментов. Дважды проверьте, что UserDetails определен правильно в вашем файле models.py. Вы также можете попробовать следующее:

import models
logging.warn(models.__file__)

Это покажет вам путь к модулю моделей, который позволит вам убедиться, что нет другого модуля с таким же именем, который вы случайно импортировали вместо него.

0 голосов
/ 27 октября 2009

Если models.py находится в подкаталоге, вам может потребоваться добавить его в системный путь, например:

sys.path.append(os.path.join(os.path.dirname(__file__), "lib"))

Если модель - это каталог, а классы находятся в UserDetails.py и т. Д., Вам может потребоваться:

sys.path.append(os.path.join(os.path.dirname(__file__), "models"))
import UserDetails
...