Gae Meets Django
Upcoming SlideShare
Loading in...5
×
 

Gae Meets Django

on

  • 4,177 views

 

Statistics

Views

Total Views
4,177
Views on SlideShare
4,159
Embed Views
18

Actions

Likes
2
Downloads
30
Comments
1

1 Embed 18

http://www.slideshare.net 18

Accessibility

Categories

Upload Details

Uploaded via as Adobe PDF

Usage Rights

© All Rights Reserved

Report content

Flagged as inappropriate Flag as inappropriate
Flag as inappropriate

Select your reason for flagging this presentation as inappropriate.

Cancel
  • Full Name Full Name Comment goes here.
    Are you sure you want to
    Your message goes here
    Processing…
  • 《 使用Django创建Google App Engine应用》
    Are you sure you want to
    Your message goes here
    Processing…
Post Comment
Edit your comment

Gae Meets Django Gae Meets Django Presentation Transcript

  • Django Google App Engine linsheng.cn@gmail.com
  • • Google App Engine • Django •
  • Google App Engine
  • Google App Engine • Google Web Hosting • Web Google • Scaling load balancing • • Google User Gmail
  • • Python 2.5.2 • Django 0.96.1 CGI CGI WSGI • Sandbox socket cron job • response • Python C
  • Datastore • Google BigTable • ORM • Model • • join, sum, avg • 1000 •
  • App Engine Service • Google • Gmail email • URL Fetch • Memcached • Image (PIL)
  • ( ) Fixed Quota Per Day Usage Quotas 500 PV/
  • • $0.10 - $0.12 per CPU core-hour • $0.15 - $0.18 per GB-month of storage • $0.11 - $0.13 per GB outgoing bandwidth • $0.09 - $0.11 per GB incoming bandwidth
  • Google App Engine • http://appengine.google.com/ • Gmail • • : http://yourapp.appspot.com • Google Apps
  • • Web • idea, startup • scalability • App Gallery http://appgallery.appspot.com/
  • • • • • • /
  • Django
  • Django • Python full-stack Web • ORM, URL mapping, admin interface, template, middleware, i18n, cache... •
  • Django webapp • Google App Engine Helper for Django • •
  • Blog OnlyPython
  • • Google App Engine SDK http://code.google.com/appengine/downloads.html • SVN Django http://code.djangoproject.com/svn/django/trunk/ • Google App Engine Helper for Django http://code.google.com/p/google-app-engine-django/
  • --- appengine-django (app engine helper for django ) --- django (django ) --- onlypy ( ) --- static ( js, css, ) --- app.yaml (app engine ) --- index.yaml (app engine ) --- main.py (app engine ) --- manage.py (Django ) --- settings.py ( ) --- urls.py (URL mapping)
  • app.yaml application:  onlypython version:  1 runtime:  python api_version:  1 handlers: -­‐  url:  /static static_dir:  static -­‐  url:  /.*    script:  main.py
  • main.py import  os import  sys import  logging from  appengine_django  import  InstallAppengineHelperForDjango InstallAppengineHelperForDjango() #  Google  App  Engine  imports. from  google.appengine.ext.webapp  import  util #  Import  the  part  of  Django  that  we  use  here. import  django.core.handlers.wsgi 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()
  • settings.py TIME_ZONE  =  'UTC' MIDDLEWARE_CLASSES  =  (        'django.middleware.common.CommonMiddleware',        'appengine_django.auth.middleware.AuthenticationMiddleware', ) ROOT_URLCONF  =  'urls' ROOT_PATH  =  os.path.dirname(__file__) TEMPLATE_DIRS  =  (        os.path.join(ROOT_PATH,  'onlypy/templates') ) INSTALLED_APPS  =  (          'appengine_django',          'django.contrib.auth',          'onlypy.blog',      )
  • TODO: Blog
  • models.py from  google.appengine.ext  import  db   class  Category(db.Model):        name  =  db.StringProperty()                def  __str__(self):                return  self.name class  Post(db.Model):        author  =  db.UserProperty()        title  =  db.StringProperty(required=True,  verbose_name=u' ')        tag  =  db.StringProperty(verbose_name=u' ')        content  =  db.TextProperty(required=True,  verbose_name=u' ')        create_time  =  db.DateTimeProperty(auto_now_add=True)        update_time  =  db.DateTimeProperty(auto_now=True)        category  =  db.ReferenceProperty(Category,  required=True,  verbose_name=u' ')        is_published  =  db.BooleanProperty(verbose_name=u' ')                def  get_absolute_url(self)  :                return  '/post/%s/'%self.key().id()
  • forms.py from  google.appengine.ext.db  import  djangoforms  as  forms from  models  import  Post class  PostForm(forms.ModelForm):        class  Meta:                model  =  Post                exclude  =  ['author']
  • views.py def  add_post(request):        if  request.method  ==  'GET':                form  =  PostForm()                if  request.method  ==  'POST':                form  =  PostForm(request.POST)                if  form.is_valid():                        post  =  form.save()                        post.author  =  users.get_current_user()                        post.put()                        return  HttpResponseRedirect('/post/add/')        return  render_to_response('blog/add_post.html',                              {'form':  form},                              context_instance=RequestContext(request))    
  • add_post.html {%  extends  "base.html"  %} {%  block  content  %} <h1> </h1> <form  name="mainForm"  method="post"  action="">        {{form.as_p}}        <input  type="submit"  value=" "/> </form> {%  endblock  %}
  • urls.py from  django.conf.urls.defaults  import  * urlpatterns  =  patterns('onlypy.blog.views',        (r'^post/add/$',  'add_post'), )
  • Run • cd /yourpath/onlypython/ • python ./manage.py runserver 127.0.0.1:8000
  • http://localhost:8000/post/add/
  • TODO: Blog
  • views.py def  list_post(request):        posts  =  Post.all().order('-­‐create_time')        if  (not  is_admin()):                posts  =  posts.filter("is_published",  True)                return  object_list(request,  queryset=posts,  allow_empty=True,                                template_name='blog/list_post.html',                                  extra_context={'is_admin':  is_admin()},                                paginate_by=20)    
  • index.yaml indexes:        -­‐  kind:  Post            properties:            -­‐  name:  is_published            -­‐  name:  create_time                direction:  desc
  • list_post.html {%  extends  "base.html"  %} {%  load  markup  %} {%  load  paginator  %} {%  block  content  %} {%  for  post  in  object_list  %}   <table  border="0"  cellspacing="0"  cellpadding="0"  width="100%">        <tr>                <td  valign="top">                        <h1  style="margin-­‐bottom:  2px;">                                <a  href="/post/{{post.key.id}}">                                        [{{  post.category.name  }}]  {{  post.title  }}{%  if  post.is_published  %} {%else%}( ){%endif%}                                </a>                        </h1>                        <p  style="padding:0px;  margin:  0px;"  class="small_font">                                 :  <a  href="/category/{{  post.category.key.id  }}/"> {{  post.category.name  }}</a>  <span  style="padding-­‐left:  10px;">{{  post.author.nickname  }} {{  post.create_time|date:"Y-­‐M-­‐d  H:i"  }}</span>                        </p>                </td>        </tr> </table> <div  style="padding-­‐left:  30px;">        {{  post.content|markdown  }} </div> {%  endfor  %} {%  paginator  %} {%  endblock  %}
  • urls.py from  django.conf.urls.defaults  import  * urlpatterns  =  patterns('onlypy.blog.views',        (r'^post/add/$',  'add_post'),        (r'^$',  'list_post'), )
  • http://localhost:8000/
  • • http://code.google.com/p/onlypy/ • http://www.onlypython.com
  • Q&A