import os
import re
from string import letters
import webapp2
import jinja2
import hashlib
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)
#定义user_key的亲节点
def user_key(name = 'default'):
return db.key.from_path('User', name)
#定义数据模型User
class User(db.Model):
username = db.StringProperty(required = True)
password = db.StringProperty(required = True)
created = db.DateTimeProperty(auto_now_add = True)
last_modified = db.DateTimeProperty(auto_now = True)
def render(self):
return render_str("user.html", user = self)
#按照username查找用户
def user_search(username):
return db.GqlQuery("select * from User where username='%s'" % username)
#验证cookie中的信息是否有效
def hash_str(s):
return hashlib.md5(s).hexdigest()
def make_secure_val(s):
return "%s|%s" % (s, hash_str(s))
def check_secure_val(h):
val = h.split('|')[0]
if h == make_secure_val(val):
return val
def extract_cookie(s):
return s.split('|')[0]#使用正则表达式判断表单中的信息是否合法
USER_RE = re.compile(r"^[a-zA-Z0-9_-]{3,20}$")
def valid_username(username):
return username and USER_RE.match(username)
PASSWORD_RE = re.compile(r"^.{3,20}$")
def valid_password(password):
return password and PASSWORD_RE.match(password)
EMAIL_RE = re.compile(r"^[\S]+@[\S]+\.[\S]+$")
def valid_email(email):
return not email or EMAIL_RE.match(email)#渲染模板
def render_str(template, **params):
t = jinja_env.get_template(template)
return t.render(params)#负责渲染模板的handler
class BaseHandler(webapp2.RequestHandler):
def write(self, *a, **kw):
self.response.out.write(*a, **kw)
def render_str(self, template, **params):
t = jinja_env.get_template(template)
return t.render(params)
def render(self, template, **kw):
self.write(self.render_str(template, **kw))#主handler
class MainHandler(BaseHandler):
def get(self):
self.render('main.html')#注册或是登陆成功的handler
class WelcomeHandler(BaseHandler):
def get(self):
user_id = extract_cookie(self.request.cookies.get('user_id'))
key = db.Key.from_path('User', int(user_id))
user = db.get(key)
if not user:
self.error(404)
else:
self.render('welcome.html', username = user.username)#处理注册的handler
class SignupHandler(BaseHandler):
def get(self):
self.render('registration.html')
def post(self):
have_error = False
username = self.request.get('username')
password = self.request.get('password')
v_password = self.request.get('v_password')
email = self.request.get('email')
#验证表单合法性
params = dict(username = username,
email = email)
if not valid_username(username):
params['username_error'] = "That's not a valid user name!"
have_error = True
if not valid_password(password):
params['password_error'] = "That's not a valid password!"
have_error = True
elif password != v_password:
params['verify_error'] = "Passwords didn't match!"
have_error = True
if not valid_email(email):
params['email_error'] = "That's not a valid email!"
have_error = True
if not user_search(username):
params['exist_error'] = "This user already exists!"
have_error = True
if have_error:
self.render("registration.html", **params)
else:
u = User(username = username, password = password)
u.put()
self.response.headers.add_header('Set-Cookie', 'user_id=%s; Path=/' % str(u.key().id()))
self.redirect('/welcome')#打印所有用户信息的handler
class UserFront(BaseHandler):
def get(self):
users = db.GqlQuery("select * from User order by created desc limit 10")
self.render('all-users.html', users = users)#webapp2
app = webapp2.WSGIApplication([
('/', MainHandler),
('/signup', SignupHandler),
('/welcome', WelcomeHandler),
('/allusers', UserFront)
], debug=True)
74

被折叠的 条评论
为什么被折叠?



