Python – going on with this code from the Google App Engine tutorial

google-app-enginepython

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.

Best Answer

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.

Related Topic