| FLASK_APP=app/__init__.py | FLASK_APP=app/__init__.py | ||||
| FLASK_RUN_HOST=0.0.0.0 | FLASK_RUN_HOST=0.0.0.0 | ||||
| FLASK_DEBUG=1 | FLASK_DEBUG=1 | ||||
| SITE_PASSWORD= | |||||
| SECRET_KEY= | |||||
| # Solr variables | # Solr variables | ||||
| # Hostname for Solr | # Hostname for Solr |
| # https://www.digitalocean.com/community/tutorials/how-to-add-authentication-to-your-app-with-flask-login | # https://www.digitalocean.com/community/tutorials/how-to-add-authentication-to-your-app-with-flask-login | ||||
| # Config stuff adapted from https://blog.miguelgrinberg.com/post/the-flask-mega-tutorial-part-iii-web-forms | # Config stuff adapted from https://blog.miguelgrinberg.com/post/the-flask-mega-tutorial-part-iii-web-forms | ||||
| from flask import Flask | |||||
| from flask import Flask, session | |||||
| from flask_moment import Moment | from flask_moment import Moment | ||||
| import os | import os | ||||
| def create_app(): | def create_app(): | ||||
| app = Flask(__name__) | app = Flask(__name__) | ||||
| # get the secret key so sessions work | |||||
| secret = os.getenv('SECRET_KEY') | |||||
| app.secret_key = secret | |||||
| moment.init_app(app) | moment.init_app(app) | ||||
| # blueprint for main parts of app (contents and frontmatter) | # blueprint for main parts of app (contents and frontmatter) |
| # @purpose: Main route for index page, contents, frontmatter, and other miscellaneous pages | # @purpose: Main route for index page, contents, frontmatter, and other miscellaneous pages | ||||
| # @acknowledgements: | # @acknowledgements: | ||||
| # https://www.digitalocean.com/community/tutorials/how-to-add-authentication-to-your-app-with-flask-login | # https://www.digitalocean.com/community/tutorials/how-to-add-authentication-to-your-app-with-flask-login | ||||
| # https://www.reddit.com/r/flask/comments/k1bvw4/password_protect_pages/ | |||||
| from flask import Blueprint, render_template | |||||
| from flask import Blueprint, render_template, session, request, redirect, url_for, flash | |||||
| import markdown | import markdown | ||||
| import os | |||||
| from functools import wraps | |||||
| main = Blueprint('main', __name__) | main = Blueprint('main', __name__) | ||||
| site_password = os.getenv('SITE_PASSWORD') | |||||
| # custom decorator to check password | |||||
| def check_pw(func): | |||||
| @wraps(func) | |||||
| def decorated_function(*args, **kwargs): | |||||
| status = session.get('status') | |||||
| if status != "good": | |||||
| return redirect(url_for('main.login')) | |||||
| return func(*args, **kwargs) | |||||
| return decorated_function | |||||
| # route for index page | # route for index page | ||||
| @main.route('/') | @main.route('/') | ||||
| @check_pw | |||||
| def index(): | def index(): | ||||
| return render_template('index.html') | return render_template('index.html') | ||||
| # route for site login page | |||||
| @main.route('/login', methods=['GET','POST']) | |||||
| def login(): | |||||
| if request.method == "POST": | |||||
| req = request.form | |||||
| password = req.get("password") | |||||
| if password != site_password: | |||||
| flash('wrong password! try again...') | |||||
| return redirect(request.url) | |||||
| session["status"] = 'good' | |||||
| return redirect(url_for("main.index")) | |||||
| return render_template('login.html') | |||||
| # route for table of contents page | # route for table of contents page | ||||
| @main.route('/contents/') | @main.route('/contents/') | ||||
| def contents(): | def contents(): |
| {% extends "base.html" %} | |||||
| {% block content %} | |||||
| <form action="/login" method="post"> | |||||
| <strong>Password:</strong><br> | |||||
| <input name='password' ><br><br> | |||||
| <input type="submit" value="Login"> | |||||
| </form> | |||||
| {% endblock %} | |||||
| {% block footer %} | |||||
| <footer class="footer p-3"> | |||||
| <div class="container info" style="display: none" > | |||||
| <span class="text-muted">© 2023 Julien McHardy & Kat Jungnickel, chapters by respective authors. Licensed under a <a href="http://creativecommons.org/licenses/by-nc-sa/4.0/">Creative Commons Attribution-NonCommercial-ShareAlike 4.0 International (CC BY-NC-SA 4.0)</a> license.</span> | |||||
| <span class="text-muted">Data from the <a href="https://www.politicsofpatents.org/">Politics of Patents</a> research project hosted at Goldsmiths, University of London, and funded by the European Research Council under the European Union’s Horizon 2020 research and innovation programme (#819458).</span> | |||||
| </div> | |||||
| </footer> | |||||
| {% endblock%} |