Browse Source

APScheduler API implementada

Oscar Alfredo Leiva Salomón 6 năm trước cách đây
mục cha
commit
5d7cc2ad57

+ 4 - 3
app/__init__.py

@@ -1,9 +1,10 @@
 from flask_restful import Api
 from flask import Blueprint
-from app.main.resources.foo import Foo
-from app.main.resources.cron import Cron
+
+from app.main.resources.schedules import SchedulesApi, ScheduleApi
 
 api_bp = Blueprint('api', __name__)
 api = Api(api_bp)
 
-api.add_resource(Cron, '/cron', '/cron/<job_id>')
+api.add_resource(SchedulesApi, '/schedules')
+api.add_resource(ScheduleApi, '/schedule/<job_id>')

+ 8 - 17
app/main/__init__.py

@@ -1,25 +1,16 @@
 from flask import Flask
 from app.main.config import config_by_name
-from apscheduler.schedulers.background import BackgroundScheduler
-from apscheduler.jobstores.mongodb import MongoDBJobStore
-from pymongo import MongoClient
-
-client = MongoClient('mongodb://mailScheduler:pqowieuryt@192.168.100.5:27017/Medidores')
-
-
-jobstores = {
-    'default': MongoDBJobStore(database='Medidores',
-                               collection='mail_scheduler',
-                               client=client)
-}
-
-scheduler = BackgroundScheduler({
-    'apscheduler.timezone': 'America/El_Salvador'
-    }, jobstores=jobstores)
+from app.main import extensions
 
 
 def create_app(config_name):
     app = Flask(__name__)
     app.config.from_object(config_by_name[config_name])
-    scheduler.start()
+    register_extensions(app)
     return app
+
+
+def register_extensions(app):
+    extensions.db.init_app(app)
+    extensions.scheduler.init_app(app)
+    extensions.scheduler.start()

+ 0 - 0
config.py → app/main/common/__init__.py


+ 36 - 8
app/main/config.py

@@ -1,6 +1,14 @@
 import os
+from dotenv import load_dotenv
+from apscheduler.jobstores.mongodb import MongoDBJobStore
+from pymongo import MongoClient
+
+load_dotenv()
 
 BASE_DIR = os.path.abspath(os.path.dirname(__file__))
+mongo_client = MongoClient(
+    'mongodb://mailScheduler:pqowieuryt@192.168.100.5:27117/Medidores')
+
 
 class Config:
     SECRET_KEY = os.getenv('SECRET_KEY', 'my_precious_secret_key')
@@ -8,25 +16,45 @@ class Config:
 
 
 class DevelopmentConfig(Config):
-    # uncomment the line below to use postgres
-    # SQLALCHEMY_DATABASE_URI = postgres_local_base
+
     DEBUG = True
-    # SQLALCHEMY_DATABASE_URI = 'sqlite:///' + os.path.join(basedir, 'flask_boilerplate_test.db')
-    # SQLALCHEMY_TRACK_MODIFICATIONS = False
+    DB_CONNECTION = {
+        "MONGODB_DB": "Medidores",
+        "MONGODB_USERNAME": "mailScheduler",
+        "MONGODB_PASSWORD": "pqowieuryt",
+        "MONGODB_HOST": "192.168.100.5",
+        "MONGODB_PORT": 27117
+    }
+    SCHEDULER_JOBSTORES = {
+        'default': MongoDBJobStore(database='Medidores',
+                                   collection='mail_scheduler',
+                                   client=mongo_client)
+    }
+    SCHEDULER_API_ENABLED = True
 
 
 class TestingConfig(Config):
     DEBUG = True
     TESTING = True
-    # SQLALCHEMY_DATABASE_URI = 'sqlite:///' + os.path.join(basedir, 'flask_boilerplate_test.db')
     PRESERVE_CONTEXT_ON_EXCEPTION = False
-    # SQLALCHEMY_TRACK_MODIFICATIONS = False
 
 
 class ProductionConfig(Config):
+    mongo_client = MongoClient(os.getenv('MONGODB_URL'))
     DEBUG = False
