· 4 years ago · Aug 28, 2021, 05:12 PM
1from flask import Flask, redirect, Request
2from flask.helpers import url_for
3from flask.templating import render_template
4from flask_sqlalchemy import SQLAlchemy
5from flask_login import UserMixin, login_manager, login_user, LoginManager, login_required, logout_user, current_user
6from flask_wtf import FlaskForm
7from wtforms import StringField, PasswordField, SubmitField
8from wtforms.validators import InputRequired, Length, ValidationError
9from wtforms.widgets.core import SubmitInput
10from flask_bcrypt import Bcrypt
11
12app = Flask(__name__)
13
14#Configuration de la bdd
15
16
17app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:///users.db'
18app.config['SECRET_KEY'] = 'secret_key'
19app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = False
20
21db = SQLAlchemy(app)
22bcrypt = Bcrypt(app)
23
24
25# configuration du login
26
27
28login_manager = LoginManager()
29login_manager.init_app(app)
30login_manager.login_view = "access"
31
32
33@login_manager.user_loader
34def load_user(user_id):
35 return User.query.get(user_id)
36
37
38class User(db.Model, UserMixin):
39 id = db.Column(db.Integer, primary_key=True)
40 username = db.Column(db.String(20), nullable=False, unique=True)
41 password = db.Column(db.String(80), nullable=False)
42
43class RegisterForm(FlaskForm):
44 username = StringField(validators=[InputRequired(), Length(
45 min=4, max=20)], render_kw={"placeholder": "Pseudo"})
46 password = PasswordField(validators=[InputRequired(), Length(
47 min=4, max=20)], render_kw={"placeholder": "Mot de passe"})
48 submit = SubmitField("S'inscrire")
49
50 def validate_username(self, username):
51 existing_user_username = User.query.filter_by(username=username.data).first()
52 if existing_user_username:
53 raise ValidationError("Ce pseudo est deja pris, veuillez en sélectionner un autre !")
54
55class LoginForm(FlaskForm):
56 username = StringField(validators=[InputRequired(), Length(
57 min=4, max=20)], render_kw={"placeholder": "Pseudo"})
58 password = PasswordField(validators=[InputRequired(), Length(
59 min=4, max=20)], render_kw={"placeholder": "Mot de passe"})
60 submit = SubmitField("Se connecter")
61
62
63
64# routes
65
66@app.route('/', methods=['GET', 'POST'])
67@app.route('/access', methods=['GET', 'POST'])
68def access():
69 loginForm = LoginForm()
70 registerForm = RegisterForm()
71
72 if registerForm.validate_on_submit():
73 hashed_password = bcrypt.generate_password_hash(registerForm.password.data)
74 new_user = User(username=registerForm.username.data, password=hashed_password)
75 login_user(new_user)
76 db.session.add(new_user)
77 db.session.commit()
78 return redirect(url_for('dashboard'))
79
80 elif loginForm.validate_on_submit():
81 user = User.query.filter_by(username=loginForm.username.data).first()
82 if user and bcrypt.check_password_hash(user.password, loginForm.password.data):
83 login_user(user)
84 next_page = request.args.get('next')
85
86 if next_page:
87 return redirect(next_page)
88 return redirect(url_for('home'))
89
90 return render_template('access.html', loginform=loginForm, registerform=registerForm)
91
92@app.route('/home', methods=['GET', 'POST'])
93@login_required
94def home():
95 return render_template('home.html')
96
97@app.route('/dashboard', methods=['GET', 'POST'])
98@login_required
99def dashboard():
100 return render_template('dashboard.html')
101
102
103@app.route('/logout', methods=['GET', 'POST'])
104@login_required
105def logout():
106 logout_user()
107 return redirect(url_for('access'))
108
109@app.errorhandler(404)
110def page_not_found(error):
111 return render_template('404.html'), 404
112
113
114if __name__ == '__main__':
115 app.run(debug=True, host='0.0.0.0')