Skip to content
Snippets Groups Projects
Commit 3af959bb authored by francisc.mendonca's avatar francisc.mendonca
Browse files

Backend boilerplate

parent fe3cc85d
No related branches found
No related tags found
No related merge requests found
SWTICH_ACCESS_KEY_ID=4406dbe746a24614a9bc8f7ec864e59f
SWITCH_SECRET_ACCESS_KEY=cec6e60954b24a51923fe5aaea9fbb3b
SWTICH_ENDPOINT_URL=https://os.zhdk.cloud.switch.ch
S3_BUCKET_NAME=cloud-bach-proj
\ No newline at end of file
2024-12-02 12:10:55,122 - __main__ - INFO - Starting Flask application...
2024-12-02 12:11:05,697 - __main__ - INFO - Starting Flask application...
2024-12-02 12:11:05,701 - werkzeug - INFO - WARNING: This is a development server. Do not use it in a production deployment. Use a production WSGI server instead.
* Running on all addresses (0.0.0.0)
* Running on http://127.0.0.1:8000
* Running on http://192.168.1.93:8000
2024-12-02 12:11:05,701 - werkzeug - INFO - Press CTRL+C to quit
2024-12-02 12:11:50,693 - werkzeug - INFO - 127.0.0.1 - - [02/Dec/2024 12:11:50] "OPTIONS /enroll HTTP/1.1" 200 -
2024-12-02 12:11:50,703 - __main__ - INFO - Enrollment attempt for email: test@gmail.com
2024-12-02 12:11:51,392 - __main__ - ERROR - Unexpected error: An error occurred (InvalidAccessKeyId) when calling the PutObject operation: Unknown
2024-12-02 12:11:51,396 - werkzeug - INFO - 127.0.0.1 - - [02/Dec/2024 12:11:51] "POST /enroll HTTP/1.1" 500 -
2024-12-02 12:19:27,242 - __main__ - INFO - Starting Flask application...
2024-12-02 12:19:27,246 - werkzeug - INFO - WARNING: This is a development server. Do not use it in a production deployment. Use a production WSGI server instead.
* Running on all addresses (0.0.0.0)
* Running on http://127.0.0.1:8000
* Running on http://192.168.1.93:8000
2024-12-02 12:19:27,246 - werkzeug - INFO - Press CTRL+C to quit
2024-12-02 12:19:42,112 - werkzeug - INFO - 127.0.0.1 - - [02/Dec/2024 12:19:42] "OPTIONS /enroll HTTP/1.1" 200 -
2024-12-02 12:19:42,115 - __main__ - INFO - Enrollment attempt for email: test@gmail.com
2024-12-02 12:19:42,700 - __main__ - ERROR - Unexpected error: An error occurred (InvalidAccessKeyId) when calling the PutObject operation: Unknown
2024-12-02 12:19:42,702 - werkzeug - INFO - 127.0.0.1 - - [02/Dec/2024 12:19:42] "POST /enroll HTTP/1.1" 500 -
2024-12-02 12:20:19,205 - __main__ - INFO - AWS_ACCESS_KEY_ID: AKIAVEKYIBTQEJB2XSNM
2024-12-02 12:20:19,205 - __main__ - INFO - AWS_SECRET_ACCESS_KEY: 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
2024-12-02 12:20:19,205 - __main__ - INFO - AWS_ENDPOINT_URL: https://os.zhdk.cloud.switch.ch
2024-12-02 12:20:19,205 - __main__ - INFO - S3_BUCKET_NAME: cloud-bach-proj
2024-12-02 12:20:19,272 - __main__ - INFO - Starting Flask application...
2024-12-02 12:20:19,274 - werkzeug - INFO - WARNING: This is a development server. Do not use it in a production deployment. Use a production WSGI server instead.
* Running on all addresses (0.0.0.0)
* Running on http://127.0.0.1:8000
* Running on http://192.168.1.93:8000
2024-12-02 12:20:19,274 - werkzeug - INFO - Press CTRL+C to quit
2024-12-02 12:21:40,705 - __main__ - INFO - SWTICH_ACCESS_KEY_ID: None
2024-12-02 12:21:40,705 - __main__ - INFO - SWITCH_SECRET_ACCESS_KEY: None
2024-12-02 12:21:40,705 - __main__ - INFO - SWTICH_ENDPOINT_URL: None
2024-12-02 12:21:40,705 - __main__ - INFO - S3_BUCKET_NAME: cloud-bach-proj
2024-12-02 12:21:40,713 - botocore.credentials - INFO - Found credentials in environment variables.
2024-12-02 12:21:40,766 - botocore.configprovider - INFO - Found endpoint for s3 via: environment_global.
2024-12-02 12:21:40,770 - __main__ - INFO - Starting Flask application...
2024-12-02 12:21:40,773 - werkzeug - INFO - WARNING: This is a development server. Do not use it in a production deployment. Use a production WSGI server instead.
* Running on all addresses (0.0.0.0)
* Running on http://127.0.0.1:8000
* Running on http://192.168.1.93:8000
2024-12-02 12:21:40,773 - werkzeug - INFO - Press CTRL+C to quit
2024-12-02 12:21:51,332 - __main__ - INFO - SWTICH_ACCESS_KEY_ID: None
2024-12-02 12:21:51,332 - __main__ - INFO - SWITCH_SECRET_ACCESS_KEY: None
2024-12-02 12:21:51,332 - __main__ - INFO - SWTICH_ENDPOINT_URL: None
2024-12-02 12:21:51,332 - __main__ - INFO - S3_BUCKET_NAME: cloud-bach-proj
2024-12-02 12:21:51,340 - botocore.credentials - INFO - Found credentials in environment variables.
2024-12-02 12:21:51,389 - botocore.configprovider - INFO - Found endpoint for s3 via: environment_global.
2024-12-02 12:21:51,394 - __main__ - INFO - Starting Flask application...
2024-12-02 12:21:51,396 - werkzeug - INFO - WARNING: This is a development server. Do not use it in a production deployment. Use a production WSGI server instead.
* Running on all addresses (0.0.0.0)
* Running on http://127.0.0.1:8000
* Running on http://192.168.1.93:8000
2024-12-02 12:21:51,396 - werkzeug - INFO - Press CTRL+C to quit
2024-12-02 12:23:04,117 - __main__ - INFO - SWTICH_ACCESS_KEY_ID: None
2024-12-02 12:23:04,117 - __main__ - INFO - SWITCH_SECRET_ACCESS_KEY: None
2024-12-02 12:23:04,117 - __main__ - INFO - SWTICH_ENDPOINT_URL: None
2024-12-02 12:23:04,117 - __main__ - INFO - S3_BUCKET_NAME: None
2024-12-02 12:23:04,126 - botocore.credentials - INFO - Found credentials in environment variables.
2024-12-02 12:23:04,196 - __main__ - CRITICAL - S3_BUCKET_NAME environment variable is not set
2024-12-02 12:53:11,151 - __main__ - INFO - SWTICH_ACCESS_KEY_ID: 4406dbe746a24614a9bc8f7ec864e59f
2024-12-02 12:53:11,151 - __main__ - INFO - SWITCH_SECRET_ACCESS_KEY: cec6e60954b24a51923fe5aaea9fbb3b
2024-12-02 12:53:11,151 - __main__ - INFO - SWTICH_ENDPOINT_URL: https://os.zhdk.cloud.switch.ch
2024-12-02 12:53:11,151 - __main__ - INFO - S3_BUCKET_NAME: cloud-bach-proj
2024-12-02 12:53:11,385 - __main__ - INFO - Starting Flask application...
2024-12-02 12:53:11,391 - werkzeug - INFO - WARNING: This is a development server. Do not use it in a production deployment. Use a production WSGI server instead.
* Running on all addresses (0.0.0.0)
* Running on http://127.0.0.1:8000
* Running on http://192.168.1.93:8000
2024-12-02 12:53:11,391 - werkzeug - INFO - Press CTRL+C to quit
2024-12-02 12:53:19,651 - werkzeug - INFO - 127.0.0.1 - - [02/Dec/2024 12:53:19] "OPTIONS /enroll HTTP/1.1" 200 -
2024-12-02 12:53:19,656 - __main__ - INFO - Enrollment attempt for email: test@gmail.com
2024-12-02 12:53:20,645 - __main__ - ERROR - Unexpected error: An error occurred (NoSuchBucket) when calling the PutObject operation: Unknown
2024-12-02 12:53:20,647 - werkzeug - INFO - 127.0.0.1 - - [02/Dec/2024 12:53:20] "POST /enroll HTTP/1.1" 500 -
2024-12-02 12:54:00,835 - __main__ - INFO - SWTICH_ACCESS_KEY_ID: 4406dbe746a24614a9bc8f7ec864e59f
2024-12-02 12:54:00,835 - __main__ - INFO - SWITCH_SECRET_ACCESS_KEY: cec6e60954b24a51923fe5aaea9fbb3b
2024-12-02 12:54:00,835 - __main__ - INFO - SWTICH_ENDPOINT_URL: https://os.zhdk.cloud.switch.ch
2024-12-02 12:54:00,835 - __main__ - INFO - S3_BUCKET_NAME: cloud-bach-proj
2024-12-02 12:54:00,923 - __main__ - INFO - Starting Flask application...
2024-12-02 12:54:01,360 - werkzeug - INFO - WARNING: This is a development server. Do not use it in a production deployment. Use a production WSGI server instead.
* Running on all addresses (0.0.0.0)
* Running on http://127.0.0.1:8000
* Running on http://192.168.1.93:8000
2024-12-02 12:54:01,361 - werkzeug - INFO - Press CTRL+C to quit
2024-12-02 12:54:09,932 - werkzeug - INFO - 127.0.0.1 - - [02/Dec/2024 12:54:09] "OPTIONS /enroll HTTP/1.1" 200 -
2024-12-02 12:54:09,937 - __main__ - INFO - Enrollment attempt for email: test@gmail.com
2024-12-02 12:54:10,203 - __main__ - INFO - Successfully enrolled user: test@gmail.com
2024-12-02 12:54:10,205 - werkzeug - INFO - 127.0.0.1 - - [02/Dec/2024 12:54:10] "POST /enroll HTTP/1.1" 200 -
2024-12-02 12:54:19,954 - werkzeug - INFO - 127.0.0.1 - - [02/Dec/2024 12:54:19] "OPTIONS /login HTTP/1.1" 200 -
2024-12-02 12:54:19,960 - __main__ - INFO - Login attempt for email: test@gmail.com
2024-12-02 12:54:20,282 - werkzeug - INFO - 127.0.0.1 - - [02/Dec/2024 12:54:20] "POST /login HTTP/1.1" 200 -
2024-12-02 12:54:27,064 - werkzeug - INFO - 127.0.0.1 - - [02/Dec/2024 12:54:27] "OPTIONS /logout HTTP/1.1" 200 -
2024-12-02 12:54:27,069 - werkzeug - INFO - 127.0.0.1 - - [02/Dec/2024 12:54:27] "POST /logout HTTP/1.1" 400 -
2024-12-02 12:55:40,966 - werkzeug - INFO - 127.0.0.1 - - [02/Dec/2024 12:55:40] "OPTIONS /logout HTTP/1.1" 200 -
2024-12-02 12:55:40,971 - werkzeug - INFO - 127.0.0.1 - - [02/Dec/2024 12:55:40] "POST /logout HTTP/1.1" 400 -
2024-12-02 12:55:46,985 - __main__ - INFO - SWTICH_ACCESS_KEY_ID: 4406dbe746a24614a9bc8f7ec864e59f
2024-12-02 12:55:46,985 - __main__ - INFO - SWITCH_SECRET_ACCESS_KEY: cec6e60954b24a51923fe5aaea9fbb3b
2024-12-02 12:55:46,985 - __main__ - INFO - SWTICH_ENDPOINT_URL: https://os.zhdk.cloud.switch.ch
2024-12-02 12:55:46,985 - __main__ - INFO - S3_BUCKET_NAME: cloud-bach-proj
2024-12-02 12:55:47,082 - __main__ - INFO - Starting Flask application...
2024-12-02 12:55:47,580 - werkzeug - INFO - WARNING: This is a development server. Do not use it in a production deployment. Use a production WSGI server instead.
* Running on all addresses (0.0.0.0)
* Running on http://127.0.0.1:8000
* Running on http://192.168.1.93:8000
2024-12-02 12:55:47,580 - werkzeug - INFO - Press CTRL+C to quit
2024-12-02 12:55:53,216 - werkzeug - INFO - 127.0.0.1 - - [02/Dec/2024 12:55:53] "OPTIONS /login HTTP/1.1" 200 -
2024-12-02 12:55:53,221 - __main__ - INFO - Login attempt for email: test@gmail.com
2024-12-02 12:55:53,396 - werkzeug - INFO - 127.0.0.1 - - [02/Dec/2024 12:55:53] "POST /login HTTP/1.1" 200 -
2024-12-02 12:55:54,335 - werkzeug - INFO - 127.0.0.1 - - [02/Dec/2024 12:55:54] "OPTIONS /logout HTTP/1.1" 200 -
2024-12-02 12:55:54,340 - werkzeug - INFO - 127.0.0.1 - - [02/Dec/2024 12:55:54] "POST /logout HTTP/1.1" 400 -
2024-12-02 12:56:23,774 - werkzeug - INFO - 127.0.0.1 - - [02/Dec/2024 12:56:23] "OPTIONS /logout HTTP/1.1" 200 -
2024-12-02 12:56:23,780 - werkzeug - INFO - 127.0.0.1 - - [02/Dec/2024 12:56:23] "POST /logout HTTP/1.1" 400 -
2024-12-02 12:56:30,635 - werkzeug - INFO - 127.0.0.1 - - [02/Dec/2024 12:56:30] "OPTIONS /login HTTP/1.1" 200 -
2024-12-02 12:56:30,641 - __main__ - INFO - Login attempt for email: test@gmail.com
2024-12-02 12:56:31,075 - werkzeug - INFO - 127.0.0.1 - - [02/Dec/2024 12:56:31] "POST /login HTTP/1.1" 200 -
2024-12-02 12:56:32,425 - werkzeug - INFO - 127.0.0.1 - - [02/Dec/2024 12:56:32] "OPTIONS /logout HTTP/1.1" 200 -
2024-12-02 12:56:32,430 - werkzeug - INFO - 127.0.0.1 - - [02/Dec/2024 12:56:32] "POST /logout HTTP/1.1" 400 -
2024-12-02 12:57:02,178 - werkzeug - INFO - 127.0.0.1 - - [02/Dec/2024 12:57:02] "OPTIONS /login HTTP/1.1" 200 -
2024-12-02 12:57:02,184 - __main__ - INFO - Login attempt for email: test@gmail.com
2024-12-02 12:57:02,825 - werkzeug - INFO - 127.0.0.1 - - [02/Dec/2024 12:57:02] "POST /login HTTP/1.1" 200 -
2024-12-02 12:57:04,463 - werkzeug - INFO - 127.0.0.1 - - [02/Dec/2024 12:57:04] "OPTIONS /logout HTTP/1.1" 200 -
2024-12-02 12:57:05,167 - werkzeug - INFO - 127.0.0.1 - - [02/Dec/2024 12:57:05] "POST /logout HTTP/1.1" 200 -
2024-12-09 09:10:26,299 - __main__ - INFO - SWTICH_ACCESS_KEY_ID: 4406dbe746a24614a9bc8f7ec864e59f
2024-12-09 09:10:26,299 - __main__ - INFO - SWITCH_SECRET_ACCESS_KEY: cec6e60954b24a51923fe5aaea9fbb3b
2024-12-09 09:10:26,299 - __main__ - INFO - SWTICH_ENDPOINT_URL: https://os.zhdk.cloud.switch.ch
2024-12-09 09:10:26,299 - __main__ - INFO - S3_BUCKET_NAME: cloud-bach-proj
2024-12-09 09:10:26,615 - __main__ - INFO - Starting Flask application...
2024-12-09 09:10:27,453 - werkzeug - INFO - WARNING: This is a development server. Do not use it in a production deployment. Use a production WSGI server instead.
* Running on all addresses (0.0.0.0)
* Running on http://127.0.0.1:8000
* Running on http://192.168.1.159:8000
2024-12-09 09:10:27,453 - werkzeug - INFO - Press CTRL+C to quit
2024-12-09 09:20:42,041 - werkzeug - INFO - 127.0.0.1 - - [09/Dec/2024 09:20:42] "OPTIONS /enroll HTTP/1.1" 200 -
2024-12-09 09:20:42,045 - __main__ - INFO - Enrollment attempt for email: sapos@hotmail.com
2024-12-09 09:20:43,477 - __main__ - INFO - Successfully enrolled user: sapos@hotmail.com
2024-12-09 09:20:43,478 - werkzeug - INFO - 127.0.0.1 - - [09/Dec/2024 09:20:43] "POST /enroll HTTP/1.1" 200 -
2024-12-09 09:20:52,022 - werkzeug - INFO - 127.0.0.1 - - [09/Dec/2024 09:20:52] "OPTIONS /login HTTP/1.1" 200 -
2024-12-09 09:20:52,026 - __main__ - INFO - Login attempt for email: sapos@hotmail.com
2024-12-09 09:20:52,208 - werkzeug - INFO - 127.0.0.1 - - [09/Dec/2024 09:20:52] "POST /login HTTP/1.1" 401 -
2024-12-09 09:20:56,219 - __main__ - INFO - Login attempt for email: sapos@hotmail.com
2024-12-09 09:20:56,909 - werkzeug - INFO - 127.0.0.1 - - [09/Dec/2024 09:20:56] "POST /login HTTP/1.1" 200 -
2024-12-09 09:21:21,262 - werkzeug - INFO - 127.0.0.1 - - [09/Dec/2024 09:21:21] "OPTIONS /logout HTTP/1.1" 200 -
2024-12-09 09:21:21,692 - werkzeug - INFO - 127.0.0.1 - - [09/Dec/2024 09:21:21] "POST /logout HTTP/1.1" 200 -
2024-12-09 09:21:29,789 - werkzeug - INFO - 127.0.0.1 - - [09/Dec/2024 09:21:29] "OPTIONS /enroll HTTP/1.1" 200 -
2024-12-09 09:21:29,793 - __main__ - INFO - Enrollment attempt for email: fran.abm94@gmail.com
2024-12-09 09:21:30,036 - __main__ - INFO - Successfully enrolled user: fran.abm94@gmail.com
2024-12-09 09:21:30,037 - werkzeug - INFO - 127.0.0.1 - - [09/Dec/2024 09:21:30] "POST /enroll HTTP/1.1" 200 -
2024-12-09 09:21:54,239 - werkzeug - INFO - 127.0.0.1 - - [09/Dec/2024 09:21:54] "OPTIONS /login HTTP/1.1" 200 -
2024-12-09 09:21:54,242 - __main__ - INFO - Login attempt for email: fran.abm94@gmail.com
2024-12-09 09:21:54,689 - werkzeug - INFO - 127.0.0.1 - - [09/Dec/2024 09:21:54] "POST /login HTTP/1.1" 200 -
2024-12-09 09:21:56,036 - werkzeug - INFO - 127.0.0.1 - - [09/Dec/2024 09:21:56] "OPTIONS /logout HTTP/1.1" 200 -
2024-12-09 09:21:56,455 - werkzeug - INFO - 127.0.0.1 - - [09/Dec/2024 09:21:56] "POST /logout HTTP/1.1" 200 -
2024-12-09 09:21:58,042 - werkzeug - INFO - 127.0.0.1 - - [09/Dec/2024 09:21:58] "OPTIONS /enroll HTTP/1.1" 200 -
2024-12-09 09:21:58,044 - __main__ - INFO - Enrollment attempt for email: fran.abm94@gmail.com
2024-12-09 09:21:58,125 - __main__ - INFO - Enrollment failed - user already exists: fran.abm94@gmail.com
2024-12-09 09:21:58,126 - werkzeug - INFO - 127.0.0.1 - - [09/Dec/2024 09:21:58] "POST /enroll HTTP/1.1" 409 -
2024-12-09 09:22:05,692 - werkzeug - INFO - 127.0.0.1 - - [09/Dec/2024 09:22:05] "OPTIONS /enroll HTTP/1.1" 200 -
2024-12-09 09:22:05,694 - __main__ - INFO - Enrollment attempt for email: fran.abm@gmail.com
2024-12-09 09:22:06,199 - __main__ - INFO - Successfully enrolled user: fran.abm@gmail.com
2024-12-09 09:22:06,200 - werkzeug - INFO - 127.0.0.1 - - [09/Dec/2024 09:22:06] "POST /enroll HTTP/1.1" 200 -
2024-12-09 09:22:16,204 - werkzeug - INFO - 127.0.0.1 - - [09/Dec/2024 09:22:16] "OPTIONS /login HTTP/1.1" 200 -
2024-12-09 09:22:16,205 - __main__ - INFO - Login attempt for email: fran.abm@gmail.com
2024-12-09 09:22:16,590 - werkzeug - INFO - 127.0.0.1 - - [09/Dec/2024 09:22:16] "POST /login HTTP/1.1" 200 -
# Flask Server to serve the frontend pages
from flask import Flask, request, jsonify
from flask_cors import CORS
import boto3
import json
import logging
from functools import wraps
from dotenv import load_dotenv
import os
from datetime import datetime # Added for timestamps
# Load environment variables
load_dotenv(dotenv_path='.env')
# Basic logging setup
logging.basicConfig(level=logging.INFO)
logger = logging.getLogger(__name__)
# Add error handling decorator
def handle_aws_errors(f):
@wraps(f)
def decorated_function(*args, **kwargs):
try:
return f(*args, **kwargs)
except boto3.exceptions.Boto3Error as e:
logger.error(f"AWS Error: {str(e)}")
return jsonify({'status': 'KO', 'message': 'Internal server error'}), 500
except Exception as e:
logger.error(f"Unexpected error: {str(e)}")
return jsonify({'status': 'KO', 'message': 'Internal server error'}), 500
return decorated_function
app = Flask(__name__)
CORS(app)
# Initialize S3 client
# TODO: Add your S3 credentials in .env file
s3_client = boto3.client(
's3',
aws_access_key_id=os.getenv('SWTICH_ACCESS_KEY_ID'),
aws_secret_access_key=os.getenv('SWITCH_SECRET_ACCESS_KEY'),
endpoint_url=os.getenv('SWTICH_ENDPOINT_URL')
)
# Constants
BUCKET_NAME = os.getenv('S3_BUCKET_NAME')
if not BUCKET_NAME:
logger.critical("S3_BUCKET_NAME environment variable is not set")
raise ValueError("S3_BUCKET_NAME environment variable is required")
ENROLLMENT_PREFIX = 'enrollment/'
SESSION_PREFIX = 'session/'
@app.route('/enroll', methods=['POST'])
@handle_aws_errors
def enroll():
"""
Endpoint to handle user enrollment
Expected JSON payload: {'email': 'user@example.com', 'password': 'userpassword'}
"""
data = request.get_json()
email = data.get('email')
password = data.get('password')
if not email or not password:
logger.warning(f"Enrollment attempt with missing credentials: {data}")
return jsonify({'status': 'KO:Missing credentials'}), 400
# TODO: Implement enrollment logic
# 1. Check if user already exists
# 2. Create new enrollment with timestamp
enrollment_data = {
'email': email,
'password': password, # TODO: Hash this password in production
'enrolled_at': datetime.utcnow().isoformat() # Added timestamp
}
return jsonify({'status': 'OK'}), 200
@app.route('/login', methods=['POST'])
@handle_aws_errors
def login():
"""
Endpoint to handle user login
Expected JSON payload: {'email': 'user@example.com', 'password': 'userpassword'}
"""
data = request.get_json()
email = data.get('email')
password = data.get('password')
if not email:
return jsonify({'status': 'KO:Missing email'}), 400
# TODO: Implement login logic
# 1. Check if user exists
# 2. Verify password
# 3. Create or verify session
session_data = {
'email': email,
'active': True,
'login_at': datetime.utcnow().isoformat() # Added timestamp
}
return jsonify({'status': 'OK'}), 200
# TODO: Implement these endpoints
@app.route('/logout', methods=['POST'])
def logout():
"""
Endpoint to handle user logout
Expected JSON payload: {'email': 'user@example.com'}
"""
pass
@app.route('/unenroll', methods=['POST'])
def unenroll():
"""
Endpoint to handle user unenrollment
Expected JSON payload: {'email': 'user@example.com', 'password': 'userpassword'}
"""
pass
if __name__ == '__main__':
try:
logger.info("Starting Flask application...")
# Create the bucket if it doesn't exist
s3_client.create_bucket(Bucket=BUCKET_NAME)
app.run(host='0.0.0.0', port=8000)
except Exception as e:
logger.critical(f"Failed to start application: {str(e)}")
from flask import Flask, send_from_directory
import os
app = Flask(__name__)
# Serve static files from the views directory
@app.route('/')
def index():
return send_from_directory('views', 'index.html')
@app.route('/<path:path>')
def serve_pages(path):
if not path.endswith('.html'):
path = path + '.html'
return send_from_directory('views', path)
if __name__ == '__main__':
# Run the server on a different port than the API server
app.run(host='0.0.0.0', port=3000, debug=True)
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Dashboard</title>
<style>
body {
font-family: Arial, sans-serif;
display: flex;
justify-content: center;
align-items: center;
height: 100vh;
margin: 0;
background-color: #f0f2f5;
}
.container {
text-align: center;
padding: 20px;
background-color: white;
border-radius: 8px;
box-shadow: 0 2px 4px rgba(0, 0, 0, 0.1);
}
.button {
display: inline-block;
padding: 10px 20px;
margin: 10px;
border: none;
border-radius: 5px;
background-color: #1877f2;
color: white;
text-decoration: none;
cursor: pointer;
}
.button:hover {
background-color: #166fe5;
}
.welcome-text {
color: #1c1e21;
margin-bottom: 20px;
}
</style>
</head>
<body>
<div class="container">
<h1 class="welcome-text">Welcome to Dashboard</h1>
<p>You are successfully logged in!</p>
<button onclick="logout()" class="button">Logout</button>
</div>
<script>
// Get email from URL or localStorage (you should implement proper state management)
const email = localStorage.getItem('userEmail');
console.log(email);
async function logout() {
try {
const response = await fetch('http://localhost:8000/logout', {
method: 'POST',
headers: {
'Content-Type': 'application/json',
},
body: JSON.stringify({ "email": email }),
});
const data = await response.json();
if (data.status === 'OK') {
localStorage.removeItem('userEmail');
window.location.href = 'index.html';
} else {
alert('Logout failed: ' + data.status);
}
} catch (error) {
alert('Error during logout');
}
}
</script>
</body>
</html>
\ No newline at end of file
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Welcome</title>
<style>
body {
font-family: Arial, sans-serif;
display: flex;
justify-content: center;
align-items: center;
height: 100vh;
margin: 0;
background-color: #f0f2f5;
}
.container {
text-align: center;
padding: 20px;
background-color: white;
border-radius: 8px;
box-shadow: 0 2px 4px rgba(0, 0, 0, 0.1);
}
.button {
display: inline-block;
padding: 10px 20px;
margin: 10px;
border: none;
border-radius: 5px;
background-color: #1877f2;
color: white;
text-decoration: none;
cursor: pointer;
}
.button:hover {
background-color: #166fe5;
}
</style>
</head>
<body>
<div class="container">
<h1>Welcome</h1>
<div>
<a href="login.html" class="button">Login</a>
<a href="signup.html" class="button">Sign Up</a>
</div>
</div>
</body>
</html>
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Login</title>
<style>
body {
font-family: Arial, sans-serif;
display: flex;
justify-content: center;
align-items: center;
height: 100vh;
margin: 0;
background-color: #f0f2f5;
}
.container {
padding: 20px;
background-color: white;
border-radius: 8px;
box-shadow: 0 2px 4px rgba(0, 0, 0, 0.1);
}
.form-group {
margin-bottom: 15px;
}
label {
display: block;
margin-bottom: 5px;
}
input {
width: 100%;
padding: 8px;
border: 1px solid #ddd;
border-radius: 4px;
box-sizing: border-box;
}
.button {
width: 100%;
padding: 10px;
border: none;
border-radius: 5px;
background-color: #1877f2;
color: white;
cursor: pointer;
}
.button:hover {
background-color: #166fe5;
}
.back-link {
display: block;
margin-top: 15px;
text-align: center;
color: #1877f2;
text-decoration: none;
}
</style>
</head>
<body>
<div class="container">
<h2>Login</h2>
<form id="loginForm">
<div class="form-group">
<label for="email">Email:</label>
<input type="email" id="email" name="email" required>
</div>
<div class="form-group">
<label for="password">Password:</label>
<input type="password" id="password" name="password" required>
</div>
<button type="submit" class="button">Login</button>
</form>
<a href="index.html" class="back-link">Back to Home</a>
</div>
<script>
document.getElementById('loginForm').addEventListener('submit', async (e) => {
e.preventDefault();
const email = document.getElementById('email').value;
const password = document.getElementById('password').value;
try {
const response = await fetch('http://localhost:8000/login', {
method: 'POST',
headers: {
'Content-Type': 'application/json',
},
body: JSON.stringify({ email, password }),
});
const data = await response.json();
if (data.status === 'OK') {
localStorage.setItem('userEmail', email);
window.location.href = 'dashboard.html';
} else {
alert('Login failed: ' + data.status);
}
} catch (error) {
alert('Error during login');
}
});
</script>
</body>
</html>
\ No newline at end of file
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Sign Up</title>
<style>
body {
font-family: Arial, sans-serif;
display: flex;
justify-content: center;
align-items: center;
height: 100vh;
margin: 0;
background-color: #f0f2f5;
}
.container {
padding: 20px;
background-color: white;
border-radius: 8px;
box-shadow: 0 2px 4px rgba(0, 0, 0, 0.1);
}
.form-group {
margin-bottom: 15px;
}
label {
display: block;
margin-bottom: 5px;
}
input {
width: 100%;
padding: 8px;
border: 1px solid #ddd;
border-radius: 4px;
box-sizing: border-box;
}
.button {
width: 100%;
padding: 10px;
border: none;
border-radius: 5px;
background-color: #1877f2;
color: white;
cursor: pointer;
}
.button:hover {
background-color: #166fe5;
}
.back-link {
display: block;
margin-top: 15px;
text-align: center;
color: #1877f2;
text-decoration: none;
}
</style>
</head>
<body>
<div class="container">
<h2>Sign Up</h2>
<form id="signupForm">
<div class="form-group">
<label for="email">Email:</label>
<input type="email" id="email" name="email" required>
</div>
<div class="form-group">
<label for="password">Password:</label>
<input type="password" id="password" name="password" required>
</div>
<button type="submit" class="button">Sign Up</button>
</form>
<a href="index.html" class="back-link">Back to Home</a>
</div>
<script>
document.getElementById('signupForm').addEventListener('submit', async (e) => {
e.preventDefault();
const email = document.getElementById('email').value;
const password = document.getElementById('password').value;
try {
const response = await fetch('http://localhost:8000/enroll', {
method: 'POST',
headers: {
'Content-Type': 'application/json',
},
body: JSON.stringify({ email, password }),
});
const data = await response.json();
if (data.status === 'OK') {
alert('Sign up successful! Please login.');
window.location.href = 'login.html';
} else {
alert('Sign up failed: ' + data.status);
}
} catch (error) {
alert('Error during sign up');
}
});
</script>
</body>
</html>
\ No newline at end of file
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment