Skip to content
Extraits de code Groupes Projets
Valider adc7b9b7 rédigé par Loïc Wikle DUBARD's avatar Loïc Wikle DUBARD
Parcourir les fichiers

login+register page done

parent fbebe7ff
Aucune branche associée trouvée
Aucune étiquette associée trouvée
Aucune requête de fusion associée trouvée
Fichier ajouté
#!/usr/bin/python3 #!/usr/bin/python3
from flask import Flask, render_template, url_for from flask import Flask, render_template, url_for, flash, redirect
from flask_sqlalchemy import SQLAlchemy
import requests import requests
from forms import RegistrationForm, LoginForm
import asyncio import asyncio
from bs4 import BeautifulSoup as bs4 from bs4 import BeautifulSoup as bs4
app_name = "Climbing Coach" app_name = "Climbing Coach"
app = Flask(app_name) app = Flask(app_name)
app.config['SECRET_KEY'] = '6009555f5e50514b882adf5c6a42ea7b'
app.config['SQLALCHEMY_DATABASE_URI'] = "sqlite:///site.db"
db = SQLAlchemy(app)
class User(db.Model):
id = db.Column(db.Integer, primary_key=True)
username = db.Column(db.String(20), unique=True, nullable=False)
email = db.Column(db.String(120), unique=True, nullable=False)
image_file = db.Column(db.String(20), nullable=False, default='default.jpg')
password = db.Column(db.String(60), nullable=False)
posts = db.relationship('Post', backref='author', lazy=True)
def __repr__(self):
return f"User('{self.username}', '{self.email}', '{self.image_file}')"
def get_news(): def get_news():
r = requests.get("https://www.8a.nu/rss/Main.aspx?CountryCode=GLOBAL").content """ Parse le flux rss de 8a.nu """
r = requests.get(
"https://www.8a.nu/rss/Main.aspx?CountryCode=GLOBAL").content
soup = bs4(r, "html.parser") soup = bs4(r, "html.parser")
news = [{"title": e.title.text, "description": e.description.text, "date_posted": e.pubdate.text} for e in soup.find_all("item")] news = [{"title": e.title.text, "description": e.description.text,
"date_posted": e.pubdate.text.replace(" 00:00:00 GMT", "")
} for e in soup.find_all("item")]
# print(news) # print(news)
return news return news
...@@ -28,6 +49,41 @@ def about(): ...@@ -28,6 +49,41 @@ def about():
return render_template("about.html", title=app_name + " - About") return render_template("about.html", title=app_name + " - About")
@app.route("/register", methods=['GET', 'POST'])
def register():
form = RegistrationForm()
if form.validate_on_submit():
flash(f"Account created for { form.email.data } !", "success")
return redirect(url_for('home'))
return render_template('register.html',
title=app_name + " - Register", form=form)
@app.route("/login", methods=['GET', 'POST'])
def login():
form = LoginForm()
if form.validate_on_submit():
if form.email.data == "test@test.com" and form.password.data == "test":
# TODO: replace fake test login with database login
flash(f"You have been logged in !", "success")
return redirect(url_for('home'))
else:
flash(f"Login Unsuccessful. Please check username and password", "danger")
return render_template('login.html',
title=app_name + " - Login", form=form)
@app.route("/planning")
def planning():
return "TODO"
@app.route("/meteo")
def meteo():
return "TODO"
if __name__ == '__main__': if __name__ == '__main__':
# get_news() # get_news()
app.run(debug=True) app.run(debug=True)
from flask_wtf import FlaskForm
from wtforms import StringField, PasswordField, SubmitField, BooleanField
from wtforms.validators import DataRequired, Length, Email, EqualTo
class RegistrationForm(FlaskForm):
username = StringField('Username',
validators=[DataRequired(), Length(min=2, max=20)])
email = StringField('Email',
validators=[DataRequired(), Email()])
password = PasswordField('Password', validators=[DataRequired()])
confirm_password = PasswordField(
'Confirm Password',
validators=[DataRequired(), EqualTo('password')]
)
submit = SubmitField('Sign Up')
class LoginForm(FlaskForm):
email = StringField('Email',
validators=[DataRequired(), Email()])
password = PasswordField('Password', validators=[DataRequired()])
remember = BooleanField('Remember')
submit = SubmitField('Log In')
...@@ -3,4 +3,6 @@ flask ...@@ -3,4 +3,6 @@ flask
requests requests
fpdf fpdf
asyncio asyncio
beautifulsoup4 beautifulsoup4
\ No newline at end of file flask-wtf
flask-sqlalchemy
\ No newline at end of file
...@@ -22,15 +22,15 @@ ...@@ -22,15 +22,15 @@
</button> </button>
<div class="collapse navbar-collapse" id="navbarToggle"> <div class="collapse navbar-collapse" id="navbarToggle">
<div class="navbar-nav mr-auto"> <div class="navbar-nav mr-auto">
<a class="nav-item nav-link" href="/">Home</a> <a class="nav-item nav-link" href="{{ url_for('home') }}">Home</a>
<a class="nav-item nav-link" href="/planning">Planning</a> <a class="nav-item nav-link" href="{{ url_for('planning') }}">Planning</a>
<a class="nav-item nav-link" href="/meteo">Check the Weather</a> <a class="nav-item nav-link" href="{{ url_for('meteo') }}">Check the Weather</a>
<a class="nav-item nav-link" href="/about">About</a> <a class="nav-item nav-link" href="{{ url_for('about') }}">About</a>
</div> </div>
<!-- Navbar Right Side --> <!-- Navbar Right Side -->
<div class="navbar-nav"> <div class="navbar-nav">
<a class="nav-item nav-link" href="/login">Login</a> <a class="nav-item nav-link" href="{{ url_for('login') }}">Login</a>
<a class="nav-item nav-link" href="/register">Register</a> <a class="nav-item nav-link" href="{{ url_for('register') }}">Register</a>
</div> </div>
</div> </div>
</div> </div>
...@@ -40,6 +40,15 @@ ...@@ -40,6 +40,15 @@
<main role="main" class="container"> <main role="main" class="container">
<div class="row"> <div class="row">
<div class="col-md-8"> <div class="col-md-8">
{% with messages = get_flashed_messages(with_categories=true) %}
{% if messages %}
{% for category, message in messages %}
<div class="alert alert-{{ category }}">
{{ message }}
</div>
{% endfor %}
{% endif %}
{% endwith %}
{% block content %}{% endblock %} {% block content %}{% endblock %}
</div> </div>
<div class="col-md-8"> <div class="col-md-8">
......
{% extends "layout.html" %}
{% block content %}
<div class="content-section">
<form method="POST" action="">
{{ form.hidden_tag() }}
<fieldset class="form-group">
<legend class="border-bottom mb-4">Join Today</legend>
<div class="form-group">
{{ form.email.label(class="form-control-label") }}
{% if form.email.errors %}
{{ form.email(class="form-control form-control-lg is-invalid") }}
<div class="invalid-feedback">
{% for error in form.email.errors %}
<span>{{ error }} </span>
{% endfor %}
</div>
{% endif %}
{{ form.email(class="form-control form-control-lg") }}
</div>
<div class="form-group">
{{ form.password.label(class="form-control-label") }}
{% if form.password.errors %}
{{ form.password(class="form-control form-control-lg is-invalid") }}
<div class="invalid-feedback">
{% for error in form.password.errors %}
<span>{{ error }} </span>
{% endfor %}
</div>
{% endif %}
{{ form.password(class="form-control form-control-lg") }}
</div>
<div class="form-check">
{{ form.remember(class="form-check-input") }}
{{ form.remember.label(class="form-check-label") }}
</div>
</fieldset>
<div class="form-group">
{{ form.submit(class="btn btn-outline-info ") }}
</div>
<small class="text-muted ml-2">
<a href="#">Forgot Password ?</a>
</small>
</form>
</div>
<div class="border-top pt-3">
<small class="text-muted">
Need an account ? <a class="ml-2" href="{{ url_for('register') }}">Sign Up Now</a>
</small>
</div>
{% endblock content %}
\ No newline at end of file
{% extends "layout.html" %}
{% block content %}
<div class="content-section">
<form method="POST" action="">
{{ form.hidden_tag() }}
<fieldset class="form-group">
<legend class="border-bottom mb-4">Join Today</legend>
<div class="form-group">
{{ form.username.label(class="form-control-label") }}
{% if form.username.errors %}
{{ form.username(class="form-control form-control-lg is-invalid") }}
<div class="invalid-feedback">
{% for error in form.username.errors %}
<span>{{ error }} </span>
{% endfor %}
</div>
{% endif %}
{{ form.username(class="form-control form-control-lg") }}
</div>
<div class="form-group">
{{ form.email.label(class="form-control-label") }}
{% if form.email.errors %}
{{ form.email(class="form-control form-control-lg is-invalid") }}
<div class="invalid-feedback">
{% for error in form.email.errors %}
<span>{{ error }} </span>
{% endfor %}
</div>
{% endif %}
{{ form.email(class="form-control form-control-lg") }}
</div>
<div class="form-group">
{{ form.password.label(class="form-control-label") }}
{% if form.password.errors %}
{{ form.password(class="form-control form-control-lg is-invalid") }}
<div class="invalid-feedback">
{% for error in form.password.errors %}
<span>{{ error }} </span>
{% endfor %}
</div>
{% endif %}
{{ form.password(class="form-control form-control-lg") }}
</div>
<div class="form-group">
{{ form.confirm_password.label(class="form-control-label") }}
{% if form.confirm_password.errors %}
{{ form.confirm_password(class="form-control form-control-lg is-invalid") }}
<div class="invalid-feedback">
{% for error in form.confirm_password.errors %}
<span>{{ error }} </span>
{% endfor %}
</div>
{% endif %}
{{ form.confirm_password(class="form-control form-control-lg") }}
</div>
</fieldset>
<div class="form-group">
{{ form.submit(class="btn btn-outline-info ") }}
</div>
</form>
</div>
<div class="border-top pt-3">
<small class="text-muted">
Already have an account ? <a class="ml-2" href="{{ url_for('login') }}">Log In</a>
</small>
</div>
{% endblock content %}
\ No newline at end of file
0% Chargement en cours ou .
You are about to add 0 people to the discussion. Proceed with caution.
Terminez d'abord l'édition de ce message.
Veuillez vous inscrire ou vous pour commenter