| @@ -4,6 +4,8 @@ | |||
| FLASK_APP=app/__init__.py | |||
| FLASK_RUN_HOST=0.0.0.0 | |||
| FLASK_DEBUG=1 | |||
| SITE_PASSWORD= | |||
| SECRET_KEY= | |||
| # Solr variables | |||
| # Hostname for Solr | |||
| @@ -7,7 +7,7 @@ | |||
| # 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 | |||
| from flask import Flask | |||
| from flask import Flask, session | |||
| from flask_moment import Moment | |||
| import os | |||
| @@ -17,6 +17,10 @@ moment = Moment() | |||
| def create_app(): | |||
| app = Flask(__name__) | |||
| # get the secret key so sessions work | |||
| secret = os.getenv('SECRET_KEY') | |||
| app.secret_key = secret | |||
| moment.init_app(app) | |||
| # blueprint for main parts of app (contents and frontmatter) | |||
| @@ -5,17 +5,50 @@ | |||
| # @purpose: Main route for index page, contents, frontmatter, and other miscellaneous pages | |||
| # @acknowledgements: | |||
| # 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 os | |||
| from functools import wraps | |||
| 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 | |||
| @main.route('/') | |||
| @check_pw | |||
| def index(): | |||
| 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 | |||
| @main.route('/contents/') | |||
| def contents(): | |||
| @@ -0,0 +1,20 @@ | |||
| {% 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%} | |||