ラベル GAE/P の投稿を表示しています。 すべての投稿を表示
ラベル GAE/P の投稿を表示しています。 すべての投稿を表示

GoogleAppEngine でパスワードが合っているのに違うと言われる

久々に

appcfg.py download_app -A -V

コマンドで、プロジェクトのソースを引っ張ってこようと思った時のこと。

絶対合っているのにユーザーIDかパスが違うといって蹴られる。

3回間違えるとリトライさせてもらえなくなるが、その際システムクロックも違うと言われて完全迷子。

結局、ブラウザでそのアカウントにログイン>二重認証を有効にする設定を行う(要携帯メールアドレス)

その後、設定>セキュリティ>アプリパスワード で「その他」「GoogleAppEngine」のように選択&入力しパスを作成

そのパスで再度コマンドからログインすると解決した。

GoogleAppEngineのアップロード済みプロジェクトを一式ダウンロードする

appcfg.py download_app -A <your_app_id> -V <your_app_version> <output-dir>

とコマンドを叩けば、任意のバージョンのプロジェクトをダウンロード可能。

その他、appcfg のコマンドについては、以下を参照。

https://developers.google.com/appengine/docs/python/tools/uploadinganapp

追記:

ある日突然、パスワードが違うと言われるようになった。(ブラウザではログインできる)

こちらの記事で解決方法を書きました

GoogleAppEngine 1.7.5

遅ればせながら、GAE/P の最近のバージョンを見てみました。

db.Model → ndb.Model とする事で、

memcache やコンテキストが付いた新しいdbモジュールが使える模様。

ただし、key_name が廃止されて id に統一されていたり、

ListProperty が廃止されて厳密になっていたりするので、

作り変えの場合は注意が必要。

# --- String ---

# db
str = db.StringListProperty()

# ndb
str = db.StringProperty( repeated=True )

# --- float ---

# db
floatList = db.ListProperty()

# ndb
floatList = db.FloatProperty( repeated=True )


Eclipse ( Mac ) + GoogleAppEngine + Python のブレークポイントで止まらない

Mac( MountainLion ) + GoogleAppEngine 1.7.5 + Pydev + Eclipse4.2 ( + Pleiades ) で

ブレイクポイントが止まらなくなった。

まだ、直らずあれこれ試行錯誤中ですが、他にもお困りの方が同じ手間を踏まないように

ダメだった事をメモ。

検索してみると、JDK が 1.6.0_41 だと不具合がある模様と思ったが

JDK を 1.6.0_29 にして設定& clean をするもダメ。

eclipse/dropin/下を

pydevd_constants.py

で検索をかけて開く。その中の

DEBUG_TRACE_LEVEL = -1
DEBUG_TRACE_BREAKPOINTS = -1

を両方 3 にして保存、同名の pyc を削除し、 clean してもダメ。

ちなみに PHP + Eclipse でブレークポイントが効かない場合は こちら

GAE/P の通信でuser-agentを設定する

urlfetchの場合は、

urlfetch.fetch( your_url, headers={'User-Agent': your_ua })

とする。

urllib2の場合は、

o = urllib2.build_opener()
o.addheaders = [('User-agent', your_ua)]
o.open(your_url)

とする。

Google app engine / python で lxml

1.7.0の更新履歴に lxmlのunicodeサポートみたいな事が書いてあった。

つまり、lxmlが使えるようになったらしい。早速使ってみようと思ったらちょっと詰まったのでメモ。

自前でHTMLパーサを作らない場合、BeautifulSoup3くらいしか手軽に導入できるライブラリがない上に

ベンチマークしているサイトの情報によれば、lxmlの方が結構な差が出るくらい早いようなので

これからGAE/PでHTMLやXML解析をしたい人はlxmlを選んだほうがいいかも?


さて、導入方法は、まずPython2.7にする必要があるのと、

app.yamlに以下を追加

libraries:
- name: lxml
version: latest


もし、Python2.7にしたばかりで、app.yamlの設定がまだなら

application: your-app-name
version: 1
runtime: python27
api_version: 1
threadsafe: true

- url: /(.*)
script: main.app

みたいな感じの設定を追加。

この2.7用の設定については別記事参照。

開発環境では、これだけではダメで(本番環境ではまだ試していない)

別途、lxmlをインストールする必要がある。

コマンドでインストールもできるみたいだけど、

面倒くさがりな私は

ちょい古いバージョンでリリースされているインストーラを使って導入した。

インストーラが用意された中で一番最新のバージョンは、

この記事を書いた時点では2.3のものみたい。

http://pypi.python.org/pypi/lxml/2.3

今回WindowsでGAEのPythonも2.7用の設定なので、

