Setting Up the Foundation: The Application
SSH into the workspace server and start by installing a virtual environment manager. We are going to use virtualenvwrapper for this guide:
apt update
# Install pip
apt install python3-pip -y
# Install virtualenvwrapper
pip3 install virtualenvwrapper --break-system-packages
After installing virtualenvwrapper, you need to add some lines to your .bashrc file to load the virtualenvwrapper commands automatically:
cat <>~/.bashrc && source ~/.bashrc
export VIRTUALENVWRAPPER_PYTHON=/usr/bin/python3
export WORKON_HOME=$HOME/.virtualenvs
source /usr/local/bin/virtualenvwrapper.sh
EOF
Create a file tree for the application containing a folder called RestQR with two subfolders: menu and qr:
mkdir -p $HOME/RestQR/{menu,qr}
Now create two virtual environments for the microservices:
mkvirtualenv menu
mkvirtualenv qr
Activate the menu virtual environment and install the required packages:
# Activate the virtual environment
workon menu
# Install the required packages
pip install \
flask==3.1.0 \
psycopg2-binary==2.9.10 \
flask_sqlalchemy==3.1.1
Create the requirements file for the menu service:
pip freeze > $HOME/RestQR/menu/requirements.txt
Use the following command to create a file called app.py in the menu folder:
cat <<EOF >$HOME/RestQR/menu/app.py
from flask import Flask, request, jsonify
from flask_sqlalchemy import SQLAlchemy
import os
app = Flask(__name__)
# Database Configuration
app.config["SQLALCHEMY_DATABASE_URI"] = os.environ["DATABASE_URL"]
db = SQLAlchemy(app)
# Database Model
class Menu(db.Model):
restaurant_id = db.Column(db.String(50), primary_key=True)
menu_data = db.Column(db.JSON, nullable=False)
# Create tables if they don't exist
with app.app_context():
db.create_all()
# Save or update a restaurant menu
@app.route("/menu/" , methods=["POST"])
def save_menu(restaurant_id):
menu = request.json
existing_menu = Menu.query.get(restaurant_id)
if existing_menu:
existing_menu.menu_data = menu
else:
new_menu = Menu(restaurant_id=restaurant_id, menu_data=menu)
db.session.add(new_menu)
db.session.commit()
return jsonify({"message": "Menu saved successfully"})
# Get a restaurant menu
@app.routeDevSecOps in Practice
A Hands-On Guide to Operationalizing DevSecOps at ScaleEnroll now to unlock current content and receive all future updates for free. Your purchase supports the author and fuels the creation of more exciting content. Act fast, as the price will rise as the course nears completion!
