Here is my code:
template.py
import os
import webapp2
import jinja2
from google.appengine.ext import db
template_dir = os.path.join(os.path.dirname(__file__), "templates")
jinja_env = jinja2.Environment(loader=jinja2.FileSystemLoader(template_dir),
autoescape=True)
class Handler(webapp2.RequestHandler):
def write(self, *arg, **kwargs):
self.response.out.write(*arg, **kwargs)
def render_str(self, template, **params):
t = jinja_env.get_template(template)
return t.render(params)
def render(self, template, **kwargs):
self.write(self.render_str(template, **kwargs))
class Art(db.Model):
title = db.StringProperty(required = True)
art = db.TextProperty(required = True)
created = db.DateTimeProperty(auto_now_add = True)
class MainPage(Handler):
def render_front(self, title="", art="", error=""):
arts = db.GqlQuery("SELECT * FROM Art ORDER BY created DESC")
self.render("front.html", title=title, art=art, error=error, arts=arts)
def get(self):
self.render_front()
def post(self):
title = self.request.get("title")
art = self.request.get("art")
if title and art:
a = Art(title=title, art=art)
a.put()
self.redirect("/")
else:
error = "We need both a title and some artwork!"
self.render_front(title, art, error)
app = webapp2.WSGIApplication([('/', MainPage)], debug=True)
front.html
<!DOCTYPE html>
<html>
<head>
<title>/ascii/</title>
</head>
<body>
<h1>/ascii/</h1>
<form method="post">
<label>
<div>title</div>
<input type="text" name="title" value="{{ title }}">
</label>
<label>
<div>art</div>
<textarea name="art">{{ art }}</textarea>
</label>
<div class="error">{{ error }}</div>
<input type="submit">
</form>
<hr>
{% for art in arts %}
<div class="art">
<div class="art-title">{{ art.title }}</div>
<pre class="art-body"> {{ art.art }}</pre>
</div>
{% endfor %}
</body>
</html>
When I input some text in "title", "art" and press "submit", it should post most of my enter and return the result of database query.But I must flush the page otherwise cannot see what I've post.
It might look like the flush is helping, but it's really the passing of time while "eventual consistency" catches up.
The details are described in https://cloud.google.com/datastore/docs/concepts/structuring_for_strong_consistency