* automatically load all routes * local configuration * rename public to static directory * wip: add basic login page * route based on filename * page name based on route * add login button * add dummy icon
This commit is contained in:
parent
76f77fdadd
commit
236fd36219
12 changed files with 115 additions and 21 deletions
16
src/app.py
16
src/app.py
|
@ -1,7 +1,11 @@
|
||||||
from flask import Flask
|
from glob import glob
|
||||||
from routes.index import router as index
|
|
||||||
from routes.read import router as read
|
|
||||||
|
|
||||||
app = Flask(__name__, static_url_path="/", static_folder="public")
|
from flask import Flask
|
||||||
app.register_blueprint(index, url_prefix="/")
|
|
||||||
app.register_blueprint(read, url_prefix="/read")
|
app = Flask(__name__, static_url_path="/")
|
||||||
|
|
||||||
|
# Import all routes
|
||||||
|
for file in glob("src/routes/*.py"):
|
||||||
|
module = file.replace("/", ".").split(".")[-2]
|
||||||
|
exec(f"from routes.{module} import router as {module}")
|
||||||
|
exec(f"app.register_blueprint({module})")
|
||||||
|
|
22
src/config.py
Normal file
22
src/config.py
Normal file
|
@ -0,0 +1,22 @@
|
||||||
|
from os import environ as envar
|
||||||
|
|
||||||
|
VAR_USERNAME = "TD_USERNAME"
|
||||||
|
|
||||||
|
|
||||||
|
class User:
|
||||||
|
"""user informations"""
|
||||||
|
|
||||||
|
name = envar[VAR_USERNAME] if VAR_USERNAME in envar else None
|
||||||
|
|
||||||
|
|
||||||
|
class Config:
|
||||||
|
"""app configuration"""
|
||||||
|
|
||||||
|
# App name
|
||||||
|
name = "txtdiary"
|
||||||
|
|
||||||
|
# App description
|
||||||
|
description = "Personal diary page"
|
||||||
|
|
||||||
|
# User
|
||||||
|
user = User
|
|
@ -1,3 +0,0 @@
|
||||||
html {
|
|
||||||
font-family: "Courier New", Courier, monospace;
|
|
||||||
}
|
|
|
@ -2,12 +2,14 @@
|
||||||
Index page with a list of posts.
|
Index page with a list of posts.
|
||||||
"""
|
"""
|
||||||
|
|
||||||
|
from config import Config
|
||||||
from flask import Blueprint, render_template
|
from flask import Blueprint, render_template
|
||||||
|
|
||||||
router = Blueprint("index", __name__)
|
name = __name__.split(".")[-1]
|
||||||
|
router = Blueprint(name, __name__)
|
||||||
|
|
||||||
|
|
||||||
@router.route("")
|
@router.route("/")
|
||||||
def index() -> str:
|
def index() -> str:
|
||||||
"""Index page"""
|
"""Index page"""
|
||||||
return render_template("index.html")
|
return render_template("index.html", config=Config, page_name=name)
|
||||||
|
|
22
src/routes/login.py
Normal file
22
src/routes/login.py
Normal file
|
@ -0,0 +1,22 @@
|
||||||
|
"""
|
||||||
|
Login page to an account.
|
||||||
|
"""
|
||||||
|
|
||||||
|
from config import Config
|
||||||
|
from flask import Blueprint, jsonify, render_template
|
||||||
|
from werkzeug import Response
|
||||||
|
|
||||||
|
name = __name__.split(".")[-1]
|
||||||
|
router = Blueprint(name, __name__)
|
||||||
|
|
||||||
|
|
||||||
|
@router.route(f"/{name}")
|
||||||
|
def login() -> str:
|
||||||
|
"""Login page"""
|
||||||
|
return render_template("login.html", config=Config, page_name=name)
|
||||||
|
|
||||||
|
|
||||||
|
@router.route(f"/{name}", methods=["POST"])
|
||||||
|
def check() -> Response:
|
||||||
|
"""Login logic"""
|
||||||
|
return jsonify("{}")
|
|
@ -2,12 +2,14 @@
|
||||||
Read a specific post.
|
Read a specific post.
|
||||||
"""
|
"""
|
||||||
|
|
||||||
|
from config import Config
|
||||||
from flask import Blueprint, render_template
|
from flask import Blueprint, render_template
|
||||||
|
|
||||||
router = Blueprint("read", __name__)
|
name = __name__.split(".")[-1]
|
||||||
|
router = Blueprint(name, __name__)
|
||||||
|
|
||||||
|
|
||||||
@router.route("")
|
@router.route(f"/{name}")
|
||||||
def read() -> str:
|
def read() -> str:
|
||||||
"""Read page"""
|
"""Read page"""
|
||||||
return render_template("read.html")
|
return render_template("read.html", config=Config, page_name=name)
|
||||||
|
|
15
src/static/css/style.css
Normal file
15
src/static/css/style.css
Normal file
|
@ -0,0 +1,15 @@
|
||||||
|
html {
|
||||||
|
font-family: "Courier New", Courier, monospace;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Align title with button */
|
||||||
|
header {
|
||||||
|
display: flex;
|
||||||
|
align-items: center;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* SVG centered on the line */
|
||||||
|
header svg {
|
||||||
|
margin-left: 0.5em;
|
||||||
|
vertical-align: middle;
|
||||||
|
}
|
|
@ -2,11 +2,17 @@
|
||||||
<meta http-equiv="X-UA-Compatible" content="IE=edge" />
|
<meta http-equiv="X-UA-Compatible" content="IE=edge" />
|
||||||
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
|
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
|
||||||
|
|
||||||
<meta name="title" content="txtdiary" />
|
<meta name="title" content="{{ page_name }}" />
|
||||||
|
<meta name="description" content="{{ config.description }}" />
|
||||||
|
|
||||||
<meta property="og:title" content="txtdiary" />
|
<meta property="og:title" content="{{ page_name }}" />
|
||||||
|
<meta property="og:description" content="{{ config.description }}" />
|
||||||
<meta property="og:type" content="website" />
|
<meta property="og:type" content="website" />
|
||||||
|
|
||||||
<meta property="twitter:title" content="txtdiary" />
|
<meta property="twitter:title" content="{{ page_name }}" />
|
||||||
|
<meta property="twitter:description" content="{{ config.description }}" />
|
||||||
|
|
||||||
|
<link rel="icon" href="data:," />
|
||||||
<link rel="stylesheet" href="/css/style.css" />
|
<link rel="stylesheet" href="/css/style.css" />
|
||||||
|
|
||||||
|
<title>{{ page_name }} - {{ config.name }}</title>
|
||||||
|
|
|
@ -1 +1,12 @@
|
||||||
<header></header>
|
<header>
|
||||||
|
<h1>txtdiary{{ " of " + config.user.name if config.user.name else "" }}</h1>
|
||||||
|
<form action="/login" method="post">
|
||||||
|
<a href="/login">
|
||||||
|
<svg width="30px" fill="none" viewBox="0 0 24 24">
|
||||||
|
<path
|
||||||
|
stroke="#000"
|
||||||
|
d="M5 21a7 7 0 1 1 14 0M16 7a4 4 0 1 1-8 0 4 4 0 0 1 8 0Z"
|
||||||
|
/></svg
|
||||||
|
></a>
|
||||||
|
</form>
|
||||||
|
</header>
|
||||||
|
|
|
@ -2,7 +2,6 @@
|
||||||
<html lang="en">
|
<html lang="en">
|
||||||
<head>
|
<head>
|
||||||
{% include "head.html" %}
|
{% include "head.html" %}
|
||||||
<title>Index</title>
|
|
||||||
</head>
|
</head>
|
||||||
<!-- TODO: icon of login in -->
|
<!-- TODO: icon of login in -->
|
||||||
{% include "header.html" %}
|
{% include "header.html" %}
|
||||||
|
|
15
src/templates/login.html
Normal file
15
src/templates/login.html
Normal file
|
@ -0,0 +1,15 @@
|
||||||
|
<!DOCTYPE html>
|
||||||
|
<html lang="en">
|
||||||
|
<head>
|
||||||
|
{% include "head.html" %}
|
||||||
|
</head>
|
||||||
|
{% include "header.html" %}
|
||||||
|
<body>
|
||||||
|
<p>Welcome to the login page</p>
|
||||||
|
|
||||||
|
<!-- TODO: Form -->
|
||||||
|
<form action="/login" method="post">
|
||||||
|
<button type="submit">Se connecter</button>
|
||||||
|
</form>
|
||||||
|
</body>
|
||||||
|
</html>
|
|
@ -2,7 +2,6 @@
|
||||||
<html lang="en">
|
<html lang="en">
|
||||||
<head>
|
<head>
|
||||||
{% include "head.html" %}
|
{% include "head.html" %}
|
||||||
<title>Read</title>
|
|
||||||
</head>
|
</head>
|
||||||
{% include "header.html" %}
|
{% include "header.html" %}
|
||||||
<body>
|
<body>
|
||||||
|
|
Loading…
Reference in a new issue