Advertisement
Guest User

Untitled

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