Alright so first off I make no claims to being a good programmer, but I am enjoying doing web dev in Python and my preferred method is Google App Engine or GAE
So what were going to build a basic web site and simple way for users to post messages, Yay! This website is based on a free project I did for a friend.
So lets get started
app.yaml
Code: Select all
application: your-app
version: 1
runtime: python
api_version: 1
handlers:
- url: /static
static_dir: static
- url: /.*
script: index.py
Code: Select all
www.appspot.com
the next script this is our main python file . So create those directories and files and lets continue
Open up index.py and enter the following
Code: Select all
import os
import logging
import wsgiref.handlers
from google.appengine.api import users
from google.appengine.ext import webapp
from google.appengine.ext.webapp import template
from google.appengine.ext import db
from time import gmtime, strftime
from os import environ
next we create our database.
Code: Select all
class forum_db(db.Model):
fname = db.StringProperty(required=True)
sfdesc = db.StringProperty(required=True)
fdesc = db.StringProperty(required=True)
forum_date = db.StringProperty()
author = db.StringProperty()
Now for our templating function to render HTML for us
Code: Select all
def doRender(handler, tname = 'index.htm', values = { }):
temp = os.path.join(
os.path.dirname(__file__),
'templates/' + tname)
if not os.path.isfile(temp):
return False
# Make a copy of the dictionary and add the path and session
newval = dict(values)
newval['path'] = handler.request.path
outstr = template.render(temp, newval)
handler.response.out.write(outstr)
return True
Code: Select all
class ForumHandler(webapp.RequestHandler):
def get(self):
user = users.get_current_user()
if user:
que = db.Query(forum_db).order('-forum_date')
forum_list = que.fetch(limit=100)
doRender(
self,
'forums.htm',
{'forum_list': forum_list})
else:
self.redirect(users.create_login_url(self.request.uri))
Now we do the same except this is for the posting part
Code: Select all
class ForumAdminHandler(webapp.RequestHandler):
def get(self):
user = users.get_current_user()
if user:
doRender(
self,
'forum_new.htm', { })
else:
self.redirect(users.create_login_url(self.request.uri))
def post(self):
user = users.get_current_user()
if user:
name = self.request.get('fname')
sfdesc = self.request.get('sfdesc')
desc = self.request.get('fdesc')
forum_date = strftime("%Y-%m-%d %H:%M:%S", gmtime())
new_forum = forum_db(fname=name, sfdesc=sfdesc, fdesc=desc, forum_date=forum_date, author=str(user))
new_forum.put()
self.redirect("/")
else:
self.redirect(users.create_login_url(self.request.uri))
Code: Select all
forum_list = que.fetch(limit=100)
doRender(
self,
'forums.htm',
{'forum_list': forum_list})
Code: Select all
{'forum_list': forum_list}
Code: Select all
{% for forum in forum_list %}
tr align="center" bgcolor="#CCC"
td a href="/topicslist?fname_id={{ forum.fname }}" {{ forum.fname }} /a /td
td{{ forum.sfdesc }}/td
td{{ forum.forum_date }}/td
td{{ forum.author }}/td
/tr
{% endfor %}
notice the link
Code: Select all
a href="/topicslist?fname_id={{ forum.fname }}
Code: Select all
class TopicHandler(webapp.RequestHandler):
def get(self):
user = users.get_current_user()
if user:
fname_id = self.request.get('fname_id')
que = db.Query(forum_db).filter('fname =', fname_id)
topic_list = que.fetch(limit=1)
doRender(
self,
'topicslist.htm',
{'topic_list': topic_list})
else:
self.redirect(users.create_login_url(self.request.uri))
Our MainHandler to view the main page
Code: Select all
class MainHandler(webapp.RequestHandler):
def get(self):
if doRender(self, self.request.path) :
return
doRender(self,'index.htm')
Code: Select all
def main():
application = webapp.WSGIApplication([
('/forum_index', ForumHandler),
('/topicslist', TopicHandler),
('/post_topic', ForumAdminHandler),
('/.*', MainHandler)],
debug=False)
wsgiref.handlers.CGIHandler().run(application)
if __name__ == '__main__':
main()
here is the full source to index.py
Code: Select all
import os
import logging
import wsgiref.handlers
from google.appengine.api import users
from google.appengine.ext import webapp
from google.appengine.ext.webapp import template
from google.appengine.ext import db
from time import gmtime, strftime
from os import environ
# A Model for a User
class forum_db(db.Model):
fname = db.StringProperty(required=True)
sfdesc = db.StringProperty(required=True)
fdesc = db.StringProperty(required=True)
forum_date = db.StringProperty()
author = db.StringProperty()
def doRender(handler, tname = 'index.htm', values = { }):
temp = os.path.join(
os.path.dirname(__file__),
'templates/' + tname)
if not os.path.isfile(temp):
return False
# Make a copy of the dictionary and add the path and session
newval = dict(values)
newval['path'] = handler.request.path
outstr = template.render(temp, newval)
handler.response.out.write(outstr)
return True
class ForumHandler(webapp.RequestHandler):
def get(self):
user = users.get_current_user()
if user:
que = db.Query(forum_db).order('-forum_date')
forum_list = que.fetch(limit=100)
doRender(
self,
'forums.htm',
{'forum_list': forum_list})
else:
self.redirect(users.create_login_url(self.request.uri))
class ForumAdminHandler(webapp.RequestHandler):
def get(self):
user = users.get_current_user()
if user:
doRender(
self,
'forum_new.htm', { })
else:
self.redirect(users.create_login_url(self.request.uri))
def post(self):
user = users.get_current_user()
if user:
name = self.request.get('fname')
sfdesc = self.request.get('sfdesc')
desc = self.request.get('fdesc')
forum_date = strftime("%Y-%m-%d %H:%M:%S", gmtime())
new_forum = forum_db(fname=name, sfdesc=sfdesc, fdesc=desc, forum_date=forum_date, author=str(user))
new_forum.put()
self.redirect("/")
else:
self.redirect(users.create_login_url(self.request.uri))
class TopicHandler(webapp.RequestHandler):
def get(self):
user = users.get_current_user()
if user:
fname_id = self.request.get('fname_id')
que = db.Query(forum_db).filter('fname =', fname_id)
topic_list = que.fetch(limit=1)
doRender(
self,
'topicslist.htm',
{'topic_list': topic_list})
else:
self.redirect(users.create_login_url(self.request.uri))
class MainHandler(webapp.RequestHandler):
def get(self):
if doRender(self, self.request.path) :
return
doRender(self,'index.htm')
def main():
application = webapp.WSGIApplication([
('/forum_index', ForumHandler),
('/topicslist', TopicHandler),
('/post_topic', ForumAdminHandler),
('/.*', MainHandler)],
debug=False)
wsgiref.handlers.CGIHandler().run(application)
if __name__ == '__main__':
main()
*cheers
Maboroshi