mgt c10 checkpoint
This commit is contained in:
@ -5,6 +5,7 @@ from flask_migrate import Migrate
|
||||
from flask_login import LoginManager
|
||||
import logging, sys
|
||||
from logging.handlers import SMTPHandler
|
||||
from flask_mail import Mail
|
||||
|
||||
app = Flask(__name__)
|
||||
app.config.from_object(Config)
|
||||
@ -12,6 +13,7 @@ db = SQLAlchemy(app)
|
||||
migrate = Migrate(app, db)
|
||||
login = LoginManager(app)
|
||||
login.login_view = 'login'
|
||||
mail=Mail(app)
|
||||
|
||||
if not app.debug:
|
||||
if app.config['MAIL_SERVER']:
|
||||
|
9
backend/app/email.py
Normal file
9
backend/app/email.py
Normal file
@ -0,0 +1,9 @@
|
||||
from flask_mail import Message
|
||||
from app import mail
|
||||
|
||||
def send_email(subject, sender, recipients, text_body, html_body):
|
||||
msg = Message(subject, sender=sender, recipients=recipients)
|
||||
msg.body = text_body
|
||||
msg.html = html_body
|
||||
mail.send(msg)
|
||||
|
@ -43,6 +43,10 @@ class EditProfileForm(FlaskForm):
|
||||
if user is not None:
|
||||
raise ValidationError('Please use a different username.')
|
||||
|
||||
class ResetPasswordRequestForm(FlaskForm):
|
||||
email = StringField('Email', validators=[DataRequired(), Email()])
|
||||
submit = SubmitField('Request Password Reset')
|
||||
|
||||
class PostForm(FlaskForm):
|
||||
post = TextAreaField('Post:', validators=[DataRequired(), Length(min=1, max=140)])
|
||||
submit = SubmitField('Submit')
|
||||
|
@ -5,8 +5,9 @@ from datetime import datetime, timezone
|
||||
import sqlalchemy as sa
|
||||
|
||||
from app import app, db
|
||||
from app.forms import LoginForm, RegistrationForm, EditProfileForm, EmptyForm, PostForm
|
||||
from app.forms import LoginForm, RegistrationForm, EditProfileForm, EmptyForm, PostForm, ResetPasswordRequestForm
|
||||
from app.models import User, Post
|
||||
#from app.email import send_password_reset_email
|
||||
|
||||
@app.before_request
|
||||
def before_request():
|
||||
@ -149,4 +150,17 @@ def unfollow(username):
|
||||
else:
|
||||
return redirect(url_for('index'))
|
||||
|
||||
@app.route('/reset_password_request', methods=['GET', 'POST'])
|
||||
def reset_password_request():
|
||||
if current_user.is_authenticated:
|
||||
return redirect(url_for('index'))
|
||||
form = ResetPasswordRequestForm()
|
||||
if form.validate_on_submit():
|
||||
user = db.session.scalar(sa.select(User).where(User.email == form.email.data))
|
||||
if user:
|
||||
send_password_reset_email(user)
|
||||
flash('Password reset sent.')
|
||||
return redirect(url_for('login'))
|
||||
return render_template('reset_password_request.html', title='Reset Password', form=form)
|
||||
|
||||
|
||||
|
@ -23,6 +23,7 @@
|
||||
</form>
|
||||
|
||||
<p><a href="{{ url_for('register') }}">Register Here</a></p>
|
||||
<p><a href="{{ url_for('reset_password_request') }}">Reset Password</a></p>
|
||||
|
||||
|
||||
{% endblock %}
|
||||
|
17
backend/app/templates/reset_password_request.html
Normal file
17
backend/app/templates/reset_password_request.html
Normal file
@ -0,0 +1,17 @@
|
||||
{% extends "base.html" %}
|
||||
|
||||
{% block content %}
|
||||
<h1>Reset Password</h1>
|
||||
<form action="" method="post">
|
||||
{{ form.hidden_tag() }}
|
||||
<p>
|
||||
{{ form.email.label }}<br>
|
||||
{{ form.email(size=64) }}<br>
|
||||
{% for error in form.email.errors %}
|
||||
<span style="color: red;">[{{ error }}]</span>
|
||||
{% endfor %}
|
||||
</p>
|
||||
<p>{{ form.submit() }}</p>
|
||||
</form>
|
||||
|
||||
{% endblock %}
|
Reference in New Issue
Block a user