下の方にある「lxml-2.3.win32-py2.7.exe (md5)」をDLしてインストールした。

あとは使い方が書いてあるサイトなり、マニュアルなりに書かれた通り

importして使うだけ。

EclipseでGAE/P実行をする為の設定メモ

WindowsでEclipseの場合。Macならパス等各種合わせる事。

「デバッグの構成」>「PyDev Google App Run」

メインタブ
--------------------------
「プロジェクト」にデバッグするプロジェクト

「メイン・モジュール」に「SDKのパス\dev_appserver.py」
--------------------------

引数タブ
--------------------------
「プログラムの引数」に
(前略)\workspace\YourApp --address=192.168.123.45 --port=8080 --datastore_path=C:\datastore --use_sqlite
※最初のパス部分は相対パス指定でもいいけど何かをキッカケに
 エラーを吐いて動かなくなる事が多々あったので絶対パスをおすすめする

IPやポートは参考の為の適当な値なので、各々好きなように
--------------------------

パラメータ各種が何をしているかについては以下を参照
ttps://developers.google.com/appengine/docs/python/tools/devserver?hl=ja

EclipseでGAE/Pのmemcacheがエラー扱いになる

「設定>インタープリタ-Python>強制ビルトイン」に

google.appengine.api.memcache

を追加したら直った

エンティティのインデクスを作らない時

test = db.IntegerProperty( indexed=False )

のように「indexed=False」を付与する

エンティティを継承するには

「db.Model」ではなく「polymodel.PolyModel」で親モデルを定義する

key_nameに全角文字

キー名は数値じゃないときは文字列型って事なので、

全角で指定とかできるのかしらと試したら、

hoge = YourEntity( key_name=u'hoge_ほげほげ' )

みたいにしても動くみたい。

まだデプロイしてないからなんとも言えないけど、開発サーバだけって可能性は否めない。

使い道あるのかな…。

まとめてput

entity1.put()
entity2.put()
entity3.put()

という処理は、

list = [entity1,entity2,entity3]
db.put(list)

とすれば、トランザクションでputしてくれるみたい。

1ファイルにあまり定義しない方がよい?

ダラダラとhelloworld.pyの1ファイルに、

リクエストハンドラのクラスや諸コードをやたらと長く書いてたのを、

ちゃんとファイル名も変えて整理して、細かくファイル分けしたら

レスポンスまでの体感速度が若干上がったようなのでメモ。

GAEのPython2.7用YAMLメモ

application: yourappname
version: 1
runtime: python27
api_version: 1
threadsafe: true

handlers:
- url:  /

  script: main.app


# django
#----------------------------------------------------------------
libraries:
- name: django
  version: 1.2


########################
# YAMLは以上、以下補足 #
########################


上記ハンドラは○○.appspot.com/ にアクセスが来た時main.pyで処理する設定例

main.py には以下を定義

app = webapp.WSGIApplication([('/', TopPage)], debug=True)
def main():
run_wsgi_app(app)

if __name__ == "__main__":
main()



"app"という変数にハンドラ情報入れてるので

script: 部分のファイル名は「処理したいPythonファイル名」.「ハンドラ入れた変数名」と書く

yamlのscript: にパッケージに入れてある階層内のpyを書く時

script: foo/bar/hoge.app

のようにスラッシュ区切りはダメ。

script: foo.bar.hoge.app

パッケージ指定の時と同じくここもピリオド区切り。

開発サーバかの区別

def is_local():
return os.environ.get('SERVER_SOFTWARE', '').startswith('Development')

という関数作ってどっかに入れとく。

いつまで使えるかは怪しい…。

日付プロパティを数値プロパティで代替する場合を考える

時系列系のプロパティ(DateTimeProperty、DateProperty、TimeProperty)を使わずに

他の方法で日付プロパティを表現するにはと考えた結果、

def getCurrentDate():
t = datetime.datetime.today()
if is_local() is False:
t += datetime.timedelta(hours=9)
return long(t.strftime("%Y%m%d"))

def getCurrentTime():
t = datetime.datetime.today()
if is_local()is False:
t += datetime.timedelta(hours=9)
return long(t.strftime("%Y%m%d%H%M"))

def getCurrentTimeSec():
t = datetime.datetime.today()
if is_local() is False:
t += datetime.timedelta(hours=9)
return long(t.strftime("%Y%m%d%H%M%S"))

みたいな数値をIntegerPropertyで持つくらいしか思い浮かばず。

(時間を足している所は、開発サーバじゃない時に日本時間に直す…つもりで書いたもの)

素直にdate系使ってても特に問題はないので、意味のない妄想であった。