Advertisement
Guest User

Untitled

a guest
Sep 27th, 2017
93
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 7.29 KB | None | 0 0
  1. from flask import (Flask, g, render_template, flash, redirect, url_for,
  2. abort, request, Markup)
  3. from flask.ext.bcrypt import check_password_hash
  4. from flask.ext.login import (LoginManager, login_user, logout_user,
  5. login_required, current_user)
  6. from flask_mail import Message, Mail
  7. from itsdangerous import URLSafeTimedSerializer, BadSignature, SignatureExpired
  8. from werkzeug.utils import secure_filename
  9. from random import randint
  10.  
  11. import forms
  12. import models
  13. import os
  14.  
  15.  
  16. app = Flask(__name__)
  17. app.config.from_object('config.BaseConfig')
  18. mail = Mail(app)
  19.  
  20. serializer = URLSafeTimedSerializer(app.config['SECRET_KEY'])
  21.  
  22. login_manager = LoginManager()
  23. login_manager.init_app(app)
  24. login_manager.login_view = 'login'
  25.  
  26.  
  27. def generate_activation_url(form):
  28. token = serializer.dumps(form.email.data)
  29. return url_for('activate', token=token, _external=True)
  30.  
  31.  
  32. def allowed_file(filename):
  33. return '.' in filename and \
  34. filename.rsplit('.', 1)[1].lower() in app.config[
  35. 'ALLOWED_EXTENSIONS']
  36.  
  37.  
  38. @login_manager.user_loader
  39. def load_user(userid):
  40. try:
  41. return models.User.get(models.User.id == userid)
  42. except models.DoesNotExist:
  43. return None
  44.  
  45.  
  46. @app.before_request
  47. def before_request():
  48. 'Connect to the database before each request.'
  49. try:
  50. g.db = models.db
  51. g.db.connect()
  52. g.user = current_user
  53. except models.OperationalError:
  54. pass
  55.  
  56.  
  57. @app.after_request
  58. def after_request(response):
  59. 'Close the database connection after each request.'
  60. g.db.close()
  61. return response
  62.  
  63.  
  64. @app.route('/', methods=('GET', 'POST'))
  65. def index():
  66. form = forms.RegisterForm()
  67. if form.validate_on_submit():
  68. models.User.create_user(
  69. username=form.username.data,
  70. email=form.email.data,
  71. password=form.password.data,
  72. confirmed=False
  73. )
  74. token = generate_activation_url(form)
  75. msg = Message(recipients=[form.email.data],
  76. body=render_template(
  77. 'activation_email.html', token=token),
  78. subject='Welcome!')
  79. mail.send(msg)
  80.  
  81. return render_template('activate.html', form=form)
  82.  
  83. if current_user.is_authenticated:
  84. return redirect(url_for('feed'))
  85. else:
  86. return render_template('index.html', form=form)
  87.  
  88.  
  89. @app.route('/activate/<token>')
  90. def activate(token, expiration=3600):
  91. try:
  92. serializer.loads(token, max_age=expiration)
  93. except (BadSignature, SignatureExpired):
  94. abort(404)
  95.  
  96. models.User.confirmed = True
  97. return render_template('emailverified.html')
  98.  
  99.  
  100. @app.route('/login', methods=('GET', 'POST'))
  101. def login():
  102. form = forms.LoginForm()
  103. if form.validate_on_submit():
  104. try:
  105. user = models.User.get(models.User.email == form.email.data)
  106. except models.DoesNotExist:
  107. flash(Markup('<div class="preNote">Incorrect email or password!</div><div class="noteSuf">You have entered the wrong email or password.</div>'), 'error')
  108. else:
  109. if check_password_hash(user.password, form.password.data):
  110. if models.User.confirmed:
  111. login_user(user)
  112. flash(Markup('<div class="preNote">You\'ve been logged in!</div><div class="noteSuf">You have been successfully logged into your account.</div>'), 'success')
  113. return redirect(url_for('feed'))
  114.  
  115. else:
  116. flash(Markup('<div class="preNote">Your email hasn\'t been verified. </div><div class="noteSuf">Your account hasn\'t been acivated, check your email inbox and junk folder and click the link.</div>'), 'error')
  117. else:
  118. flash(Markup('<div class="preNote">Your email hasn\'t been verified. </div><div class="noteSuf">Your account hasn\'t been acivated, check your email inbox and junk folder and click the link.</div>'), 'error')
  119. return render_template('login.html', form=form)
  120.  
  121.  
  122. @app.route('/logout')
  123. @login_required
  124. def logout():
  125. logout_user()
  126. flash(Markup('<div class="preNote">Logout successful.</div><div class="noteSuf">You have been successfully logged out. Log back in to view your account.</div>'), 'success')
  127. return redirect(url_for('index'))
  128.  
  129.  
  130. @app.route('/post', methods=('GET', 'POST'))
  131. @login_required
  132. def post():
  133. form = forms.PostForm()
  134. if request.method == 'POST':
  135. if form.validate_on_submit():
  136. file = request.files['image']
  137.  
  138. if file and allowed_file(file.filename):
  139. filename = secure_filename(
  140. str(randint(1, 100000000)) + file.filename)
  141. file.save(os.path.join(app.config['MEDIA_ROOT'], filename))
  142. models.Post.create(user=g.user._get_current_object(),
  143. content=form.content.data.strip(),
  144. image=os.path.join(
  145. app.config['MEDIA_ROOT'], filename))
  146. return redirect(url_for('feed'))
  147. else:
  148. flash(Markup('<div class="preNote">File extention not allowed.</div><div class="noteSuf">You can\'t use this type of image or file, try another.</div>'), 'error')
  149. return render_template('post.html', form=form)
  150.  
  151.  
  152. @app.route('/feed', methods=('GET', 'POST'))
  153. @login_required
  154. def feed():
  155. feed = models.Post.select().limit(100)
  156. return render_template('feed.html', feed=feed)
  157.  
  158.  
  159. @app.route('/feed')
  160. @app.route('/feed/<username>')
  161. @login_required
  162. def user_feed(username=None):
  163. if username and username != current_user.username:
  164. try:
  165. user = models.User.select().where(
  166. models.User.username**username).get()
  167. feed = user.posts.limit(100)
  168. except models.DoesNotExist:
  169. abort(404)
  170. else:
  171. feed = user.posts.limit(100)
  172. else:
  173. feed = current_user.get_feed().limit(100)
  174. user = current_user
  175. if username:
  176. template = 'user_feed.html'
  177. return render_template(template, feed=feed, user=user)
  178.  
  179.  
  180. @app.route('/follow/<username>')
  181. @login_required
  182. def follow(username):
  183. try:
  184. to_user = models.User.get(models.User.username**username)
  185. except models.DoesNotExist:
  186. abort(404)
  187. else:
  188. try:
  189. models.Relationship.create(
  190. from_user=g.user._get_current_object(),
  191. to_user=to_user
  192. )
  193. except models.IntegrityError:
  194. pass
  195. else:
  196. flash('Following {}!'.format(to_user.username), 'success')
  197. return redirect(url_for('user_feed', username=to_user.username))
  198.  
  199.  
  200. @app.route('/unfollow/<username>')
  201. @login_required
  202. def unfollow(username):
  203. try:
  204. to_user = models.User.get(models.User.username**username)
  205. except models.DoesNotExist:
  206. abort(404)
  207. else:
  208. try:
  209. models.Relationship.get(
  210. from_user=g.user._get_current_object(),
  211. to_user=to_user
  212. ).delete_instance()
  213. except models.IntegrityError:
  214. pass
  215. else:
  216. flash('Unfollowed {}'.format(to_user.username), 'success')
  217. return redirect(url_for('user_feed', username=to_user.username))
  218.  
  219.  
  220. @app.errorhandler(404)
  221. def not_found(error):
  222. return render_template('404.html'), 404
  223.  
  224.  
  225. if __name__ == '__main__':
  226. models.init()
  227. app.run(debug=True, host='localhost', port=8000)
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement