app/python/main.py (41 lines of code) (raw):
#!/usr/bin/python
#
# Copyright 2024 Google LLC
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
"""
main.py - the server-side
"""
import json
from config import PROCESSED_DATA_BUCKET, logging
from flask import Flask, render_template, request
import google.cloud.storage
app = Flask(__name__)
def retrieve_data(fur, age, location):
filename = "/".join([fur, age, location]) + "/data.json"
storage_client = google.cloud.storage.Client()
processed_bucket = storage_client.get_bucket(PROCESSED_DATA_BUCKET)
blob = processed_bucket.blob(filename)
if not blob.exists():
logging.warning(
f"{PROCESSED_DATA_BUCKET} does not contain {filename}. "
"Has the job been run?"
)
return 0, []
fragment = blob.download_as_text()
data = json.loads(fragment)
squirrel_count = data.pop("_counter")
logging.info(f"Retrieved data for {squirrel_count} entities.")
# Ensure data values are returned ordered by key
data_points = list(dict(sorted(data.items())).values())
return squirrel_count, data_points
@app.route("/")
def home():
if PROCESSED_DATA_BUCKET is None:
return "Environment variable PROCESSED_DATA_BUCKET required", 500
fur = request.args.get("fur", "Gray")
age = request.args.get("age", "Adult")
location = request.args.get("location", "Above Ground")
logging.info(
f"Request received for fur: {fur}, age: {age}, location: {location}"
)
squirrel_count, data_points = retrieve_data(
fur=fur, age=age, location=location
)
# for validation testing, make array have no whitespace
data_points = str(data_points).replace(" ", "")
return render_template(
"index.html", squirrel_count=squirrel_count, data_points=data_points
)
if __name__ == "__main__":
app.run(host="localhost", port=8080, debug=True)