<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="et">
	<id>http://www.lambda.ee/w/index.php?action=history&amp;feed=atom&amp;title=Appengine_katse%3A_autent_ja_andmebaas</id>
	<title>Appengine katse: autent ja andmebaas - Redigeerimiste ajalugu</title>
	<link rel="self" type="application/atom+xml" href="http://www.lambda.ee/w/index.php?action=history&amp;feed=atom&amp;title=Appengine_katse%3A_autent_ja_andmebaas"/>
	<link rel="alternate" type="text/html" href="http://www.lambda.ee/w/index.php?title=Appengine_katse:_autent_ja_andmebaas&amp;action=history"/>
	<updated>2026-10-28T23:35:10Z</updated>
	<subtitle>Selle lehekülje redigeerimiste ajalugu</subtitle>
	<generator>MediaWiki 1.43.11</generator>
	<entry>
		<id>http://www.lambda.ee/w/index.php?title=Appengine_katse:_autent_ja_andmebaas&amp;diff=8575&amp;oldid=prev</id>
		<title>Tammet – 28. september 2011, kell 08:48</title>
		<link rel="alternate" type="text/html" href="http://www.lambda.ee/w/index.php?title=Appengine_katse:_autent_ja_andmebaas&amp;diff=8575&amp;oldid=prev"/>
		<updated>2011-09-28T08:48:54Z</updated>

		<summary type="html">&lt;p&gt;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;Uus lehekülg&lt;/b&gt;&lt;/p&gt;&lt;div&gt;&amp;lt;pre&amp;gt;&lt;br /&gt;
import cgi&lt;br /&gt;
import datetime&lt;br /&gt;
import urllib&lt;br /&gt;
import wsgiref.handlers&lt;br /&gt;
&lt;br /&gt;
from google.appengine.ext import db&lt;br /&gt;
from google.appengine.api import users&lt;br /&gt;
from google.appengine.ext import webapp&lt;br /&gt;
from google.appengine.ext.webapp.util import run_wsgi_app&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
class Greeting(db.Model):&lt;br /&gt;
  &amp;quot;&amp;quot;&amp;quot;Models an individual Guestbook entry with an author, content, and date.&amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
  author = db.UserProperty()&lt;br /&gt;
  content = db.StringProperty(multiline=True)&lt;br /&gt;
  date = db.DateTimeProperty(auto_now_add=True)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
