views:

142

answers:

3
import cgi

from google.appengine.api import users
from google.appengine.ext import webapp
from google.appengine.ext.webapp.util import run_wsgi_app
from google.appengine.ext import db

class Greeting(db.Model):
  author = db.UserProperty()
  content = db.StringProperty(multiline=True)
  date = db.DateTimeProperty(auto_now_add=True)

class MainPage(webapp.RequestHandler):
  def get(self):
    self.response.out.write('<html><body>')

    greetings = db.GqlQuery("SELECT * FROM Greeting ORDER BY date DESC LIMIT 10")

    for greeting in greetings:
      if greeting.author:
        self.response.out.write('<b>%s</b> wrote:' % greeting.author.nickname())
      else:
        self.response.out.write('An anonymous person wrote:')
      self.response.out.write('<blockquote>%s</blockquote>' %
                              cgi.escape(greeting.content))

    # Write the submission form and the footer of the page
    self.response.out.write("""
          <form action="/sign" method="post">
            <div><textarea name="content" rows="3" cols="60"></textarea></div>
            <div><input type="submit" value="Sign Guestbook"></div>
          </form>
        </body>
      </html>""")

class Guestbook(webapp.RequestHandler):
  def post(self):
    greeting = Greeting()

    if users.get_current_user():
      greeting.author = users.get_current_user()

    greeting.content = self.request.get('content')
    greeting.put()
    self.redirect('/')

application = webapp.WSGIApplication(
                                     [('/', MainPage),
                                      ('/sign', Guestbook)],
                                     debug=True)

def main():
  run_wsgi_app(application)

if __name__ == "__main__":
  main()

I am new to Python and a bit confused looking at this Google App Engine tutorial code. In the Greeting class, content = db.StringProperty(multiline=True), but in the Guestbook class, "content" in the greeting object is then set to greeting.content = self.request.get('content').

I don't understand how the "content" variable is being set in the Greeting class as well as the Guestbook class, yet seemingly hold the value and properties of both statements.

+2  A: 

The first piece of code is a model definition:

class Greeting(db.Model):
    content = db.StringProperty(multiline=True)

It says that there is a model Greeting that has a StringProperty with the name content.

In the second piece of code, you create an instance of the Greeting model and assign a value to its content property

greeting = Greeting()
greeting.content = self.request.get('content')

edit: to answer your question in the comment: this is basic object oriented programming (or OOP) with a little bit of Python's special sauce (descriptors and metaclasses). If you're new to OOP, read this article to get a little bit more familiar with the concept (this is a complex subject, there are whole libraries on OOP, so don't except to understand everything after reading one article). You don't really have to know descriptors or metaclasses, but it can come in handy sometimes. Here's a good introduction to descriptors.

piquadrat
Thanks Piquadrat for taking a little time to answer my question.
conical
So the variable "content" isn't just a variable but actually names a StringProperty "content"? Is this some strange thing python can do that I am not getting.
conical
Yes Descriptors!!! The link provided about them was perfect, it all makes much more sense now. What a cool concept, you don't see something like that in Java.
conical
A: 

piquadrat's answer is good. You can read more about App Engine models here.

mikej
Thanks for link
conical
+2  A: 
class Greeting(db.Model):
  author = db.UserProperty()
  content = db.StringProperty(multiline=True)
  date = db.DateTimeProperty(auto_now_add=True)

This code instructs the ORM (object relational mapper) to create a table in the database with the fields "author", "content" and "date". Notice how class Greeting is inherited from db.Model: It's a model for a table to be created in the database.

class Guestbook(webapp.RequestHandler):
  def post(self):
    greeting = Greeting()

    if users.get_current_user():
      greeting.author = users.get_current_user()

    greeting.content = self.request.get('content')
    greeting.put()
    self.redirect('/')

Guestbook is a request handler (notice which class it's inherited from). The post() method of a request handler is called on the event of a POST request. There can be several other methods in this class as well to handle different kinds of requests. Now notice what the post method does: It instantiates the Greeting class- we now have an instance, greeting object. Next, the "author" and "content" of the greeting object are set from the request information. Finally, greeting.put() writes to the database. Additionally, note that "date" is also set automatically to the date/time of writing the object to the database.

Ramkumar Ramachandra