6
6

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

即売会サービスを作ろう4(in Python mini Hack-a-thon)

Posted at

サークル関係のapiは出来たので、次はアイテム関係のapiを作ります。
今回は (第42回)Python mini Hack-a-thon に参加して作業してました。
http://connpass.com/event/5775/

additem.jpg

こんなUIから登録できるようにします。

##新しく覚えたこと

Entityの設計 について

やることは前回とほとんど一緒ですが、今回は登録されるサムネイルが1枚〜4枚と変動しています

#サークルが販売しているアイテム情報。1エンティティ=1アイテム
class CircleItem(BaseModel):
    circleInfomation = ndb.KeyProperty(kind=CircleInfomation)   # 販売サークル
    name = ndb.StringProperty()     	# アイテム名
    thumbUrls1 = ndb.StringProperty() 	# アイテムサムネイルその1
    thumbUrls2 = ndb.StringProperty() 	# アイテムサムネイルその2
    thumbUrls3 = ndb.StringProperty() 	# アイテムサムネイルその3
    thumbUrls4 = ndb.StringProperty() 	# アイテムサムネイルその4
    description = ndb.StringProperty()	# アイテム説明
    count = ndb.IntegerProperty() # 販売個数
    price = ndb.IntegerProperty() # 販売金額

と、サムネイルごとにプロパティを入れてもいいのですが、サムネイルプロパティの目的はすべて一緒なので
一つのプロパティにまとめて入れてしまっても良さそうです。

#サークルが販売しているアイテム情報。1エンティティ=1アイテム
class CircleItem(BaseModel):
    circleInfomation = ndb.KeyProperty(kind=CircleInfomation)   # 販売サークル
    name = ndb.StringProperty()			# アイテム名
    thumbUrls = ndb.StringProperty(repeated=True) # アイテムサムネイルのURL(最大4つ)
    description = ndb.StringProperty()	# アイテム説明
    count = ndb.IntegerProperty() 		# 販売個数
    price = ndb.IntegerProperty() 		# 販売金額

こうしました。

クエリのカーソル処理 について

サーバ内にある複数回のリクエストにわけて表示させようとした場合、カーソル処理を行います。
AppEngineSDK には便利な関数が用意されているので、そちらを土台に続きがあればURLを添付するようにしてます。
URL生成には webapp2#uri_for が便利でした。


# DataStoreへクエリ実行
entitylist, next_curs, more = CircleItem.query(CircleItem.circleInfomation==circleInfo.key).fetch_page(limit, start_cursor=cursor)

# 続きがあるなら次のURLを生成
next_url = None
if more:
	next_url = webapp2.uri_for('Infomation',circleid=circleid,limit=limit,cursor=next_curs.urlsafe())

# 今回のデータを設定
itemList = []
for e in entitylist:
	item = Common.createCircleItemResponseFromEntity(e)
	itemList.append(item)

res = dict(
	itemList = itemList,
	next = next_url
)

# JSON化してクライアントへ返す
Common.writeUserResponseSuccess(self, res )

たとえば
http://localhost:8080/user/api/circleitem/infomation?circleid=1
こんなリクエストを投げた場合、

{
	"response":
	{
		"status":200
	},
	"next":"http://localhost:8080/user/api/circleitem/infomation?circleid=1&limit=1&cursor=E-ABAIICLWoSZGV2fmZyZWVtYXJrZXQtYXBwchcLEgpDaXJjbGVJdGVtGICAgICA4JcJDBQ=",
	"itemList":
		[
			{
				"price":1000,
				"thumbUrls":[
					"http://localhost:8080/user/api/circleitem/thumbnail?circleitemid=5171003185430528&no=0"
				],
				"count":12,
				"name":"アイテム名",
				"description":"アイテム詳細"}
		]
}

このようなリクエストが返ってきて、"next":"http://localhost:8080/user/api/circleitem/infomation?circleid=1&limit=1&cursor=E-ABAIICLWoSZGV2fmZyZWVtYXJrZXQtYXBwchcLEgpDaXJjbGVJdGVtGICAgICA4JcJDBQ="この部分を再度サーバに投げることで順番に取得できます。

そんな感じで今日までのブランチができました
https://github.com/nagai/freemarket/tree/20140412

##今後の課題

  • UIの色を変更したい

  • 配送方法が不明

  • エラー処理を決めたい
    クライアントのリクエストが不正だった場合にどうするかをきめたほうがきめる
    ・アプリ再起動
    ・同じリクエストを再度行う
    あたりがいいかな?

  • テストをしたい
    今は chrome extentionのAdvanced REST client を利用してぽちぽち試しているのですが
    そろそろ手間が増えてきたのでなにか別の方法を導入したいです。

##次回
次はクライアント側を作ります。

6
6
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
6
6

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?