/app.py
Python | 193 lines | 151 code | 35 blank | 7 comment | 33 complexity | 3c1c80d10a790320a8d5214b8565a63c MD5 | raw file
- from flask import Flask, g, render_template, flash, redirect, url_for, abort
- from flask.ext.bcrypt import check_password_hash
- from flask.ext.login import LoginManager, login_user, logout_user, login_required, current_user
- import forms
- import models
- DEBUG = True
- PORT = 8080
- HOST = '0.0.0.0'
- app = Flask(__name__)
- app.secret_key = 'L(*&&^&YTHDTHFIC@!>HST<N"H"NT<HDc,p1,,1HRCLRCG!@*$?!GDLCG<"FU?(!@*($GL!DP!CG'
- login_manager = LoginManager() # create LoginManager instance
- login_manager.init_app(app) # link login-manager for our "app"
- login_manager.login_view = 'login' # if not logged in, redirect and give the "view" - "login"
- @login_manager.user_loader
- def load_user(userid):
- try:
- return models.User.get(models.User.id == userid) # give me the user from database with THAT id
- except models.DoesNotExist: # peewee stuff
- return None
-
- @app.before_request
- def before_request():
- """ Connect to the database before EACH request. """
- g.db = models.DATABASE
- g.db.connect()
- g.user = current_user
- @app.after_request
- def after_request(response):
- """ Close the database connection after EACH request """
- g.db.close()
- return response
- @app.route('/register', methods=('GET', 'POST'))
- def register():
- form = forms.RegistrationForm()
- if form.validate_on_submit():
- models.User.create_user(
- username=form.username.data,
- email=form.email.data,
- password=form.password.data
- )
- flash("Congrats here! You've just joined!", "success")
- return redirect(url_for('index'))
- return render_template('register.html', form=form)
- @app.route('/login', methods=('GET', 'POST'))
- def login():
- form = forms.LoginForm()
- if form.validate_on_submit():
- try:
- user = models.User.get(models.User.email == form.email.data)
- except models.DoesNotExist:
- flash("Your email or password doesn't match!", "error")
- else:
- if check_password_hash(user.password, form.password.data):
- login_user(user)
- flash("You've just logged in successfully!", "success")
- return redirect(url_for('index'))
- else:
- flash("Your email or password doesn't match!", "error")
- return render_template("login.html", form=form)
- @app.route('/logout')
- @login_required
- def logout():
- # flask method
- logout_user()
- flash("You've been logged out! Get the hell out of here!", "success")
- return redirect(url_for('index'))
- @app.route("/new_post", methods=('GET', 'POST'))
- @login_required
- def post():
- form = forms.PostForm()
- if form.validate_on_submit():
- models.Post.create(user=g.user._get_current_object(),
- content=form.content.data.strip())
- flash("Message posted! Thanks!", "success")
- return redirect(url_for('index'))
- return render_template('post.html', form=form)
- @app.route('/')
- def index():
- stream = models.Post.select().limit(100)
- return render_template('stream.html', stream=stream)
- @app.route('/stream')
- @app.route('/stream/<username>')
- @login_required
- def stream(username=None):
- template = 'stream.html'
- if username and username != current_user.username:
- try:
- user = models.User.select().where(models.User.username**username).get() # ** < compare and ignore case
- except models.DoesNotExist:
- abort(404)
- else:
- stream = user.posts.limit(100)
- else:
- stream = current_user.get_stream().limit(100)
- user = current_user
- if username:
- template = 'user_stream.html' # if we got username, then we should render user_stream template
- return render_template(template, stream=stream, user=user)
- @app.route('/post/<int:post_id>')
- def view_post(post_id):
- posts = models.Post.select().where(models.Post.id == post_id)
- if posts.count() == 0:
- abort(404)
- return render_template('stream.html', stream=posts)
- @app.route('/follow/<username>')
- @login_required
- def follow(username):
- try:
- to_user = models.User.get(models.User.username**username)
- except models.DoesNotExist:
- abort(404)
- else:
- try:
- models.Relationship.create(
- from_user=g.user._get_current_object(),
- to_user=to_user
- )
- except models.IntegrityError:
- pass
- else:
- flash("You've just started to follow to {}!".format(to_user.username), "success")
- return redirect(url_for('stream', username=to_user.username))
- @app.route('/unfollow/<username>')
- @login_required
- def unfollow(username):
- try:
- to_user = models.User.get(models.User.username**username)
- except models.DoesNotExist:
- abort(404)
- else:
- try:
- models.Relationship.get(
- from_user=g.user._get_Current_object(),
- to_user=to_user
- ).delete_instance()
- except models.IntegrityError:
- pass
- else:
- flash("Are you brainfucked with {}s posts? Ok, me too. You've just saved your state of mind!".format(to_user.username), "success")
- return redirect(url_for('stream', username=to_user.username))
- @app.errorhandler(404)
- def not_found(error):
- return render_template('404.html'), 404
- if __name__ == '__main__':
- models.initialize()
- try:
- models.User.create_user(
- username="Giga",
- email="salve@salve.rome",
- password="salve",
- admin=True
- )
- except ValueError:
- pass
- app.run(debug=DEBUG, host=HOST, port=PORT)
- # g - global object : setup thing that wil be available EVERYWHERE!
- # user_loader - A decorator to mark the function responsible for loading a user from whatever data source we use.
- # logout_user() - Method to remove a user's session and sign them out.
- # @login_required - Decorator to mark a view as requiring a user to be logged in before they can access the view.