· 8 years ago · May 11, 2017, 04:38 AM
1from flask import (Flask, g, render_template, flash, redirect, url_for,
2 abort)
3from flask.ext.bcrypt import check_password_hash
4from flask.ext.login import (LoginManager, login_user, logout_user,
5 login_required, current_user)
6from flask_mail import Message, Mail
7from itsdangerous import URLSafeTimedSerializer, BadSignature, SignatureExpired
8
9import forms
10import models
11
12
13app = Flask(__name__)
14mail = Mail(app)
15
16app.config.from_object('config.BaseConfig')
17
18
19def generate_serializer(secret_key=None):
20 return URLSafeTimedSerializer(app.config['SECRET_KEY'])
21
22
23def generate_activation_url(user):
24 serializer = generate_serializer()
25 token = serializer.dumps(user.username)
26 return url_for('activate_user', token=token, _external=True)
27
28
29@app.before_request
30def before_request():
31 """Connect to the database before each request."""
32 try:
33 g.db = models.db
34 g.db.connect()
35 g.user = current_user
36 except models.OperationalError:
37 pass
38
39
40@app.after_request
41def after_request(response):
42 """Close the database connection after each request."""
43 g.db.close()
44 return response
45
46
47@app.route('/', methods=('GET', 'POST'))
48def index():
49 form = forms.RegisterForm()
50 if form.validate_on_submit():
51 models.User.create_user(
52 username=form.username.data,
53 email=form.email.data,
54 password=form.password.data,
55 confirmed=False
56 )
57 token = generate_activation_url(models.User)
58 msg = Message(render_template('activation_email.html', token=token),
59 recipients=[models.User.email])
60 mail.send(msg)
61
62 return render_template('activate.html', user=models.User)
63 return render_template('index.html', form=form)
64
65
66@app.route('/activate/<token>')
67def activate_user(token, expiration=3600):
68 serializer = generate_serializer()
69 try:
70 user_id = serializer.loads(token, salt=app.config[
71 'SECRET_KEY'], max_age=expiration)
72 except (BadSignature, SignatureExpired):
73 abort(404)
74
75 models.User.confirmed = True
76 flash('User activated')
77 return redirect(url_for('index'))
78
79
80if __name__ == '__main__':
81 models.init()
82 app.run(debug=True, host='localhost', port=8000)