def guestbook_key(guestbook_name=None):&lt;br /&gt;
  &amp;quot;&amp;quot;&amp;quot;Constructs a datastore key for a Guestbook entity with guestbook_name.&amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
  return db.Key.from_path(&amp;#039;Guestbook&amp;#039;, guestbook_name or &amp;#039;default_guestbook&amp;#039;)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
class MainPage(webapp.RequestHandler):&lt;br /&gt;
  def get(self):&lt;br /&gt;
    user = users.get_current_user()&lt;br /&gt;
    if user:      &lt;br /&gt;
      self.response.out.write(&amp;#039;&amp;lt;html&amp;gt;&amp;lt;body&amp;gt;&amp;#039;)&lt;br /&gt;
      guestbook_name=self.request.get(&amp;#039;guestbook_name&amp;#039;)&lt;br /&gt;
&lt;br /&gt;
      # Ancestor Queries, as shown here, are strongly consistent with the High&lt;br /&gt;
      # Replication datastore. Queries that span entity groups are eventually&lt;br /&gt;
      # consistent. If we omitted the ancestor from this query there would be a&lt;br /&gt;
      # slight chance that Greeting that had just been written would not show up&lt;br /&gt;
      # in a query.&lt;br /&gt;
      greetings = db.GqlQuery(&amp;quot;SELECT * &amp;quot;&lt;br /&gt;
                              &amp;quot;FROM Greeting &amp;quot;&lt;br /&gt;
                              &amp;quot;WHERE ANCESTOR IS :1 &amp;quot;&lt;br /&gt;
                              &amp;quot;ORDER BY date DESC LIMIT 10&amp;quot;,&lt;br /&gt;
                              guestbook_key(guestbook_name))&lt;br /&gt;
&lt;br /&gt;
      for greeting in greetings:&lt;br /&gt;
        if greeting.author:&lt;br /&gt;
          self.response.out.write(&lt;br /&gt;
              &amp;#039;&amp;lt;b&amp;gt;%s&amp;lt;/b&amp;gt; wrote:&amp;#039; % greeting.author.nickname())&lt;br /&gt;
        else:&lt;br /&gt;
          self.response.out.write(&amp;#039;An anonymous person wrote:&amp;#039;)&lt;br /&gt;
        self.response.out.write(&amp;#039;&amp;lt;blockquote&amp;gt;%s&amp;lt;/blockquote&amp;gt;&amp;#039; %&lt;br /&gt;
                                cgi.escape(greeting.content))&lt;br /&gt;
&lt;br /&gt;
      self.response.out.write(&amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
            &amp;lt;form action=&amp;quot;/sign?%s&amp;quot; method=&amp;quot;post&amp;quot;&amp;gt;&lt;br /&gt;
              &amp;lt;div&amp;gt;&amp;lt;textarea name=&amp;quot;content&amp;quot; rows=&amp;quot;3&amp;quot; cols=&amp;quot;60&amp;quot;&amp;gt;&amp;lt;/textarea&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
              &amp;lt;div&amp;gt;&amp;lt;input type=&amp;quot;submit&amp;quot; value=&amp;quot;Sign Guestbook&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
            &amp;lt;/form&amp;gt;&lt;br /&gt;
            &amp;lt;hr&amp;gt;&lt;br /&gt;
            &amp;lt;form&amp;gt;Guestbook name: &amp;lt;input value=&amp;quot;%s&amp;quot; name=&amp;quot;guestbook_name&amp;quot;&amp;gt;&lt;br /&gt;
            &amp;lt;input type=&amp;quot;submit&amp;quot; value=&amp;quot;switch&amp;quot;&amp;gt;&amp;lt;/form&amp;gt;&lt;br /&gt;
          &amp;lt;/body&amp;gt;&lt;br /&gt;
        &amp;lt;/html&amp;gt;&amp;quot;&amp;quot;&amp;quot; % (urllib.urlencode({&amp;#039;guestbook_name&amp;#039;: guestbook_name}),&lt;br /&gt;
                            cgi.escape(guestbook_name)))&lt;br /&gt;
    else:&lt;br /&gt;
      self.redirect(users.create_login_url(self.request.uri)) &lt;br /&gt;
    &lt;br /&gt;
    &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
class Guestbook(webapp.RequestHandler):&lt;br /&gt;
  def post(self):&lt;br /&gt;
    # We set the same parent key on the &amp;#039;Greeting&amp;#039; to ensure each greeting is in&lt;br /&gt;
    # the same entity group. Queries across the single entity group will be&lt;br /&gt;
    # consistent. However, the write rate to a single entity group should&lt;br /&gt;
    # be limited to ~1/second.&lt;br /&gt;
    guestbook_name = self.request.get(&amp;#039;guestbook_name&amp;#039;)&lt;br /&gt;
    greeting = Greeting(parent=guestbook_key(guestbook_name))&lt;br /&gt;
&lt;br /&gt;
    if users.get_current_user():&lt;br /&gt;
      greeting.author = users.get_current_user()&lt;br /&gt;
&lt;br /&gt;
    greeting.content = self.request.get(&amp;#039;content&amp;#039;)&lt;br /&gt;
    greeting.put()&lt;br /&gt;
    self.redirect(&amp;#039;/?&amp;#039; + urllib.urlencode({&amp;#039;guestbook_name&amp;#039;: guestbook_name}))&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
application = webapp.WSGIApplication([&lt;br /&gt;
  (&amp;#039;/&amp;#039;, MainPage),&lt;br /&gt;
  (&amp;#039;/sign&amp;#039;, Guestbook)&lt;br /&gt;
], debug=True)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
def main():&lt;br /&gt;
  run_wsgi_app(application)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
if __name__ == &amp;#039;__main__&amp;#039;:&lt;br /&gt;
  main()    &lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;/div&gt;</summary>
		<author><name>Tammet</name></author>
	</entry>
</feed>