#!/usr/bin/python3 from celery import Celery from celery.backends import sqlalchemy from datetime import datetime from flask import Flask import requests from sqlalchemy import create_engine, Column, Integer, String, DateTime from sqlalchemy.ext.declarative import declarative_base from sqlalchemy.orm import sessionmaker # create a Flask app app = Flask(__name__) # create a Celery app and configure it to use the sqlalchemy backend and the SQLite database specified by the broker_url celery_app = Celery('tasks') celery_app.conf.update( result_backend='sqlalchemy', broker_url='sqlite:///celery.db', task_serializer='json', result_serializer='json', ) # define the get_public_ip Celery task (as in the previous example) @celery_app.task def get_public_ip(): response = requests.get('https://ifconfig.me/ip') return response.text # create an SQLAlchemy base class Base = declarative_base() # define an IPHistory model that will be used to store IP addresses and timestamps in the database class IPHistory(Base): __tablename__ = 'ip_history' id = Column(Integer, primary_key=True) ip_address = Column(String) timestamp = Column(DateTime, default=datetime.now) # create a database engine and connect to the ip_history.db database engine = create_engine('sqlite:///ip_history.db') Base.metadata.create_all(engine) # create a session object that will be used to add records to the database Session = sessionmaker(bind=engine) session = Session() # define a Flask route that returns the current public IP address @app.route('/public_ip') def public_ip(): # call the get_public_ip task and wait for it to complete ip_address = get_public_ip.delay().get() # create a new IPHistory record and add it to the database record = IPHistory(ip_address=ip_address) session.add(record) session.commit() # return the current IP address as the response return ip_address if __name__ == '__main__': app.run()