データストアから取得したデータを使おうとするとエラー発生

92 views
Skip to first unread message

hironori yamashita

unread,
Sep 22, 2011, 8:12:52 AM9/22/11
to kay-users-ja
こんばんわ。
いつもお世話になっております。山下です。
また質問させてください。

データストアから取得したデータ(日本語のみ)を以下のようにするとエラーが発生してしまいます。
前は同じ方法で取得できたのですができなくなり、原因わからずここ数日悩んでおります。。。
どなたかご教授いただけないでしょうか。

コード
***********************************************
gql = 'SELECT * FROM pages'
gql += ' WHERE organize_id=:1 AND device=:2 AND lang=:3 AND page_id IN
(:4,:5) ORDER BY index DESC'
query = db.GqlQuery(gql, organize_id,hard,lang,'style','main')

for row in query:
print row.base_use #半角英数字は正常に出力される
print row.title #全角文字は以下のエラーが発生する。
***********************************************

error内容
***********************************************
TypeError: 'int' object is not callable
***********************************************


(ご回答頂ける先生へ 今日から4日ほど実家に帰りネットが使えないため返信が遅れます。)

Toshiharu Moriyama

unread,
Sep 22, 2011, 3:13:43 PM9/22/11
to kay-us...@googlegroups.com
Model のプロパティは、どうなっているのでしょう?
その日本語が入っている変数を Integer object として処理しているからかな?

print unicode(row.title)

かな?

hironori yamashita

unread,
Sep 28, 2011, 8:58:41 AM9/28/11
to kay-us...@googlegroups.com
Moriyamaさん
お返事ありがとうございます。

print unicode(row.title) ためしてみましたが、エラー内容が変わりませんでした(泣)
テーブルの型は(string)になってます。


Takashi Matsuo

unread,
Sep 28, 2011, 9:00:51 AM9/28/11
to kay-us...@googlegroups.com

これは開発用サーバーでのことですか?
それとも app engine 上でのことですか?

コードはどのようになっていますか?
そのデータは Admin Console では見られるのでしょうか?

-- 
Takashi Matsuo
matsuo....@gmail.com
Kay's daddy


2011/9/22 hironori yamashita <yama.i...@gmail.com>

--
このメールは Google グループのグループ「kay-users-ja」の登録者に送られています。
このグループに投稿するには、kay-us...@googlegroups.com にメールを送信してください。
このグループから退会するには、kay-users-ja...@googlegroups.com にメールを送信してください。
詳細については、http://groups.google.com/group/kay-users-ja?hl=ja からこのグループにアクセスしてください。


hironori yamashita

unread,
Sep 28, 2011, 9:12:53 AM9/28/11
to kay-us...@googlegroups.com
Matsuoさん
お返事ありがとうございます。

環境は開発環境です。
Admin Consoleとは以下のURLのものですかね?

こちらでは保存内容を確認できています。


Takashi Matsuo

unread,
Sep 28, 2011, 9:16:41 AM9/28/11
to kay-us...@googlegroups.com

コードを見せていただくことはできますか?
エラーを全て見せていただくことはできますか?

-- 
Takashi Matsuo
matsuo....@gmail.com
Kay's daddy


2011/9/28 hironori yamashita <yama.i...@gmail.com>
--
このメールは Google グループのグループ「kay-users-ja」の登録者に送られています。
このディスカッションをウェブ上で閲覧するには、https://groups.google.com/d/msg/kay-users-ja/-/LnffzMep_YEJ にアクセスしてください。

hironori yamashita

unread,
Sep 28, 2011, 9:51:07 AM9/28/11
to kay-us...@googlegroups.com
エラー画面の画像を添付します。

コードは以下になります。
テーブルクラス
*********************************
class pages(db.Model):
  title = db.StringProperty()
*********************************
プログラム
*********************************
gql =  'SELECT * FROM pages'
query = db.GqlQuery(gql)

for row in query:
  print row.title #全角のものをprintするとエラーが発生。半角英数字は正常に出力される。
*********************************



TypeError- 'int' object is not callable -- Werkzeug Debugger.png

Takashi Matsuo

unread,
Sep 28, 2011, 10:30:49 AM9/28/11
to kay-us...@googlegroups.com

