Предоставление API на основе GraphQL - PullRequest
2 голосов
/ 13 июня 2019

У меня есть данные, хранящиеся в файловой системе (нормализованные для нескольких небольших файлов), и я написал функции 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 Ответ

2 голосов
/ 20 июня 2019

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, я рекомендую вам библиотеку Graphene-Python .

Существует также проект интеграции графена с Flask

...