Предоставление API на основе GraphQL
У меня есть данные, хранящиеся в файловой системе (нормализованные для нескольких небольших файлов), и я написал функции Python для чтения / записи данных из файловой системы. Read API возвращает объект типа Job. API записи ожидает, что объект типа Job будет передан в качестве аргумента.
def get_jobs(starttime, endtime):
''' Reads and returns jobs that ran between starttime and endtime interval '''
def put_job(job):
''' Persists Job object to a file system '''
class Job:
def __init__(self, name, key, starttime, endtime):
self.name = name
self.key = key
self.starttime = starttime
self.endtime = endtime
Теперь я хочу выставить эти функции через веб-сервер. Я бы предпочел выставлять API-интерфейсы GraphQL с помощью Django.
Вопросов:
- Является ли Django/Django REST framework правильным выбором для этого? Я новичок в Django и GraphQL.
- Модели Django, похоже, тесно связаны с базами данных. Придется ли мне создавать другой класс модели Job и создавать его с помощью Job, возвращаемого функцией read_jobs? Если да, как я могу создать простое веб-приложение отсюда?
Примечание:
- Объект задания - это трехуровневый вложенный объект, имеющий множество атрибутов / свойств. Для демонстрации я оставил здесь только четыре атрибута / свойства.
- Я бы предпочел Django, потому что мое приложение на этом этапе может выглядеть немного маленьким, но со временем оно будет расти, и у меня будет множество функций, которые мне нужно добавить. Я специально ищу решения для приложений на основе django-графена, не используя БД SQLite или не предполагая, что данные извлекаются из какой-то базы данных. Я хочу использовать свои методы API постоянства для запроса данных из файловой системы.
1 ответ
Решение
Django может быть (хорошим, но более тяжелым) решением, но вот более простое решение с использованием Flask:
from flask import Flask, jsonify
app = Flask(__name__)
class Job:
def __init__(self, name, key, starttime, endtime):
self.name = name
self.key = key
self.starttime = starttime
self.endtime = endtime
@app.route("/get", methods=['GET'])
def get_jobs(starttime, endtime):
''' Reads and returns jobs that ran between starttime and endtime interval '''
jobs = read_data(starttime, endtime) # your read_data() method
return jsonify({'jobs': jobs})
@app.route("/put", methods=['POST']) # or methods=['PUT']
def put_job(request):
# access your data trough the request object:
job_name = request.args.get('name', '')
job_key = request.args.get('key', '')
# or get it in json
job_data = request.json
write_data(Job.from_json(job_data))
Я использовал Json здесь, потому что мне удобнее с ним, но если GraphQL важен для вас, я рекомендую вам библиотеку https://graphene-python.org/.
Также есть проект интеграции графена с колбой