Skip to content

Commit

Permalink
user authentication
Browse files Browse the repository at this point in the history
  • Loading branch information
miguelgrinberg committed Dec 17, 2012
1 parent df88f0f commit 5ae5241
Show file tree
Hide file tree
Showing 4 changed files with 71 additions and 7 deletions.
8 changes: 8 additions & 0 deletions app/__init__.py
Original file line number Diff line number Diff line change
@@ -1,9 +1,17 @@
import os
from flask import Flask
from flask.ext.sqlalchemy import SQLAlchemy
from flask.ext.login import LoginManager
from flask.ext.openid import OpenID
from config import basedir

app = Flask(__name__)
app.config.from_object('config')
db = SQLAlchemy(app)
lm = LoginManager()
lm.setup_app(app)
lm.login_view = 'login'
oid = OpenID(app, os.path.join(basedir, 'tmp'))

from app import views, models

14 changes: 13 additions & 1 deletion app/models.py
Original file line number Diff line number Diff line change
Expand Up @@ -5,11 +5,23 @@

class User(db.Model):
id = db.Column(db.Integer, primary_key = True)
nickname = db.Column(db.String(64), index = True, unique = True)
nickname = db.Column(db.String(64), unique = True)
email = db.Column(db.String(120), index = True, unique = True)
role = db.Column(db.SmallInteger, default = ROLE_USER)
posts = db.relationship('Post', backref = 'author', lazy = 'dynamic')

def is_authenticated(self):
return True

def is_active(self):
return True

def is_anonymous(self):
return False

def get_id(self):
return unicode(self.id)

def __repr__(self):
return '<User %r>' % (self.nickname)

Expand Down
7 changes: 6 additions & 1 deletion app/templates/base.html
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,12 @@
{% endif %}
</head>
<body>
<div>Microblog: <a href="/index">Home</a></div>
<div>Microblog:
<a href="{{ url_for('index') }}">Home</a>
{% if g.user.is_authenticated() %}
| <a href="{{ url_for('logout') }}">Logout</a>
{% endif %}
</div>
<hr>
{% with messages = get_flashed_messages() %}
{% if messages %}
Expand Down
49 changes: 44 additions & 5 deletions app/views.py
Original file line number Diff line number Diff line change
@@ -1,11 +1,22 @@
from flask import render_template, flash, redirect
from app import app
from flask import render_template, flash, redirect, session, url_for, request, g
from flask.ext.login import login_user, logout_user, current_user, login_required
from app import app, db, lm, oid
from forms import LoginForm
from models import User, ROLE_USER, ROLE_ADMIN

@lm.user_loader
def load_user(id):
return User.query.get(int(id))

@app.before_request
def before_request():
g.user = current_user

@app.route('/')
@app.route('/index')
@login_required
def index():
user = { 'nickname': 'Miguel' }
user = g.user
posts = [
{
'author': { 'nickname': 'John' },
Expand All @@ -22,12 +33,40 @@ def index():
posts = posts)

@app.route('/login', methods = ['GET', 'POST'])
@oid.loginhandler
def login():
if g.user is not None and g.user.is_authenticated():
return redirect(url_for('index'))
form = LoginForm()
if form.validate_on_submit():
flash('Login requested for OpenID="' + form.openid.data + '", remember_me=' + str(form.remember_me.data))
return redirect('/index')
session['remember_me'] = form.remember_me.data
return oid.try_login(form.openid.data, ask_for = ['nickname', 'email'])
return render_template('login.html',
title = 'Sign In',
form = form,
providers = app.config['OPENID_PROVIDERS'])

@oid.after_login
def after_login(resp):
if resp.email is None or resp.email == "":
flash('Invalid login. Please try again.')
redirect(url_for('login'))
user = User.query.filter_by(email = resp.email).first()
if user is None:
nickname = resp.nickname
if nickname is None or nickname == "":
nickname = resp.email.split('@')[0]
user = User(nickname = nickname, email = resp.email, role = ROLE_USER)
db.session.add(user)
db.session.commit()
remember_me = False
if 'remember_me' in session:
remember_me = session['remember_me']
session.pop('remember_me', None)
login_user(user, remember = remember_me)
return redirect(request.args.get('next') or url_for('index'))

@app.route('/logout')
def logout():
logout_user()
return redirect(url_for('index'))

0 comments on commit 5ae5241

Please sign in to comment.