From d7a0167cd6148cfa4a46b4a562fd00112f74fbe2 Mon Sep 17 00:00:00 2001 From: finn Date: Sat, 3 Aug 2024 11:45:37 -0700 Subject: [PATCH] mgt c7 finish --- backend/.flaskenv | 2 +- backend/Dockerfile | 2 +- backend/README.md | 3 +++ backend/app/__init__.py | 22 +++++++++++++++++++++- backend/app/forms.py | 14 ++++++++++++++ backend/app/routes.py | 4 +++- backend/config.py | 10 +++++++--- backend/requirements.txt | 1 + compose.yaml | 1 + compose.yaml.local | 2 ++ compose.yaml.prod | 4 +++- 11 files changed, 57 insertions(+), 8 deletions(-) diff --git a/backend/.flaskenv b/backend/.flaskenv index 0366019..b85b65f 100644 --- a/backend/.flaskenv +++ b/backend/.flaskenv @@ -1,3 +1,3 @@ FLASK_APP=microblog.py -FLASK_DEBUG=0 +FLASK_DEBUG=1 diff --git a/backend/Dockerfile b/backend/Dockerfile index 515a508..fdeff17 100755 --- a/backend/Dockerfile +++ b/backend/Dockerfile @@ -11,7 +11,7 @@ RUN target=/root/.cache/pip \ # Need to make this explicit as part of expansion, no migrations or venv COPY . . -#ENV FLASK_APP app.py +ENV FLASK_APP microblog.py # This might be scary to leave on #ENV FLASK_ENV development diff --git a/backend/README.md b/backend/README.md index 4d452c0..f2511f1 100644 --- a/backend/README.md +++ b/backend/README.md @@ -54,6 +54,9 @@ Dockerfile needs dockerignore or preferably explicitly defined copies for: - requirements - not dotflaskenv, vars set with dockerfile +## docker setup: +- py logger handler StreamHandler is buggy to the point of being useless. Use logfile and link to stdout in Docker build + ## notes: - compose has entry that overrides flask with uwsgi for prod - miminal environment vars come through project env, pass through compose diff --git a/backend/app/__init__.py b/backend/app/__init__.py index 52c9951..3cac71a 100644 --- a/backend/app/__init__.py +++ b/backend/app/__init__.py @@ -3,7 +3,7 @@ from config import Config from flask_sqlalchemy import SQLAlchemy from flask_migrate import Migrate from flask_login import LoginManager -import logging +import logging, sys from logging.handlers import SMTPHandler app = Flask(__name__) @@ -13,5 +13,25 @@ migrate = Migrate(app, db) login = LoginManager(app) login.login_view = 'login' +if not app.debug: + if app.config['MAIL_SERVER']: + auth = None + secure = None + mail_handler = SMTPHandler( + mailhost=(app.config['MAIL_SERVER'], app.config['MAIL_PORT']), + fromaddr=app.config['FROM_ADDRESS'], + toaddrs=app.config['ADMINS'], subject='MB failure.', + credentials=auth, secure=secure) + mail_handler.setLevel(logging.ERROR) + app.logger.addHandler(mail_handler) + + if app.config['DC_LOGGING']: + print('#################### DEBUGHERE', file=sys.stderr) + dclog = logging.StreamHandler(stream=sys.stderr) + dclog.setLevel(logging.INFO) + dclog.propagate = False + app.logger.addHandler(dclog) + + from app import routes, models, errors diff --git a/backend/app/forms.py b/backend/app/forms.py index bcd5720..21dadf7 100644 --- a/backend/app/forms.py +++ b/backend/app/forms.py @@ -32,3 +32,17 @@ class EditProfileForm(FlaskForm): username = StringField('Username', validators=[DataRequired()]) about_me = TextAreaField('About me', validators=[Length(min=0, max=140)]) submit = SubmitField('Update') + + def __init__(self, original_username, *args, **kwargs): + super().__init__(*args, **kwargs) + self.original_username = original_username + + def validate_username(self, username): + if username.data != self.original_username: + user = db.session.scalar(sa.select(User).where(User.username == username.data)) + if user is not None: + raise ValidationError('Please use a different username.') + + + + diff --git a/backend/app/routes.py b/backend/app/routes.py index 666d7aa..e3723b1 100644 --- a/backend/app/routes.py +++ b/backend/app/routes.py @@ -18,6 +18,7 @@ def before_request(): @app.route('/index') @login_required def index(): + app.logger.info("AAAAAAAAAAAAAAAAAAAAA") user = {'username': 'Finnaa'} posts = [ @@ -74,6 +75,7 @@ def register(): @login_required def user(username): user = db.first_or_404(sa.select(User).where(User.username == username)) + #app.logger.info('PROFILE DEBUG ###############################') posts = [ {'author': user, 'body': 'Test1'}, {'author': user, 'body': 'Test2?'} @@ -83,7 +85,7 @@ def user(username): @app.route('/edit_profile', methods=['GET', 'POST']) @login_required def edit_profile(): - form = EditProfileForm() + form = EditProfileForm(current_user.username) if form.validate_on_submit(): current_user.username = form.username.data current_user.about_me = form.about_me.data diff --git a/backend/config.py b/backend/config.py index b2449f9..e1efeb1 100644 --- a/backend/config.py +++ b/backend/config.py @@ -5,14 +5,18 @@ basedir = os.path.abspath(os.path.dirname(__file__)) class Config: SECRET_KEY = os.environ.get('FLASK_SECRET_KEY') or 'flasksk' - #SQLALCHEMY_DATABASE_URI = 'sqlite:///' + os.path.join(basedir, 'zapp.db') - SQLALCHEMY_DATABASE_URI = 'mariadb+mariadbconnector://flasku:' + os.environ.get('MYSQL_PASSWORD') + '@db:3306/flask' + SQLALCHEMY_DATABASE_URI = 'sqlite:///' + os.path.join(basedir, 'zapp.db') + #SQLALCHEMY_DATABASE_URI = 'mariadb+mariadbconnector://flasku:' + os.environ.get('MYSQL_PASSWORD') + '@db:3306/flask' - MAIL_SERVER = 'pmb' + #MAIL_SERVER = 'pmb' + MAIL_SERVER = '' MAIL_PORT = 25 MAIL_USE_TLS = False MAIL_USERNAME = '' MAIL_PASSWORD = '' ADMINS = [os.environ.get('ADMIN_EMAIL')] + FROM_ADDRESS = os.environ.get('FROM_ADDRESS') + DC_LOGGING = True + diff --git a/backend/requirements.txt b/backend/requirements.txt index 1576f58..5df5030 100644 --- a/backend/requirements.txt +++ b/backend/requirements.txt @@ -21,4 +21,5 @@ SQLAlchemy==2.0.31 typing_extensions==4.12.2 Werkzeug==3.0.3 WTForms==3.1.2 +uwsgi mariadb diff --git a/compose.yaml b/compose.yaml index f7b45ba..e0f2c61 100644 --- a/compose.yaml +++ b/compose.yaml @@ -38,6 +38,7 @@ services: - TOKEN_I=${DOTENV_TOKEN_I} - TOKEN_C=${DOTENV_TOKEN_C} - ADMIN_EMAIL=${ADMIN_EMAIL} + - FROM_ADDRESS=${GITEA_MAIL_FROM} #ports: # - 8000:8000 expose: diff --git a/compose.yaml.local b/compose.yaml.local index 7ceb7ff..e0f2c61 100644 --- a/compose.yaml.local +++ b/compose.yaml.local @@ -37,6 +37,8 @@ services: - MYSQL_PASSWORD=${DOTENV_MYSQL_FLASK_PASSWORD} - TOKEN_I=${DOTENV_TOKEN_I} - TOKEN_C=${DOTENV_TOKEN_C} + - ADMIN_EMAIL=${ADMIN_EMAIL} + - FROM_ADDRESS=${GITEA_MAIL_FROM} #ports: # - 8000:8000 expose: diff --git a/compose.yaml.prod b/compose.yaml.prod index e62cf90..f1ab81f 100644 --- a/compose.yaml.prod +++ b/compose.yaml.prod @@ -3,7 +3,7 @@ services: image: mariadb:lts restart: always healthcheck: - #10-focal test: ['CMD-SHELL', 'mysqladmin ping -h 127.0.0.1 --password="${DOTENV_MYSQL_ROOT_PASSWORD}" --silent'] + #test: ['CMD-SHELL', 'mysqladmin ping -h 127.0.0.1 --password="${DOTENV_MYSQL_ROOT_PASSWORD}" --silent'] test: ['CMD', 'healthcheck.sh', '--connect', '--innodb_initialized'] interval: 10s retries: 5 @@ -37,6 +37,8 @@ services: - MYSQL_PASSWORD=${DOTENV_MYSQL_FLASK_PASSWORD} - TOKEN_I=${DOTENV_TOKEN_I} - TOKEN_C=${DOTENV_TOKEN_C} + - ADMIN_EMAIL=${ADMIN_EMAIL} + - FROM_ADDRESS=${GITEA_MAIL_FROM} #ports: # - 8000:8000 expose: