在开发服务器中,Google App Engine BulkLoader应使用哪些凭据?
我想问一下,使用Google App Engine的BulkLoader类导入数据时,我需要提供什么样的凭证呢?
appcfg.py upload_data --config_file=models.py --filename=listcountries.csv --kind=CMSCountry --url=http://localhost:8178/remote_api vit/
然后它让我输入凭证:
请输入localhost的登录凭证
这里是models.py文件的一部分内容,我使用的是这个listcountries.csv文件。
class CMSCountry(db.Model):
sortorder = db.StringProperty()
name = db.StringProperty(required=True)
formalname = db.StringProperty()
type = db.StringProperty()
subtype = db.StringProperty()
sovereignt = db.StringProperty()
capital = db.StringProperty()
currencycode = db.StringProperty()
currencyname = db.StringProperty()
telephonecode = db.StringProperty()
lettercode = db.StringProperty()
lettercode2 = db.StringProperty()
number = db.StringProperty()
countrycode = db.StringProperty()
class CMSCountryLoader(bulkloader.Loader):
def __init__(self):
bulkloader.Loader.__init__(self, 'CMSCountry',
[('sortorder', str),
('name', str),
('formalname', str),
('type', str),
('subtype', str),
('sovereignt', str),
('capital', str),
('currencycode', str),
('currencyname', str),
('telephonecode', str),
('lettercode', str),
('lettercode2', str),
('number', str),
('countrycode', str)
])
loaders = [CMSCountryLoader]
每次尝试输入邮箱和密码都显示“认证失败”,所以我无法将数据导入到开发服务器上。
我觉得我的文件和模型没有问题,因为我已经成功将数据上传到appspot.com的应用程序了。
那么我应该在localhost凭证中填什么呢?
我也尝试过使用Eclipse和Pydev,但仍然收到相同的消息 :(
这是输出结果:
Uploading data records.
[INFO ] Logging to bulkloader-log-20090820.121659
[INFO ] Opening database: bulkloader-progress-20090820.121659.sql3
[INFO ] [Thread-1] WorkerThread: started
[INFO ] [Thread-2] WorkerThread: started
[INFO ] [Thread-3] WorkerThread: started
[INFO ] [Thread-4] WorkerThread: started
[INFO ] [Thread-5] WorkerThread: started
[INFO ] [Thread-6] WorkerThread: started
[INFO ] [Thread-7] WorkerThread: started
[INFO ] [Thread-8] WorkerThread: started
[INFO ] [Thread-9] WorkerThread: started
[INFO ] [Thread-10] WorkerThread: started
Password for foobar@nowhere.com: [DEBUG ] Configuring remote_api. url_path = /remote_api, servername = localhost:8178
[DEBUG ] Bulkloader using app_id: abc
[INFO ] Connecting to /remote_api
[ERROR ] Exception during authentication
Traceback (most recent call last):
File "D:\Projects\GoogleAppEngine\google_appengine\google\appengine\tools\bulkloader.py", line 2802, in Run
request_manager.Authenticate()
File "D:\Projects\GoogleAppEngine\google_appengine\google\appengine\tools\bulkloader.py", line 1126, in Authenticate
remote_api_stub.MaybeInvokeAuthentication()
File "D:\Projects\GoogleAppEngine\google_appengine\google\appengine\ext\remote_api\remote_api_stub.py", line 488, in MaybeInvokeAuthentication
datastore_stub._server.Send(datastore_stub._path, payload=None)
File "D:\Projects\GoogleAppEngine\google_appengine\google\appengine\tools\appengine_rpc.py", line 344, in Send
f = self.opener.open(req)
File "C:\Python25\lib\urllib2.py", line 381, in open
response = self._open(req, data)
File "C:\Python25\lib\urllib2.py", line 399, in _open
'_open', req)
File "C:\Python25\lib\urllib2.py", line 360, in _call_chain
result = func(*args)
File "C:\Python25\lib\urllib2.py", line 1107, in http_open
return self.do_open(httplib.HTTPConnection, req)
File "C:\Python25\lib\urllib2.py", line 1082, in do_open
raise URLError(err)
URLError: <urlopen error (10061, 'Connection refused')>
[INFO ] Authentication Failed
谢谢!
9 个回答
编辑:看看我新的解决方案
这个问题依然存在。我已经在这里提交了一个请求,询问是否可以在本地开发服务器上绕过身份验证。请为这个问题投票,这样我们就能尽快解决它。
我已经能够通过以下方式将数据上传到开发服务器:
- 在app.yaml文件中保留“login:admin”这一行
- 在命令中添加“--email=foobar@nowhere.com”
- 在提示输入密码时直接按回车(不需要输入任何东西)
保留“login:admin”这一行是件好事,因为如果没有这一行,你就无法在生产服务器上上传你的应用,这样可能会让别人有机会往你的数据存储中添加数据……
引用内容
好消息:我找到了使用 bulkloader.py
工具的方法,不需要手动输入登录信息。
这里有两个步骤:
第一步,设置你的 app.yaml
文件。示例:
- url: /remote_api
script: $PYTHON_LIB/google/appengine/ext/remote_api/handler.py
login: admin
你应该把这段代码放在 - url: .*
这一行之前,否则你永远无法访问 /remote_api
这个网址。
注意,我保留了 login: admin
这一部分,去掉它是个非常糟糕的做法,因为你可能会把这个设置放到生产环境中...
第二步,运行这个命令(根据你的需要进行调整)。
echo 'XX' | python2.5 ../google_appengine/bulkloader.py --dump --kind=NAMEOFMODEL --url=http://localhost:8080/remote_api --filename=FILENAME --app_id=APPID --email=foobar@nowhere.com --passin .
诀窍在于使用这两个参数的组合:
--email=
(你可以填写任何你想要的邮箱地址,我用的是foobar@nowhere.com
)--passin
指定 --email=
会让你不再看到“输入凭据”的提示,而 --passin
则允许从 stdin
中读取密码(这就是 echo 'XX' |
的用处!)
祝你好运!
附言:别忘了投票,这样谷歌才能提供更简单的使用方法: 问题 2440。
我建议你参考这里的建议,我引用一下:
在app.yaml文件中添加以下内容:
-- url: /loadusers script: myloader.py login: admin
注意,如果你在本地开发机器上运行,记得把最后一行 login:admin 注释掉,这样你就不需要凭证就能运行批量加载工具。
(我特别强调一下)。