control 3 роки тому
коміт
46ac40cfb6
9 змінених файлів з 177 додано та 0 видалено
  1. 11 0
      Pipfile
  2. 42 0
      app/__init__.py
  3. BIN
      app/__pycache__/__init__.cpython-39.pyc
  4. BIN
      app/database.db
  5. 14 0
      app/logic.py
  6. 10 0
      app/models.py
  7. 87 0
      app/templates/base.html
  8. 7 0
      app/templates/home.html
  9. 6 0
      main.py

+ 11 - 0
Pipfile

@@ -0,0 +1,11 @@
+[[source]]
+url = "https://pypi.org/simple"
+verify_ssl = true
+name = "pypi"
+
+[packages]
+
+[dev-packages]
+
+[requires]
+python_version = "3.9"

+ 42 - 0
app/__init__.py

@@ -0,0 +1,42 @@
+from flask import Flask
+from flask_sqlalchemy import SQLAlchemy
+from flask_login import LoginManager # Flask Login
+from os import path
+
+db = SQLAlchemy()
+DB_NAME = "database.db"
+
+def create_app():
+    app = Flask(__name__)
+    app.config['SECRET_KEY'] = 'Th15_iS-M1!S3cre4' # used to encrypt session cookies
+    app.config['SQLALCHEMY_DATABASE_URI'] = f'sqlite:///{DB_NAME}'
+    db.init_app(app)
+
+    # import blueprints
+    from .logic import logic 
+
+    # register blueprints
+    app.register_blueprint(logic, url_prefix  = '/') # allows the setting of prefixes for pages
+
+    # import Database models
+    from .models import User
+
+    create_database(app)
+
+    login_manager = LoginManager()
+    # redirect here if not logged in
+    login_manager.login_view =  'logic.profile' ##'logic.login' 
+    login_manager.init_app(app)
+
+    @login_manager.user_loader
+    # tells flask how to load a user from the db
+    def load_user(id):
+        return User.query.get(int(id)) # by default get() looks for the primary key
+
+    return app
+
+
+def create_database(app):
+    if not path.exists('app/' + DB_NAME):
+        db.create_all(app=app)
+        print('Created Database!')

BIN
app/__pycache__/__init__.cpython-39.pyc


BIN
app/database.db


+ 14 - 0
app/logic.py

@@ -0,0 +1,14 @@
+# Site Back-End Logic
+from hmac import new
+from flask import Blueprint, render_template, request, flash, redirect, url_for
+from flask_login import login_user, login_required, logout_user, current_user
+from werkzeug.security import generate_password_hash, check_password_hash
+from .models import User
+from . import db
+import string, secrets
+
+logic = Blueprint('logic', __name__)
+
+@logic.route('/', methods=['GET'])
+def profile():
+    return render_template('home.html', user=current_user)

+ 10 - 0
app/models.py

@@ -0,0 +1,10 @@
+# Database Models
+from . import db # that SQLAlchemy Object in __init__.py
+from flask_login import UserMixin
+from sqlalchemy.sql import func
+
+class User(db.Model, UserMixin): # User Database
+   id = db.Column(db.Integer, primary_key=True)
+   email = db.Column(db.String(150), unique=True)
+   password = db.Column(db.String(150))
+   username = db.Column(db.String(150))

+ 87 - 0
app/templates/base.html

