Advertisement
Guest User

Untitled

a guest
Feb 13th, 2017
174
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 8.71 KB | None | 0 0
  1. import os
  2. import re
  3. import random
  4. import hashlib
  5. import hmac
  6. from string import letters
  7.  
  8. import webapp2
  9. import jinja2
  10.  
  11. from google.appengine.ext import db
  12.  
  13. template_dir = os.path.join(os.path.dirname(__file__), 'templates')
  14. jinja_env = jinja2.Environment(loader = jinja2.FileSystemLoader(template_dir),
  15. autoescape = True)
  16.  
  17. secret = 'fart'
  18.  
  19. def render_str(template, **params):
  20. t = jinja_env.get_template(template)
  21. return t.render(params)
  22.  
  23. def make_secure_val(val):
  24. return '%s|%s' % (val, hmac.new(secret, val).hexdigest())
  25.  
  26. def check_secure_val(secure_val):
  27. val = secure_val.split('|')[0]
  28. if secure_val == make_secure_val(val):
  29. return val
  30.  
  31. class BlogHandler(webapp2.RequestHandler):
  32. def write(self, *a, **kw):
  33. self.response.out.write(*a, **kw)
  34.  
  35. def render_str(self, template, **params):
  36. params['user'] = self.user
  37. return render_str(template, **params)
  38.  
  39. def render(self, template, **kw):
  40. self.write(self.render_str(template, **kw))
  41.  
  42. def set_secure_cookie(self, name, val):
  43. cookie_val = make_secure_val(val)
  44. self.response.headers.add_header(
  45. 'Set-Cookie',
  46. '%s=%s; Path=/' % (name, cookie_val))
  47.  
  48. def read_secure_cookie(self, name):
  49. cookie_val = self.request.cookies.get(name)
  50. return cookie_val and check_secure_val(cookie_val)
  51.  
  52. def login(self, user):
  53. self.set_secure_cookie('user_id', str(user.key().id()))
  54.  
  55. def logout(self):
  56. self.response.headers.add_header('Set-Cookie', 'user_id=; Path=/')
  57.  
  58. def initialize(self, *a, **kw):
  59. webapp2.RequestHandler.initialize(self, *a, **kw)
  60. uid = self.read_secure_cookie('user_id')
  61. self.user = uid and User.by_id(int(uid))
  62.  
  63. def render_post(response, post):
  64. response.out.write('<b>' + post.subject + '</b><br>')
  65. response.out.write(post.content)
  66.  
  67. class MainPage(BlogHandler):
  68. def get(self):
  69. self.write('Hello, Udacity!')
  70.  
  71.  
  72. ##### user stuff
  73. def make_salt(length = 5):
  74. return ''.join(random.choice(letters) for x in xrange(length))
  75.  
  76. def make_pw_hash(name, pw, salt = None):
  77. if not salt:
  78. salt = make_salt()
  79. h = hashlib.sha256(name + pw + salt).hexdigest()
  80. return '%s,%s' % (salt, h)
  81.  
  82. def valid_pw(name, password, h):
  83. salt = h.split(',')[0]
  84. return h == make_pw_hash(name, password, salt)
  85.  
  86. def users_key(group = 'default'):
  87. return db.Key.from_path('users', group)
  88.  
  89. class User(db.Model):
  90. name = db.StringProperty(required = True)
  91. pw_hash = db.StringProperty(required = True)
  92. email = db.StringProperty()
  93.  
  94. @classmethod
  95. def by_id(cls, uid):
  96. return User.get_by_id(uid, parent = users_key())
  97.  
  98. @classmethod
  99. def by_name(cls, name):
  100. u = User.all().filter('name =', name).get()
  101. return u
  102.  
  103. @classmethod
  104. def register(cls, name, pw, email = None):
  105. pw_hash = make_pw_hash(name, pw)
  106. return User(parent = users_key(),
  107. name = name,
  108. pw_hash = pw_hash,
  109. email = email)
  110.  
  111. @classmethod
  112. def login(cls, name, pw):
  113. u = cls.by_name(name)
  114. if u and valid_pw(name, pw, u.pw_hash):
  115. return u
  116.  
  117.  
  118. ##### blog stuff
  119.  
  120. def blog_key(name = 'default'):
  121. return db.Key.from_path('blogs', name)
  122.  
  123. class Post(db.Model):
  124. subject = db.StringProperty(required = True)
  125. content = db.TextProperty(required = True)
  126. created = db.DateTimeProperty(auto_now_add = True)
  127. last_modified = db.DateTimeProperty(auto_now = True)
  128.  
  129. def render(self):
  130. self._render_text = self.content.replace('\n', '<br>')
  131. return render_str("post.html", p = self)
  132.  
  133. class BlogFront(BlogHandler):
  134. def get(self):
  135. posts = greetings = Post.all().order('-created')
  136. self.render('front.html', posts = posts)
  137.  
  138. class PostPage(BlogHandler):
  139. def get(self, post_id):
  140. key = db.Key.from_path('Post', int(post_id), parent=blog_key())
  141. post = db.get(key)
  142.  
  143. if not post:
  144. self.error(404)
  145. return
  146.  
  147. self.render("permalink.html", post = post)
  148.  
  149. class NewPost(BlogHandler):
  150. def get(self):
  151. if self.user:
  152. self.render("newpost.html")
  153. else:
  154. self.redirect("/login")
  155.  
  156. def post(self):
  157. if not self.user:
  158. self.redirect('/blog')
  159.  
  160. subject = self.request.get('subject')
  161. content = self.request.get('content')
  162.  
  163. if subject and content:
  164. p = Post(parent = blog_key(), subject = subject, content = content)
  165. p.put()
  166. self.redirect('/blog/%s' % str(p.key().id()))
  167. else:
  168. error = "subject and content, please!"
  169. self.render("newpost.html", subject=subject, content=content, error=error)
  170.  
  171.  
  172. ###### Unit 2 HW's
  173. class Rot13(BlogHandler):
  174. def get(self):
  175. self.render('rot13-form.html')
  176.  
  177. def post(self):
  178. rot13 = ''
  179. text = self.request.get('text')
  180. if text:
  181. rot13 = text.encode('rot13')
  182.  
  183. self.render('rot13-form.html', text = rot13)
  184.  
  185.  
  186. USER_RE = re.compile(r"^[a-zA-Z0-9_-]{3,20}$")
  187. def valid_username(username):
  188. return username and USER_RE.match(username)
  189.  
  190. PASS_RE = re.compile(r"^.{3,20}$")
  191. def valid_password(password):
  192. return password and PASS_RE.match(password)
  193.  
  194. EMAIL_RE = re.compile(r'^[\S]+@[\S]+\.[\S]+$')
  195. def valid_email(email):
  196. return not email or EMAIL_RE.match(email)
  197.  
  198. class Signup(BlogHandler):
  199. def get(self):
  200. self.render("signup-form.html")
  201.  
  202. def post(self):
  203. have_error = False
  204. self.username = self.request.get('username')
  205. self.password = self.request.get('password')
  206. self.verify = self.request.get('verify')
  207. self.email = self.request.get('email')
  208.  
  209. params = dict(username = self.username,
  210. email = self.email)
  211.  
  212. if not valid_username(self.username):
  213. params['error_username'] = "That's not a valid username."
  214. have_error = True
  215.  
  216. if not valid_password(self.password):
  217. params['error_password'] = "That wasn't a valid password."
  218. have_error = True
  219. elif self.password != self.verify:
  220. params['error_verify'] = "Your passwords didn't match."
  221. have_error = True
  222.  
  223. if not valid_email(self.email):
  224. params['error_email'] = "That's not a valid email."
  225. have_error = True
  226.  
  227. if have_error:
  228. self.render('signup-form.html', **params)
  229. else:
  230. self.done()
  231.  
  232. def done(self, *a, **kw):
  233. raise NotImplementedError
  234.  
  235. class Unit2Signup(Signup):
  236. def done(self):
  237. self.redirect('/unit2/welcome?username=' + self.username)
  238.  
  239. class Register(Signup):
  240. def done(self):
  241. #make sure the user doesn't already exist
  242. u = User.by_name(self.username)
  243. if u:
  244. msg = 'That user already exists.'
  245. self.render('signup-form.html', error_username = msg)
  246. else:
  247. u = User.register(self.username, self.password, self.email)
  248. u.put()
  249.  
  250. self.login(u)
  251. self.redirect('/blog')
  252.  
  253. class Login(BlogHandler):
  254. def get(self):
  255. self.render('login-form.html')
  256.  
  257. def post(self):
  258. username = self.request.get('username')
  259. password = self.request.get('password')
  260.  
  261. u = User.login(username, password)
  262. if u:
  263. self.login(u)
  264. self.redirect('/blog')
  265. else:
  266. msg = 'Invalid login'
  267. self.render('login-form.html', error = msg)
  268.  
  269. class Logout(BlogHandler):
  270. def get(self):
  271. self.logout()
  272. self.redirect('/blog')
  273.  
  274. class Unit3Welcome(BlogHandler):
  275. def get(self):
  276. if self.user:
  277. self.render('welcome.html', username = self.user.name)
  278. else:
  279. self.redirect('/signup')
  280.  
  281. class Welcome(BlogHandler):
  282. def get(self):
  283. username = self.request.get('username')
  284. if valid_username(username):
  285. self.render('welcome.html', username = username)
  286. else:
  287. self.redirect('/unit2/signup')
  288.  
  289. app = webapp2.WSGIApplication([('/', MainPage),
  290. ('/unit2/rot13', Rot13),
  291. ('/unit2/signup', Unit2Signup),
  292. ('/unit2/welcome', Welcome),
  293. ('/blog/?', BlogFront),
  294. ('/blog/([0-9]+)', PostPage),
  295. ('/blog/newpost', NewPost),
  296. ('/signup', Register),
  297. ('/login', Login),
  298. ('/logout', Logout),
  299. ('/unit3/welcome', Unit3Welcome),
  300. ],
  301. debug=True)
  302.  
  303. # welcome.html
  304. # <body>
  305. # <h2>Welcome, {{username}}!</h2>
  306. # </body>
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement