読者です 読者をやめる 読者になる 読者になる

ローカル環境のDatastore Viewerでエラー

Kayで試しに作っていて、Datastore Viewerで日本語のリストを含むKindを見ようとすると、

A server error occurred.  Please contact the administrator.

という状態になってしまった。
ログを見ると、

ImportError: No module named _multiprocessing

ということでモジュールがないらしい。

調べたら、 Issue 1504: No module named _multiprocessingという、まんまのページがあった。
アプリのルートに_multiprocessing.pyを作って、

import multiprocessing

と書いたらこのエラーは出なくなった。が、

Traceback (most recent call last):
  File "/home/hakuja/Dev/gae/google_appengine/google/appengine/ext/webapp/__init__.py", line 507, in __call__
    handler.get(*groups)
  File "/home/hakuja/Dev/gae/google_appengine/google/appengine/ext/admin/__init__.py", line 672, in get
    value = data_type.format(raw_value)
  File "/home/hakuja/Dev/gae/google_appengine/google/appengine/ext/admin/__init__.py", line 1020, in format
    writer.writerow(value)
UnicodeEncodeError: 'ascii' codec can't encode characters in position 0-2: ordinal not in range(128)

orz


該当コードを見てみると、csv出力でエラーになっている模様。
また調べてこのページを参考に、

--- orig/google_appengine/google/appengine/ext/admin/__init__.py  2009-12-15 08:22:19.000000000 +0900
+++ google_appengine/google/appengine/ext/admin/__init__.py 2010-01-12 16:17:33.000000000 +0900
@@ -1017,7 +1017,9 @@
     value_file = cStringIO.StringIO()
     try:
       writer = csv.writer(value_file)
-      writer.writerow(value)
+      writer.writerow(
+          [unicode(s).encode("utf-8") for s in value]
+      )
       return value_file.getvalue()
     finally:
       value_file.close()

と変更したら、表示できるようになった。

が、キーをクリックして編集画面を表示しようとしたところで、

Traceback (most recent call last):
  File "/home/hakuja/Dev/gae/google_appengine/google/appengine/ext/webapp/__init__.py", line 507, in __call__
    handler.get(*groups)
  File "/home/hakuja/Dev/gae/google_appengine/google/appengine/ext/admin/__init__.py", line 839, in get
    field = data_type.input_field(name, value, sample_values)
  File "/home/hakuja/Dev/gae/google_appengine/google/appengine/ext/admin/__init__.py", line 927, in input_field
    cgi.escape(string_value, True))
UnicodeDecodeError: 'ascii' codec can't decode byte 0xe3 in position 0: ordinal not in range(128)

とりあえず、

--- orig/google_appengine/google/appengine/ext/admin/__init__.py  2009-12-15 08:22:19.000000000 +0900
+++ google_appengine/google/appengine/ext/admin/__init__.py 2010-01-12 17:06:45.000000000 +0900
@@ -923,7 +923,7 @@
     else:
       string_value = ''
     return '<input class="%s" name="%s" type="text" size="%d" value="%s"/>' % (cgi.escape(self.name()), cgi.escape(name), self.input_field_size(),
-            cgi.escape(string_value, True))
+            cgi.escape(unicode(string_value, 'utf-8'), True))

   def input_field_size(self):
     return 30

で表示できた。