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