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%} |