簡體   English   中英

為什么我不能從包含任何Google App Engine組件導入的文件中導入模型?

[英]Why can't I import a model from a file containing import of any of the Google App Engine components?

我正在嘗試使用TDD構建一個簡單的Google App Engine應用程序。

當我嘗試導入客戶模型時,出現錯誤:

$ python functional_tests.py  
Traceback (most recent call last):  
  File "functional_tests.py", line 4, in <module>  
    from models import Customer    
  File "/Users/Bryan/work/GoogleAppEngine/dermalfillersecrets/models.py", line 1, in <module>  
    from google.appengine.ext import ndb    
ImportError: No module named google.appengine.ext  

這是model.py中的代碼:

from google.appengine.ext import ndb  

class Customer(ndb.Model):  
    email =  ndb.StringProperty()   
    name = ndb.StringProperty(indexed=True)    

這是來自functional_tests.py的代碼:

from selenium import webdriver  
import unittest  
from models import Customer  

class NewVisitorTest(unittest.TestCase):

    def setUp(self):
        self.browser = webdriver.Firefox()
        self.browser.implicitly_wait(3)

    def tearDown(self):
        self.browser.quit()

    def test_quest_can_submit_contact_info(self):  
        self.browser.get('http://localhost:9080')  
        self.browser.find_element_by_name('id_name').send_keys("Kallie Wheelock")  
        self.browser.find_element_by_name('id_email').send_keys("kallie@gmail.com")  
        self.browser.find_element_by_name('submit').submit()  
        Customer.query(Customer.name("Kallie Wheelock")).delete()  

您的特定問題是您沒有將App Engine SDK導入到sys路徑。 sys.path.append("/usr/local/google_appengine")解決了ImportError。

但是要完全解決您的TDD挑戰,您必須使用dev_appserver並與硒一起使用測試平台。 我采用了https://stackoverflow.com/a/20986246/710851中提出的解決方案,並針對您的用例進行了配置。

  1. 在調用應用程序引擎庫之前,將SDK和其他所需的庫導入到系統路徑:
import sys

sys.path.append("/usr/local/google_appengine")
sys.path.append("/usr/local/google_appengine/lib/yaml/lib")
sys.path.append("/usr/local/google_appengine/lib/webapp2-2.5.2")
sys.path.append("/usr/local/google_appengine/lib/django-1.5")
sys.path.append("/usr/local/google_appengine/lib/cherrypy")
sys.path.append("/usr/local/google_appengine/lib/concurrent")
sys.path.append("/usr/local/google_appengine/lib/docker")
sys.path.append("/usr/local/google_appengine/lib/requests")
sys.path.append("/usr/local/google_appengine/lib/websocket")
sys.path.append("/usr/local/google_appengine/lib/fancy_urllib")
sys.path.append("/usr/local/google_appengine/lib/antlr3")
  1. 啟動dev_appserver,selenium並在您的setUp方法中設置測試平台:
def setUp(self):

    # setup dev_appserver
    APP_CONFIGS = ['app.yaml']
    python_runtime._RUNTIME_ARGS = [
        sys.executable,
        os.path.join(os.path.dirname(dev_appserver.__file__),
                     '_python_runtime.py')
    ]
    options = devappserver2.PARSER.parse_args([
        '--admin_port', '0',
        '--port', '9080',
        '--datastore_path', ':memory:',
        '--logs_path', ':memory:',
        '--skip_sdk_update_check',
        '--',
    ] + APP_CONFIGS)
    server = devappserver2.DevelopmentServer()
    server.start(options)
    self.server = server

    # setup selenium
    self.browser = webdriver.Firefox()
    self.browser.implicitly_wait(3)

    # setup the testbed
    self.tb = testbed.Testbed()
    self.tb.setup_env(current_version_id='testbed.version')
    self.tb.activate()
    self.tb.init_user_stub()
    self.tb.init_datastore_v3_stub()
    self.tb.init_memcache_stub()
  1. 停用tearDown方法中的所有內容:
def tearDown(self):
    self.browser.quit()
    self.tb.deactivate()
    self.server.stop()

完整的例子:

import os
import sys

sys.path.append("/usr/local/google_appengine")
sys.path.append("/usr/local/google_appengine/lib/yaml/lib")
sys.path.append("/usr/local/google_appengine/lib/webapp2-2.5.2")
sys.path.append("/usr/local/google_appengine/lib/django-1.5")
sys.path.append("/usr/local/google_appengine/lib/cherrypy")
sys.path.append("/usr/local/google_appengine/lib/concurrent")
sys.path.append("/usr/local/google_appengine/lib/docker")
sys.path.append("/usr/local/google_appengine/lib/requests")
sys.path.append("/usr/local/google_appengine/lib/websocket")
sys.path.append("/usr/local/google_appengine/lib/fancy_urllib")
sys.path.append("/usr/local/google_appengine/lib/antlr3")

import dev_appserver
from google.appengine.tools.devappserver2 import devappserver2
from google.appengine.tools.devappserver2 import python_runtime
from google.appengine.ext import testbed

from selenium import webdriver
import unittest
from models import Customer


class NewVisitorTest(unittest.TestCase):

    def setUp(self):

        # setup the dev_appserver
        APP_CONFIGS = ['app.yaml']
        python_runtime._RUNTIME_ARGS = [
            sys.executable,
            os.path.join(os.path.dirname(dev_appserver.__file__),
                         '_python_runtime.py')
        ]
        options = devappserver2.PARSER.parse_args([
            '--admin_port', '0',
            '--port', '9080',
            '--datastore_path', ':memory:',
            '--logs_path', ':memory:',
            '--skip_sdk_update_check',
            '--',
        ] + APP_CONFIGS)
        server = devappserver2.DevelopmentServer()
        server.start(options)
        self.server = server

        # setup selenium
        self.browser = webdriver.Firefox()
        self.browser.implicitly_wait(3)

        # setup the testbed
        self.tb = testbed.Testbed()
        self.tb.setup_env(current_version_id='testbed.version')
        self.tb.activate()
        self.tb.init_user_stub()
        self.tb.init_datastore_v3_stub()
        self.tb.init_memcache_stub()

    def tearDown(self):
        self.browser.quit()
        self.tb.deactivate()
        self.server.stop()

    def test_quest_can_submit_contact_info(self):
        self.browser.get('http://localhost:9080')
        self.browser.find_element_by_name('id_name').send_keys("Kallie Wheelock")
        self.browser.find_element_by_name('id_email').send_keys("kallie@gmail.com")
        self.browser.find_element_by_name('submit').submit()
        Customer.query(Customer.name("Kallie Wheelock")).delete()

在最新版本中,請確保添加此行

 if 'google' in sys.modules:
    del sys.modules['google']

下面的完整示例

import sys
sys.path.append('/usr/local/google_appengine/')
sys.path.append('/usr/local/google_appengine/lib/yaml/lib/')

  if 'google' in sys.modules:
      del sys.modules['google']

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM