0

私はPythonを初めて使用し、Python + Google App Engineを簡単に紹介した後、パイロットプロジェクトに取り組み始めました。2つのエンティティUserDetailsとPhoneBookをデータとともにアプリエンジンにバルクロードしました。UIで、最初にユーザー名を取得し、それをクエリしてUserDetailsからユーザーIDを取得し、取得したユーザーIDを使用してPhoneBookにクエリを実行して電話帳のエントリを取得しようとします。これがUIのコードです。

#!/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

これは、UserDetailsクラスとPhoneBookクラスを定義したmodels.pyファイルです。このファイルをルートディレクトリに保存しました。

#!/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ファイルからクラスをインポートできない理由とuser_nameをからに設定/取得する方法を理解できませpost(self)get(self)

私が素朴であるならば、私を許してください、しかし、あなたが私のコードを正しく設定するのを手伝ってくれるならば、あなたの助けは最もありがたいです。

ありがとう。

4

2 に答える 2

1

最初のエラーは、モジュール ('models') を正常にインポートできるが、その中にメンバー ('UserDetails') が見つからない場合に発生します。これは通常、クラスの名前を間違って入力したか、そのモジュールで定義していなかった場合に当てはまります。

「models」モジュールをインポートしているが、修飾されていない名前で UserDetails を参照しようとしているため、2 番目のエラーが予想されます。モジュールだけをインポートする場合は、「models.UserDetails」として参照する必要があります。

ただし、提供されたコードに基づいて、何も問題が見られないため、貼り付けたスニペットに対して変更したものだと思います。models.py ファイルで UserDetails が正しく定義されていることを再確認してください。次のことも試してみてください。

import models
logging.warn(models.__file__)

これにより、models モジュールへのパスが表示されます。これにより、代わりに誤ってインポートしている同じ名前の別のモジュールがないことを確認できます。

于 2009-10-26T13:30:13.473 に答える
0

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
于 2009-10-26T23:11:21.090 に答える