return ClosingIterator(response(environ, start_response),

のところで、response が int なんじゃないでしょうか?

とりあえず、コードをもっと見せてもらうことはできますか?
せめてその view の関数全部を見せて下さい。

あと print を使うのはあまり良くないですね。logging モジュールとかを使いましょう。

import logging
logging.debug("row.title: %s" % row.title)

とか。

-- 
Takashi Matsuo
matsuo....@gmail.com
Kay's daddy


2011/9/28 hironori yamashita <yama.i...@gmail.com>
エラー画面の画像を添付します。

--
このメールは Google グループのグループ「kay-users-ja」の登録者に送られています。
このディスカッションをウェブ上で閲覧するには、https://groups.google.com/d/msg/kay-users-ja/-/7rNEXXOFUDQJ にアクセスしてください。

hironori yamashita

unread,
Sep 28, 2011, 11:19:50 AM9/28/11
to kay-us...@googlegroups.com
ためしに
print type(row.title)
をしてみたところ<type 'unicode'>が出力されました。
ストアにもstringで入ってるんですがなにかしらで数値型に変換されてしまってるんでしょうかね?

ソース作りかけなのでいろいろ抜けてますがこれになります。
cmsp_user.py
****************************
import _cmspModel as bas

#CMSP all accsess
def index(request, render_to_response, response):
    BAS = bas.cmspModel()
    response['html'] = BAS.createHtml()
    return render_to_response("rami/user/pc/default/lib/cmsp.html", response)
****************************

_cmspModel.py
****************************
class cmspModel(mal.ModelAll):
#HTML生成
    def createHtml(self):
        db = self.db
        if body: #preview
            pass
        else: #user
html = ''
if html == '':
gql =  'SELECT * FROM pages'
query = db.GqlQuery(gql)
for row in query:
print row.title #全角のものをprintするとエラーが発生。半角英数字は正常に出力される
****************************

デバッグ方法ありがとうございます!
今後気を付けます。

Takashi Matsuo

unread,
Sep 28, 2011, 6:40:48 PM9/28/11
to kay-us...@googlegroups.com

2011/9/29 hironori yamashita <yama.i...@gmail.com>
ためしに
print type(row.title)
をしてみたところ<type 'unicode'>が出力されました。
ストアにもstringで入ってるんですがなにかしらで数値型に変換されてしまってるんでしょうかね?


原因はそこじゃなさそうだと思いますよ。
ソースを全部見せていただくと、原因が分かりそうですね。
残念ながら今のところよくわかりません。

-- matsuo
 

--
このメールは Google グループのグループ「kay-users-ja」の登録者に送られています。
このディスカッションをウェブ上で閲覧するには、https://groups.google.com/d/msg/kay-users-ja/-/8IaX2NUgAA8J にアクセスしてください。

Toshiharu Moriyama

unread,
Sep 29, 2011, 2:17:06 AM9/29/11
to kay-us...@googlegroups.com


2011年9月29日木曜日0時19分50秒 UTC+9 hironori yamashita:
ためしに
print type(row.title)
をしてみたところ<type 'unicode'>が出力されました。
ストアにもstringで入ってるんですがなにかしらで数値型に変換されてしまってるんでしょうかね?
 
String は 英語(アルファベット)です。日本語は文字列では無い。と考えるといいとおもいます。
http://code.google.com/intl/ja/appengine/docs/python/datastore/typesandpropertyclasses.html#str

あと print はよろしくないという話ですが、 C 言語やっているひとからすると print って標準出力 stdout にだします。
出力先がモニターという考えでは無く、たとえば標準出力をキーボードにすれば、キーボードに出力します。
コンソールから実行すれば、stdout が画面になりますが、それ以外だと画面では無い。と思って下さい。

ここでいう画面というのはブラウザになるので、そこに出力させます。
ブラウザに表示させる方法はわかりますよね?

以上です。

Toshiharu Moriyama

unread,
Sep 29, 2011, 3:19:25 AM9/29/11
to kay-us...@googlegroups.com
index って view じゃないのか…。

view にする関数は必ず最後に render (レンダリング関数)を呼ぶ。で、戻り値を retruen する。

レンダリングに使うテンプレートは全て同じだから、そういう発想になったかとおもいますが、
view 関数だけ眺めても、この view はレンダリングにどのテンプレート使っているの?ってなります。
おまけに urls.py をみないと、どの関数が view なのかわからないという…。

def index(request):
    response['html'] = get_html()
    return render_to_response("rami/user/pc/default/lib/cmsp.html", response)

def get_html(self)
    BAS = bas.cmspModel()
    result = BAS.createHtml()
    return result

こんな感じです。(注意:これ、コピペしても動かないです。)

テンプレートが長くて面倒なら変数にいれちゃえば?

TEMPLATE_DEFAULT = "rami/user/pc/default/lib/cmsp.html"

なぜ Modelに _ プレフィックスいれて bas にしているんですか?

from _cmspModel.py import cmspModel

で、そのまま cmspModel.createHtml() じゃだめなんでしょうか?

あと createHtml で得られる結果の中にHTMLタグは入っていますか?

HyperText Markup Language の略が html なので、ただの結果なら html という文字は無くした方がよろしいかと。


ちゃんとかけば、それだけで不具合箇所が減ったりします。(というか発生しない。)

hironori yamashita

unread,
Sep 30, 2011, 10:42:21 PM9/30/11
to kay-us...@googlegroups.com
MATUOさん
Moriyamaさん

お返事ありがとうございます。山下です。

あれから以下のようにすると正常に出るようになりました。
print row.title.encode('SJIS')
でもなぜutf-8ではなくSJISにしないとでないのかわかりません・・・。

urls.pyもふくめたソースは以下になります。
urls.py
****************************
# -*- coding: utf-8 -*-
from kay.routing import (ViewGroup, Rule)

view_groups = [ViewGroup(
    Rule('/<app_name>/<module_name>/<method_name>/', endpoint='index', view='rami.app_index.index'),
    Rule('/<app_name>/<module_name>/', endpoint='index', view='rami.app_index.index'),
    Rule('/<app_name>/', endpoint='index', view='rami.app_index.index'),
    Rule('/', endpoint='index', view='rami.app_index.index')
)]
****************************

app_index.py
****************************
# -*- coding: utf-8 -*-
from kay.utils import render_to_response
import mlib.appIndexExt as ai #端末情報取得などの関数群

def index(request, app_name=None, module_name=None, method_name=None):
    response = {}
    theme = 'default'
    app = app_name if app_name in ['system','admin','master'] else 'user'
    if app_name == 'apis':
        module = app_name if app_name else 'index'
        method = module_name if module_name else 'index'
    elif app == 'user':
        module = app_name if app_name else 'index'
        method = module_name if module_name else 'index'
    else:
        module = module_name if module_name else 'index'
        method = method_name if method_name else 'index'
    #情報追加処理
    hard = ai.addInfoDiverse() #端末情報格納
    lang = ai.addInfoLanguage() #言語情報格納
    response['method_id'] = method
    response['hard'] = hard
    response['lang'] = lang
    html_path = 'rami/'+app+'/'+hard+'/'+ theme +'/'+lang
    a = 'import rami.'+ module +'.'+ module+'_'+app +' as bas'
    b = 'response = bas.'+ method +'(request,render_to_response,html_path,response)'
    try :
        exec a #import実行
        exec b #method実行
    except:
        response = 0
    return response
****************************

cmsp_user.py
****************************
# -*- coding: utf-8 -*-
import _cmspModel as bas

#CMSP all accsess
def index(request, render_to_response, response):
    BAS = bas.cmspModel()
    response['html'] = BAS.createHtml()
    return render_to_response("rami/user/pc/default/lib/cmsp.html", response)
****************************

_cmspModel.py
****************************
# -*- coding: utf-8 -*-
class cmspModel(mal.ModelAll):
#HTML生成
def createHtml(self):
db = self.db

Toshiharu Moriyama

unread,
Oct 1, 2011, 8:29:21 PM10/1/11
to kay-us...@googlegroups.com
どうやって Model.put() しているのかわからないのと、テンプレートがないからわからないのですが、
ページが sjis だからかもしれませんね。
携帯電話のサイトでしょうか?
携帯電話のブラウザは sjis しか表示できないんでしたっけ?

sjis だと euc-jp にコンバートしてから、utf8 にコンバートだったかなぁ…。
過去に、 sjis だと手間がかかるので、euc-jp でページを作ってたことがあります。
Reply all
Reply to author
Forward
0 new messages