Google Developer Day2008
Google Developer Day2008
今日はGoolge developer day2008に行きました。
午後からはGoogle app engineのHackathonに参加。
Image APIが登場してから、しばらくたちますが、サンプルのものはDjangoを使ったものではないので Djangoだけをつかってやってみたかったのですが、変なところでハマりまくって時間内に動くものができませんでした。 だめだなぁ。
途中からはOS-X10.5にPIL (Python Image Library)をインストールするのに四苦八苦。OS-XはIPythonとかPILとか入った状態で出荷してほしいな。
家に帰ってとりあえず作ったのが以下
非常に単純なのでアレですが、一応公開してみます。
/app.yaml
application: ueblog33
version: 1
runtime: python
api_version: 1
handlers:
- url: /photo/.*
script: main.py
/index.yaml
自動生成
/django
開発版のdjangoをそのまま
/main.py
import os
import sys
# Google App Engine imports.
from google.appengine.ext.webapp import util
# Remove the standard version of Django.
for k in [k for k in sys.modules if k.startswith('django')]:
del sys.modules[k]
# Force sys.path to have our own directory first, in case we want to import
# from it.
sys.path.insert(0, os.path.abspath(os.path.dirname(__file__)))
# Must set this env var *before* importing any part of Django
os.environ['DJANGO_SETTINGS_MODULE'] = 'photoapp.settings'
# Import the part of Django we need.
import django.core.handlers.wsgi
import django.core.signals
import django.db
import django.dispatch.dispatcher
# Unregister the rollback event handler
django.dispatch.dispatcher.disconnect(
django.db._rollback_on_exception,
django.core.signals.got_request_exception)
# Log errors
#django.dispatch.dispatcher.connect(
# log_exception,
# django.core.signals.got_request_exception)
def main():
# Create a Django application for WSGI.
application = django.core.handlers.wsgi.WSGIHandler()
# Run the WSGI CGI handler with that application
util.run_wsgi_app(application)
if __name__ == '__main__':
main()
誰か公開していたものをそのまま流用
/photoapp
(python ./django/bin/django-admin.py startproject photoappで作成)
/photoapp/__ini__.py
自動生成
/photoapp/manage.py
自動生成
/photoapp/settings.py
DEBUG = True
TEMPLATE_DEBUG = DEBUG
ADMINS = (
# ('Your Name', 'your_email@domain.com'),
)
MANAGERS = ADMINS
TIME_ZONE = 'Tokyo/Asia'
LANGUAGE_CODE = 'ja'
SITE_ID = 1
USE_I18N = True
MEDIA_ROOT = ''
MEDIA_URL = ''
ADMIN_MEDIA_PREFIX = '/media/'
SECRET_KEY = '' #自分のを使う
TEMPLATE_LOADERS = (
'django.template.loaders.filesystem.load_template_source',
'django.template.loaders.app_directories.load_template_source',
# 'django.template.loaders.eggs.load_template_source',
)
MIDDLEWARE_CLASSES = (
'django.middleware.common.CommonMiddleware',
'django.contrib.sessions.middleware.SessionMiddleware',
#'django.contrib.auth.middleware.AuthenticationMiddleware',
'django.middleware.doc.XViewMiddleware',
)
ROOT_URLCONF = 'photoapp.urls'
import os
ROOT_PATH = os.path.dirname(os.path.abspath(__file__))
TEMPLATE_DIRS = (
os.path.join(ROOT_PATH, 'templates'),
)
INSTALLED_APPS = (
#'django.contrib.auth',
'django.contrib.contenttypes',
#'django.contrib.sessions',
'django.contrib.sites',
'photoapp.photo'
)
TEMPLATE_CONTEXT_PROCESSORS = (
#'django.core.context_processors.auth',
'django.core.context_processors.debug',
'django.core.context_processors.i18n',
#'django.core.context_processors.media',
'django.core.context_processors.request',
)
(自動生成を修正)
/phtoapp/urls.py
from django.conf.urls.defaults import *
urlpatterns = patterns('',
(r'^photo/', include('photoapp.photo.urls')),
)
/photoapp/photo
( cd photoapps
python manage.py startapp photo
)
で生成
/photoapp/photo/__init__.py
(自動生成)
/photoapp/photo/urls.py
from django.conf.urls.defaults import *
urlpatterns = patterns('',
(r'^$', 'photoapp.photo.views.index'),
(r'^upload/$', 'photoapp.photo.views.upload'),
(r'^image/(?P<img_id>\w+)/$', 'photoapp.photo.views.image' ),
)
/photoapp/photo/models.py
from google.appengine.ext import db
class Photo(db.Model):
photo = db.BlobProperty()
title = db.StringProperty(required=True)
/photoapp/photo/views.py
from django.http import HttpResponse
from django.shortcuts import render_to_response
from django import newforms as forms
from photoapp.photo.models import Photo
from google.appengine.ext import db
from google.appengine.api import images
class UploadForm(forms.Form):
title = forms.CharField(max_length=100, min_length=1)
photo = forms.FileField(required=True)
def index(request):
queryset = Photo.all()
return render_to_response(
'upload.html', dict(object_list=queryset)
)
def upload(request):
if request.method == "POST":
form = UploadForm(request.POST, request.FILES) #FileField使った場合はrequest.FILESを忘れずに
if form.is_valid():
photo = Photo(
title=request.POST["title"],
)
photo_object = form.cleaned_data["photo"]
content = images.resize(photo_object.content, 200, 200) #image apiを使ってリサイズ
photo.photo = db.Blob(content) #binaryデータはdb.Blobを使う
photo.put()
form = UploadForm()
else:
form = UploadForm()
queryset = Photo.all()
return render_to_response(
'upload.html', dict(
form=form,
object_list=queryset)
)
def image(request, img_id): #Photoインスタンスのkeyを元に画像を表示
photo = Photo.get(img_id)
if photo:
return HttpResponse(photo.photo, content_type="image/jpg")
else:
return HttpResponse("NO IMAGE") #本当はNO IMAGEのイメージを出す
/photoapp/photo/templates/upload.html
<html>
<body>
{% if form %}
<form action="." enctype="multipart/form-data" method="POST"><!-- enctype 忘れないように -->
{{ form }}
<input type="submit">
</form>
{% endif %}
{% for object in object_list %}
<div>{{ object.title }}</div>
<div><img src='/photo/image/{{ object.key }}/'></img></div>
{% endfor %}
</body>
</html>
一応newformsを使ってます。
本来なら画像のファイル形式をみたり、いろいろな画像サイズを作ったりする必要があります。
前半プレゼンだったのですが、思いっきり英語でした。英語できないだめだな〜〜。
WSGIはダブルセスジアイと言ってました ウィスキーって言ってたおれ涙目
あまりにつまらないところでハマったので、知り合い以外と絡むこともなく、
せっかくGoogleの人がいっぱいいたのに何も質問できず、、、、、。
事前準備は重要ですね。
貴重な一日を無駄にしてしまった。。。。
しかし、日本に来てまだ1年半なのに、「この人英語しゃべれるのかな?」と疑問に思うほど日本語が上手な
Ian Lewisさん
http://www.ianlewis.org/index.php/jp/ (日本語)
とも知りあえたし、楽しかったです。
帰りはIanさんと、大谷さんやDjango-jaの人たちと食事して帰りました。
hackasonでもらったTシャツ
Comments
メールありがとう! そして皆さんと夕食を一緒に食べるのを許してくれてどうもありがとう。皆、火曜日に僕のことを始めて知り合ったのに迎えてくれて感動した。
> らきさん
PythonとGoogle Apps Engineは、まだ情報が少なくてハマることも多いですが、
はじめてやるプログラムに向いている気がします。
バリバリの職業プログラマーにならなくても、ちょっとだけプログラムできるだけで面白いことも多いので、よかったらチャレンジしてみてください!
> Ianさん
こちらこそ貴重な話をしてくれてありがとうございました!
楽しかったです!!
Ianさんはやってることも面白いので、勉強会などがあったら是非発表お願いします!
今後ともよろしくお願いします!



codingできる人はいいですね.
うらやましい