-    # uncomment the line below to use postgres
-    # SQLALCHEMY_DATABASE_URI = postgres_local_base
+    DB_CONNECTION = {
+        "MONGODB_DB": os.getenv('MONGODB_DB'),
+        "MONGODB_USERNAME": os.getenv('MONGODB_USERNAME'),
+        "MONGODB_PASSWORD": os.getenv('MONGODB_PASSWORD'),
+        "MONGODB_HOST": os.getenv('MONGODB_HOST'),
+        "MONGODB_PORT": os.getenv('MONGODB_PORT')
+    }
+    SCHEDULER_JOBSTORES = {
+        'default': MongoDBJobStore(database='Medidores',
+                                   collection='mail_scheduler',
+                                   client=mongo_client)
+    }
+    SCHEDULER_API_ENABLED = True
 
 
 config_by_name = dict(

+ 7 - 0
app/main/extensions.py

@@ -0,0 +1,7 @@
+from flask_mongoengine import MongoEngine
+from flask_apscheduler import APScheduler
+
+import os
+db = MongoEngine()
+
+scheduler = APScheduler()

+ 0 - 0
app/main/model/__init__.py


+ 0 - 57
app/main/resources/cron.py

@@ -1,57 +0,0 @@
-from flask_restful import Resource, request
-from app.main import scheduler
-import json
-from datetime import datetime
-
-
-def printing_something(text):
-    print("printing {0} at {1}".format(text, datetime.now()))
-
-
-class Cron(Resource):
-    def get(self):
-
-        jobs = []
-
-        for job in scheduler.get_jobs():
-            jobdict = {}
-            crontab = {}
-            jobdict['id'] = job.id
-            jobdict['name'] = job.name
-            jobdict['args'] = str(job.args)
-            jobdict['next_run_time'] = str(job.next_run_time)
-
-            for f in job.trigger.fields:
-                cuarval = str(f)
-                crontab[f.name] = cuarval
-
-            jobdict['crontab'] = crontab
-            jobs.append(jobdict)
-
-        return {'jobs': jobs}
-
-    def post(self):
-        json_data = request.get_json()
-        if not json_data:
-            return {'message': 'No input data provided'}, 400
-
-        day = '*' if not json_data.get('day') else json_data.get('day')
-        hour = '*' if not json_data.get('hour') else json_data.get('hour')
-        minute = '*' if not json_data.get('minute') else json_data.get('minute')
-        text = json_data.get('text')
-
-        job = scheduler.add_job(printing_something, trigger='cron',
-                                day=day, hour=hour, minute=minute, args=[text])
-
-        return "job details: {0}".format(job)
-
-    def delete(self, job_id):
-        # json_data = request.get_json()
-        # if not json_data:
-        #     return {'message': 'No input data provided'}, 400
-
-        # jobid = json_data.get('id')
-
-        resp = scheduler.remove_job(job_id=job_id)
-
-        return resp

+ 27 - 0
app/main/resources/schedules.py

@@ -0,0 +1,27 @@
+from flask_restful import Resource, request
+from flask_apscheduler.api import get_jobs, get_job, delete_job, add_job
+from app.main.extensions import scheduler
+import json
+from datetime import datetime
+import uuid
+
+
+def printing_something(text):
+    print("printing {0} at {1}".format(text, datetime.now()))
+
+
+class SchedulesApi(Resource):
+    def get(self):
+        return get_jobs()
+
+    def post(self):
+        return add_job()
+
+
+class ScheduleApi(Resource):
+
+    def get(self, job_id):
+        return get_job(job_id)
+
+    def delete(self, job_id):
+        return delete_job(job_id)

+ 1 - 1
manage.py

@@ -2,7 +2,7 @@ import os
 from flask_script import Manager
 
 from app import api_bp
-from app.main import create_app, scheduler
+from app.main import create_app
 
 
 app = create_app(os.getenv('BOILERPLATE_ENV') or 'dev')

+ 11 - 0
requirements.txt

@@ -1,14 +1,25 @@
 aniso8601==7.0.0
 APScheduler==3.6.1
+autopep8==1.4.4
 Click==7.0
 Flask==1.1.1
+Flask-APScheduler==1.11.0
 Flask-Cors==3.0.8
+flask-mongoengine==0.9.5
 Flask-RESTful==0.3.7
+Flask-Script==2.0.6
+Flask-WTF==0.14.2
 itsdangerous==1.1.0
 Jinja2==2.10.1
 MarkupSafe==1.1.1
+mongoengine==0.18.2
 pep8==1.7.1
+pycodestyle==2.5.0
+pymongo==3.8.0
+python-dateutil==2.8.0
+python-dotenv==0.10.3
 pytz==2019.1
 six==1.12.0
 tzlocal==2.0.0
 Werkzeug==0.15.5
+WTForms==2.2.1