PageRenderTime 27ms CodeModel.GetById 19ms RepoModel.GetById 0ms app.codeStats 0ms

/app.py

https://gitlab.com/agigao/social-network
Python | 193 lines | 151 code | 35 blank | 7 comment | 33 complexity | 3c1c80d10a790320a8d5214b8565a63c MD5 | raw file
  1. from flask import Flask, g, render_template, flash, redirect, url_for, abort
  2. from flask.ext.bcrypt import check_password_hash
  3. from flask.ext.login import LoginManager, login_user, logout_user, login_required, current_user
  4. import forms
  5. import models
  6. DEBUG = True
  7. PORT = 8080
  8. HOST = '0.0.0.0'
  9. app = Flask(__name__)
  10. app.secret_key = 'L(*&&^&YTHDTHFIC@!>HST<N"H"NT<HDc,p1,,1HRCLRCG!@*$?!GDLCG<"FU?(!@*($GL!DP!CG'
  11. login_manager = LoginManager() # create LoginManager instance
  12. login_manager.init_app(app) # link login-manager for our "app"
  13. login_manager.login_view = 'login' # if not logged in, redirect and give the "view" - "login"
  14. @login_manager.user_loader
  15. def load_user(userid):
  16. try:
  17. return models.User.get(models.User.id == userid) # give me the user from database with THAT id
  18. except models.DoesNotExist: # peewee stuff
  19. return None
  20. @app.before_request
  21. def before_request():
  22. """ Connect to the database before EACH request. """
  23. g.db = models.DATABASE
  24. g.db.connect()
  25. g.user = current_user
  26. @app.after_request
  27. def after_request(response):
  28. """ Close the database connection after EACH request """
  29. g.db.close()
  30. return response
  31. @app.route('/register', methods=('GET', 'POST'))
  32. def register():
  33. form = forms.RegistrationForm()
  34. if form.validate_on_submit():
  35. models.User.create_user(
  36. username=form.username.data,
  37. email=form.email.data,
  38. password=form.password.data
  39. )
  40. flash("Congrats here! You've just joined!", "success")
  41. return redirect(url_for('index'))
  42. return render_template('register.html', form=form)
  43. @app.route('/login', methods=('GET', 'POST'))
  44. def login():
  45. form = forms.LoginForm()
  46. if form.validate_on_submit():
  47. try:
  48. user = models.User.get(models.User.email == form.email.data)
  49. except models.DoesNotExist:
  50. flash("Your email or password doesn't match!", "error")
  51. else:
  52. if check_password_hash(user.password, form.password.data):
  53. login_user(user)
  54. flash("You've just logged in successfully!", "success")
  55. return redirect(url_for('index'))
  56. else:
  57. flash("Your email or password doesn't match!", "error")
  58. return render_template("login.html", form=form)
  59. @app.route('/logout')
  60. @login_required
  61. def logout():
  62. # flask method
  63. logout_user()
  64. flash("You've been logged out! Get the hell out of here!", "success")
  65. return redirect(url_for('index'))
  66. @app.route("/new_post", methods=('GET', 'POST'))
  67. @login_required
  68. def post():
  69. form = forms.PostForm()
  70. if form.validate_on_submit():
  71. models.Post.create(user=g.user._get_current_object(),
  72. content=form.content.data.strip())
  73. flash("Message posted! Thanks!", "success")
  74. return redirect(url_for('index'))
  75. return render_template('post.html', form=form)
  76. @app.route('/')
  77. def index():
  78. stream = models.Post.select().limit(100)
  79. return render_template('stream.html', stream=stream)
  80. @app.route('/stream')
  81. @app.route('/stream/<username>')
  82. @login_required
  83. def stream(username=None):
  84. template = 'stream.html'
  85. if username and username != current_user.username:
  86. try:
  87. user = models.User.select().where(models.User.username**username).get() # ** < compare and ignore case
  88. except models.DoesNotExist:
  89. abort(404)
  90. else:
  91. stream = user.posts.limit(100)
  92. else:
  93. stream = current_user.get_stream().limit(100)
  94. user = current_user
  95. if username:
  96. template = 'user_stream.html' # if we got username, then we should render user_stream template
  97. return render_template(template, stream=stream, user=user)
  98. @app.route('/post/<int:post_id>')
  99. def view_post(post_id):
  100. posts = models.Post.select().where(models.Post.id == post_id)
  101. if posts.count() == 0:
  102. abort(404)
  103. return render_template('stream.html', stream=posts)
  104. @app.route('/follow/<username>')
  105. @login_required
  106. def follow(username):
  107. try:
  108. to_user = models.User.get(models.User.username**username)
  109. except models.DoesNotExist:
  110. abort(404)
  111. else:
  112. try:
  113. models.Relationship.create(
  114. from_user=g.user._get_current_object(),
  115. to_user=to_user
  116. )
  117. except models.IntegrityError:
  118. pass
  119. else:
  120. flash("You've just started to follow to {}!".format(to_user.username), "success")
  121. return redirect(url_for('stream', username=to_user.username))
  122. @app.route('/unfollow/<username>')
  123. @login_required
  124. def unfollow(username):
  125. try:
  126. to_user = models.User.get(models.User.username**username)
  127. except models.DoesNotExist:
  128. abort(404)
  129. else:
  130. try:
  131. models.Relationship.get(
  132. from_user=g.user._get_Current_object(),
  133. to_user=to_user
  134. ).delete_instance()
  135. except models.IntegrityError:
  136. pass
  137. else:
  138. flash("Are you brainfucked with {}s posts? Ok, me too. You've just saved your state of mind!".format(to_user.username), "success")
  139. return redirect(url_for('stream', username=to_user.username))
  140. @app.errorhandler(404)
  141. def not_found(error):
  142. return render_template('404.html'), 404
  143. if __name__ == '__main__':
  144. models.initialize()
  145. try:
  146. models.User.create_user(
  147. username="Giga",
  148. email="salve@salve.rome",
  149. password="salve",
  150. admin=True
  151. )
  152. except ValueError:
  153. pass
  154. app.run(debug=DEBUG, host=HOST, port=PORT)
  155. # g - global object : setup thing that wil be available EVERYWHERE!
  156. # user_loader - A decorator to mark the function responsible for loading a user from whatever data source we use.
  157. # logout_user() - Method to remove a user's session and sign them out.
  158. # @login_required - Decorator to mark a view as requiring a user to be logged in before they can access the view.