@@ -0,0 +1,87 @@
+<!DOCTYPE html>
+<html>
+    <head>
+        <meta charset="utf-8" />
+        <meta name="viewport" content="width=device-width, initial-scale=1">
+        <link
+            rel="stylesheet"
+            href="https://stackpath.bootstrapcdn.com/bootstrap/4.4.1/css/bootstrap.min.css"
+            integrity="sha384-Vkoo8x4CGsO3+Hhxv8T/Q5PaXtkKtu6ug5TOeNV6gBiFeWPGFN9MuhOf23Q9Ifjh"
+            crossorigin="anonymous"
+        />
+        <link
+            rel="stylesheet"
+            href="https://stackpath.bootstrapcdn.com/font-awesome/4.7.0/css/font-awesome.min.css"
+            crossorigin="anonymous"
+        />
+        <link
+            rel="stylesheet"
+            href="static/css/custom.css"
+        />
+        <title>{% block title %}HOMETAB{% endblock %}</title>
+    </head>
+
+    <body>
+        <nav class="navbar navbar-expand-md">
+            <p class="navbar-text">HOMETAB</p>
+            <button class="navbar-toggler" type="button" data-toggle="collapse" data-target="#navbar"> <!-- for mobile devices -->
+                <span class="navbar-toggler-icon"></span>
+            </button>
+            <div class="collapse navbar-collapse" id="navbar">
+                <div class="navbar-nav">
+                    {% if user.is_authenticated %} <!-- shows only if user is logged in -->
+                    <a class="nav-item nav-link" id="profile" href="/">My Hometab</a>
+                    <a class="nav-item nav-link" id="matchbook" href="/matchbook">Shared Hometabs</a>
+                    <a class="nav-item nav-link" id="logout" href="/logout">Logout</a>
+                    {% else %}
+                    <a class="nav-item nav-link" id="login" href="/login">Login</a>
+                    <a class="nav-item nav-link" id="register" href="/register">Register</a>
+                    {% endif %}
+                </div>
+            </div>
+        </nav>
+        <!-- For Flash Errors to User -->
+        {% with messages = get_flashed_messages(with_categories=true) %}
+        {% if messages %}
+            {% for category, message in messages %}
+                {% if category == 'error' %}
+                <div class="alert alert-danger alter-dismissable fade show", role="alert">
+                    {{ message }}
+                    <button type="button" class="close" data-dismiss="alert">
+                        <span aria-hidden="true">&times;</span> <!-- fancy button styling-->
+                    </button>
+                </div>
+                {% else %}
+                <div class="alert alert-success alter-dismissable fade show", role="alert">
+                    {{ message }}
+                    <button type="button" class="close" data-dismiss="alert">
+                        <span aria-hidden="true">&times;</span> <!-- fancy button styling-->
+                    </button>
+                </div>
+                {% endif %}
+            {% endfor %}
+        {% endif %}
+        {% endwith %}
+        <div class="container">
+            {% block content %}
+            {% endblock %}
+        </div>
+
+
+        <script
+            src="https://code.jquery.com/jquery-3.2.1.slim.min.js"
+            integrity="sha384-KJ3o2DKtIkvYIK3UENzmM7KCkRr/rE9/Qpg6aAZGJwFDMVNA/GpGFF93hXpG5KkN"
+            crossorigin="anonymous">
+        </script>
+        <script
+            src="https://cdnjs.cloudflare.com/ajax/libs/popper.js/1.12.9/umd/popper.min.js"
+            integrity="sha384-ApNbgh9B+Y1QKtv3Rn7W3mgPxhU9K/ScQsAP7hUibX39j7fakFPskvXusvfa0b4Q"
+            crossorigin="anonymous">
+        </script>
+        <script
+            src="https://maxcdn.bootstrapcdn.com/bootstrap/4.0.0/js/bootstrap.min.js"
+            integrity="sha384-JZR6Spejh4U02d8jOt6vLEHfe/JQGiRRSQQxSfFWpi1MquVdAyjUar5+76PVCmYl"
+            crossorigin="anonymous">
+        </script>
+    </body>
+</html>

+ 7 - 0
app/templates/home.html

@@ -0,0 +1,7 @@
+{% extends "base.html" %}
+
+{% block content %}
+<div class="mx-auto text-center">
+<h1>Your Hometab</h1>
+{% endblock %}
+</div>

+ 6 - 0
main.py

@@ -0,0 +1,6 @@
+from app import create_app
+
+app = create_app()
+
+if __name__ == '__main__':
+    app.run(debug=True) ## debug=True auto re-runs websever upon change turn off for production