我将在此页面上阅读Google Developers Academy的App Engine教程:https://developers.google.com/appengine/training/cloud-sql/application_with_local_mysql
它是关于使用本地MySQL实例构建留言簿应用程序。我运行教程$ app_engine_sdk_path/dev_appserver.py --mysql_socket=mysql_socket_path .
末尾给出的dev_appserver命令,用我计算机中的实际路径替换这两个路径。之后,终端输出看起来不错:
INFO 2013-10-16 05:30:54,815 sdk_update_checker.py:245] Checking for updates to the SDK.
INFO 2013-10-16 05:30:55,025 sdk_update_checker.py:273] The SDK is up to date.
WARNING 2013-10-16 05:30:55,066 api_server.py:332] Could not initialize images API; you are likely missing the Python "PIL" module.
INFO 2013-10-16 05:30:55,072 api_server.py:139] Starting API server at: http://localhost:50138
INFO 2013-10-16 05:30:55,076 dispatcher.py:171] Starting module "default" running at: http://localhost:8080
INFO 2013-10-16 05:30:55,081 admin_server.py:117] Starting admin server at: http://localhost:8000
但是在我的浏览器中转到localhost:8080之后,我在终端中收到一条很大的错误消息,其中有很多行引用webapp2.py
:
ERROR 2013-10-16 05:31:04,828 webapp2.py:1528] connect() got an unexpected keyword argument 'user'
Traceback (most recent call last):
File "/Applications/GoogleAppEngineLauncher.app/Contents/Resources/GoogleAppEngine
default.bundle/Contents/Resources/google_appengine/lib/webapp2-2.3/webapp2.py", line 1511, in __call__
rv = self.handle_exception(request, response, e)
File "/Applications/GoogleAppEngineLauncher.app/Contents/Resources/GoogleAppEngine-default.bundle/Contents/Resources/google_appengine/lib/webapp2-2.3/webapp2.py", line 1505, in __call__
rv = self.router.dispatch(request, response)
File "/Applications/GoogleAppEngineLauncher.app/Contents/Resources/GoogleAppEngine-default.bundle/Contents/Resources/google_appengine/lib/webapp2-2.3/webapp2.py", line 1253, in default_dispatcher
return route.handler_adapter(request, response)
File "/Applications/GoogleAppEngineLauncher.app/Contents/Resources/GoogleAppEngine-default.bundle/Contents/Resources/google_appengine/lib/webapp2-2.3/webapp2.py", line 1077, in __call__
return handler.dispatch()
File "/Applications/GoogleAppEngineLauncher.app/Contents/Resources/GoogleAppEngine-default.bundle/Contents/Resources/google_appengine/lib/webapp2-2.3/webapp2.py", line 547, in dispatch
return self.handle_exception(e, self.app.debug)
File "/Applications/GoogleAppEngineLauncher.app/Contents/Resources/GoogleAppEngine-default.bundle/Contents/Resources/google_appengine/lib/webapp2-2.3/webapp2.py", line 545, in dispatch
return method(*args, **kwargs)
File "/Users/patneedham/Documents/AppEngine/mysql-demo/main.py", line 29, in get
conn = get_connection()
File "/Users/patneedham/Documents/AppEngine/mysql-demo/main.py", line 23, in get_connection
user=USER_NAME, password=PASSWORD, charset='utf8')
TypeError: connect() got an unexpected keyword argument 'user'
ERROR 2013-10-16 05:31:04,830 wsgi.py:278]
Traceback (most recent call last):
File "/Applications/GoogleAppEngineLauncher.app/Contents/Resources/GoogleAppEngine-default.bundle/Contents/Resources/google_appengine/google/appengine/runtime/wsgi.py", line 266, in Handle
result = handler(dict(self._environ), self._StartResponse)
File "/Applications/GoogleAppEngineLauncher.app/Contents/Resources/GoogleAppEngine-default.bundle/Contents/Resources/google_appengine/lib/webapp2-2.3/webapp2.py", line 1519, in __call__
response = self._internal_error(e)
File "/Applications/GoogleAppEngineLauncher.app/Contents/Resources/GoogleAppEngine-default.bundle/Contents/Resources/google_appengine/lib/webapp2-2.3/webapp2.py", line 1511, in __call__
rv = self.handle_exception(request, response, e)
File "/Applications/GoogleAppEngineLauncher.app/Contents/Resources/GoogleAppEngine-default.bundle/Contents/Resources/google_appengine/lib/webapp2-2.3/webapp2.py", line 1505, in __call__
rv = self.router.dispatch(request, response)
File "/Applications/GoogleAppEngineLauncher.app/Contents/Resources/GoogleAppEngine-default.bundle/Contents/Resources/google_appengine/lib/webapp2-2.3/webapp2.py", line 1253, in default_dispatcher
return route.handler_adapter(request, response)
File "/Applications/GoogleAppEngineLauncher.app/Contents/Resources/GoogleAppEngine-default.bundle/Contents/Resources/google_appengine/lib/webapp2-2.3/webapp2.py", line 1077, in __call__
return handler.dispatch()
File "/Applications/GoogleAppEngineLauncher.app/Contents/Resources/GoogleAppEngine-default.bundle/Contents/Resources/google_appengine/lib/webapp2-2.3/webapp2.py", line 547, in dispatch
return self.handle_exception(e, self.app.debug)
File "/Applications/GoogleAppEngineLauncher.app/Contents/Resources/GoogleAppEngine-default.bundle/Contents/Resources/google_appengine/lib/webapp2-2.3/webapp2.py", line 545, in dispatch
return method(*args, **kwargs)
File "/Users/patneedham/Documents/AppEngine/mysql-demo/main.py", line 29, in get
conn = get_connection()
File "/Users/patneedham/Documents/AppEngine/mysql-demo/main.py", line 23, in get_connection
user=USER_NAME, password=PASSWORD, charset='utf8')
TypeError: connect() got an unexpected keyword argument 'user'
INFO 2013-10-16 05:31:04,837 module.py:608] default: "GET / HTTP/1.1" 500 -
最后一条错误消息行没有任何意义:TypeError: connect() got an unexpected keyword argument 'user'
抱怨这个:
return rdbms.connect(instance=CLOUDSQL_INSTANCE, database=DATABASE_NAME,
user=USER_NAME, password=PASSWORD, charset='utf8')
rdbms
来自导入语句from google.appengine.api import rdbms
。我在此网站上找到了Google托管的rdbms代码:https://code.google.com/p/googleappengine/source/browse/trunk/python/google/appengine/api/rdbms.py
连接方法是:
def connect(instance=None, database=None, **kwargs):
global _instance
if not instance and _instance:
instance = _instance
if 'db' in kwargs and not database:
database = kwargs.pop('db')
user = None
if 'user' in kwargs:
user = kwargs.pop('user')
password = None
if 'password' in kwargs:
password = kwargs.pop('password')
if kwargs:
logging.info('Ignoring extra kwargs to connect(): %r', kwargs)
return rdbms_apiproxy.connect('unused_address',
instance,
database=database,
user=user,
password=password)
肯定是期待关键字参数'user',这使得整个事情非常令人沮丧。我还检查了以确保我在本地的rdbms文件是相同的,它是,所以这不是由于它的旧版本引起的。
我在这里找到了另一个有同样问题的人的情况:( https://code.google.com/p/googleappengine/issues/detail?can=2&start=0&num=100&q=&colspec=ID%20Type%20Component%20Status%20Stars%20Summary%20Language%20Priority%20Owner%20Log&groupby=&sort=&id=10102),但没有答案。
答案 0 :(得分:2)
我认为该文件可能已过时。
通过删除connect
中的用户和密码参数并在启动dev_appserver时移动它们会更容易解决问题。由于rdbms在运行时并不真正使用这两个参数,因此最好让它们仅存在于开发环境中。
def get_connection():
# remove user / password
return rdbms.connect(instance=CLOUDSQL_INSTANCE, database=DATABASE_NAME)
# start the dev server with user/password
$ app_engine_sdk_path/dev_appserver.py --mysql_socket=mysql_socket_path --mysql_user=[MYSQL_USER] --mysql_password=[MYSQL_PASSWORD] .
# some other variables available.
[--mysql_host MYSQL_HOST] [--mysql_port MYSQL_PORT]
[--mysql_user MYSQL_USER]
[--mysql_password MYSQL_PASSWORD]
[--mysql_socket MYSQL_SOCKET]
Google App Engine还提供了一个MySQLdb界面。
https://developers.google.com/appengine/docs/python/cloud-sql/#Python_complete_python_example
if (os.getenv('SERVER_SOFTWARE') and
os.getenv('SERVER_SOFTWARE').startswith('Google App Engine/')):
db = MySQLdb.connect(unix_socket='/cloudsql/your-project-id:your-instance-name', user='root')
else:
db = MySQLdb.connect(host='localhost', user='root')
答案 1 :(得分:1)
虽然我尝试复制您所看到的症状,但请尝试尝试MySQLdb
。见https://developers.google.com/appengine/docs/python/cloud-sql/#Python_Connect_to_your_database
答案 2 :(得分:1)
查看您链接到的代码,在rdbms.py
中:
"""Relational database API for production.
Note that rdbms_mysqldb is the module used in dev_appserver.
"""
然后,在rbdms_mysqldb.py
:
try:
import google
import MySQLdb
from MySQLdb import *
__import__('MySQLdb.constants', globals(), locals(), ['*'])
except ImportError:
def connect(instance=None, database=None):
logging.error('The rdbms API (Google Cloud SQL) is not available because '
'the MySQLdb library could not be loaded. Please see the SDK '
'documentation for installation instructions.')
raise NotImplementedError('Unable to find the MySQLdb library')
else:
def connect(instance=None, database=None, **kwargs):
因此,如果没有connect
或user
参数,您可以定义**kwargs
的唯一方法是,如果您没有安装MySQLdb
pip install mysql-python