diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md deleted file mode 100644 index 86f3608..0000000 --- a/CONTRIBUTING.md +++ /dev/null @@ -1,3 +0,0 @@ -Merge requests and issues are welcome. - -Merge requests must be targeted at issues, with each merge request including a line (or multiple) "Closes #" in it. If a merge request doesn't close an issue, consider raising an issue before submitting the MR. diff --git a/README.md b/README.md index 21131b6..c8e668f 100644 --- a/README.md +++ b/README.md @@ -1,29 +1,16 @@ ## Development From the root directory, run `pip install -r requirements.txt` to install the package (and all dependencies) in editable mode. -Use `gunicorn -w 2 'flaskr:create_app()'` to run app. Increase the number of workers using the `-w` argument if desired. The package will be updated as you edit files. +Use `flask --app flaskr run` to run app. The package will be updated as you edit files. ## Production Run `python -m build --wheel` to generate the wheel, and install the wheel (found in `dist/`) in the production environment. -Use `gunicorn -w 2 'flaskr:create_app()'` to run app. Increase the number of workers using the `-w` argument if desired. To update package, you will need to install a new wheel. +Use `flask --app flaskr run` to run app. To update package, you will need to install a new wheel. ## Initializing database The first time you install the app in each environment, you need to initialize database using `flask --app flaskr init-db`. This only needs to be run once per environment, and **will delete existing database if run again**. -## Config file - -The config file is located at `/var/flaskr-instance/config.py` in production, and in `instance/` in development. The instance folder is created when the database is initialized. - -### Secret Key +## Secret key Every website with login needs a secret key to hash passwords with. -The config file must contain a line `SECRET_KEY = '`, which must be randomly generated. +`/var/flaskr-instance/config.py` must contain a line `SECRET_KEY = '`, which must be randomly generated. Suggested way of generating the key is `python -c 'import secrets; print(secrets.token_hex())'`, which returns a hexadecimal string with length 64. You may choose to randomly generate a key using a different method, but ensure that it is resistant to brute-force attacks. - -### Registration -Since this blog is meant to be updated by a limited number of people, registration is forbidden (403) by default. In addition, registration (/auth/register) and login (/auth/login) URLs are not hyperlinked anywhere. Registration can be opened by including `REGISTER = True`, and is closed by default. - -### Name -The default app name is "Flaskr", and it is visible on the header bar as well as the page title. Including a line `NAME = ''` in the config file replaces "Flaskr" with your chosen name. - -### Static folder -The default static folder is the one included in the repository. You can use a separate static folder to use your own assets by including a line `STATIC_FOLDER = ''` in the config file. diff --git a/flaskr/__init__.py b/flaskr/__init__.py index efa74c8..bf080a1 100644 --- a/flaskr/__init__.py +++ b/flaskr/__init__.py @@ -1,6 +1,5 @@ import os from flask import Flask -from werkzeug.middleware.proxy_fix import ProxyFix def create_app(test_config=None): # create and configure the app @@ -8,12 +7,6 @@ def create_app(test_config=None): app.config.from_mapping( SECRET_KEY='dev', DATABASE=os.path.join(app.instance_path, 'flaskr.sqlite'), - REGISTER=False, - NAME='Flaskr' - ) - - app.wsgi_app = ProxyFix( - app.wsgi_app, x_for=1, x_proto=1, x_host=1, x_prefix=1 ) if test_config is None: @@ -23,9 +16,6 @@ def create_app(test_config=None): # load the test config if passed in app.config.from_mapping(test_config) - if app.config.get('STATIC_FOLDER') is not None: - app.static_folder = app.config.get('STATIC_FOLDER') - # ensure the instance folder exists try: os.makedirs(app.instance_path) diff --git a/flaskr/auth.py b/flaskr/auth.py index f76418e..e41998c 100644 --- a/flaskr/auth.py +++ b/flaskr/auth.py @@ -1,7 +1,7 @@ import functools from flask import ( - Blueprint, flash, g, redirect, render_template, request, session, url_for, current_app, abort + Blueprint, flash, g, redirect, render_template, request, session, url_for ) from werkzeug.security import check_password_hash, generate_password_hash @@ -11,8 +11,6 @@ bp = Blueprint('auth', __name__, url_prefix='/auth') @bp.route('/register', methods=('GET', 'POST')) def register(): - if not current_app.config['REGISTER']: - abort(403) if request.method == 'POST': username = request.form['username'] password = request.form['password'] diff --git a/flaskr/blog.py b/flaskr/blog.py index ec37df5..cfa78d8 100644 --- a/flaskr/blog.py +++ b/flaskr/blog.py @@ -66,13 +66,6 @@ def get_post(id, check_author=True): return post -@bp.route('/') -def post(id): - post = get_post(id, check_author=False) - post = dict(post) - post['body'] = markdown.markdown(post['body']) - return render_template('blog/post.html', post=post) - @bp.route('//update', methods=('GET', 'POST')) @login_required def update(id): @@ -108,7 +101,3 @@ def delete(id): db.execute('DELETE FROM post WHERE id = ?',(id,)) db.commit() return redirect(url_for('blog.index')) - -@bp.route('/temp') -def temp(): - return render_template('temp.html') diff --git a/flaskr/templates/base.html b/flaskr/templates/base.html index b06559b..a2c26cd 100644 --- a/flaskr/templates/base.html +++ b/flaskr/templates/base.html @@ -1,19 +1,19 @@ -{% block title %}{% endblock %} - {{ config['NAME'] }} +{% block title %}{% endblock %} - Flaskr -
-
-
{% block header %}{% endblock %} diff --git a/flaskr/templates/blog/index.html b/flaskr/templates/blog/index.html index d5a9167..ffd9fbc 100644 --- a/flaskr/templates/blog/index.html +++ b/flaskr/templates/blog/index.html @@ -12,13 +12,14 @@
-

{{ post['title'] }}

+

{{ post['title'] }}

by {{ post['username'] }} on {{ post['created'].strftime('%Y-%m-%d') }}
{% if g.user['id'] == post['author_id'] %} - Edit - {% endif %} + Edit + {% endif %}
+

{{ post['body']|safe }}

{% if not loop.last %}
diff --git a/flaskr/templates/blog/post.html b/flaskr/templates/blog/post.html deleted file mode 100644 index 701a37f..0000000 --- a/flaskr/templates/blog/post.html +++ /dev/null @@ -1,20 +0,0 @@ -{% extends 'base.html' %} - -{% block header %} -

{% block title %}{{ post['title']}}{% endblock %}

-{% endblock %} - -{% block content %} -
-
-
-

{{ post['title'] }}

-
by {{ post['username'] }} on {{ post['created'].strftime('%Y-%m-%d') }}
-
- {% if g.user['id'] == post['author_id'] %} - Edit - {% endif %} -
-

{{ post['body']|safe }}

-
-{% endblock %} diff --git a/requirements.txt b/requirements.txt index 0e3f2aa..bd6b9c1 100644 --- a/requirements.txt +++ b/requirements.txt @@ -8,8 +8,7 @@ dnspython==2.3.0 email-validator==2.0.0.post2 exceptiongroup==1.1.1 Flask==2.3.2 --e git+https://gitlab.com/pvtejas/based4tech.git@bda624e4dc1cf97ba2b5b3fcb66a5b28398307bc#egg=flaskr -gunicorn==20.1.0 +-e git+https://gitlab.com/pvtejas/based4tech.git@3518f50f67c913274f78e2c4b91fe9b7e052ac0d#egg=flaskr h11==0.14.0 httpcore==0.17.0 httptools==0.5.0