Лучшие практики для разбора запроса аргументов Python (Flask) - PullRequest
0 голосов
/ 22 февраля 2019

У меня есть следующая функция в моем controller.py:

@app.route('/api/model/train', methods=['POST'])
def create_train_model():
    """
    Create and train new model.

    """
    args = request.json

    train_booster(arg1 = 100, arg2 = True, arg3 = 'sgd')

    return jsonify(success=True)

И, как вы можете видеть, в нее входит некоторая функция (из service.py) с 3 аргументами и параметрами по умолчанию.

Как мне взять параметры тела запроса и передать их в функцию?Я нашел это решение:

class ModelArguments:
    def __init__(self, args):
        self.arg1 = 100
        self.arg2 = True
        self.arg3 = 'sgd'

        self.__dict__.update(args)

@app.route('/api/model/train', methods=['POST'])
def create_train_model():
    """
    Create and train new model.

    """
    model_arguments = ModelArguments(request.json)

    train_booster(arg1 = model_arguments.arg1,
                  arg2 = model_arguments.arg2,
                  arg3 = model_arguments.arg3,)

    return jsonify(success=True)

Существуют ли какие-либо лучшие (или PythonWay или более безопасные / полезные) реализации? Например, если я изменю функцию train_booster и теперь она будетВозьми еще один аргумент, который мне нужен, чтобы переписать каждый слой моего проекта!

1 Ответ

0 голосов
/ 22 февраля 2019

У меня есть идея, как следует.service.py

from flask import Flask, request, jsonify

app = Flask("aaa")


def func1(arg1, arg2, arg3):
    print arg1, arg2, arg3


def func2(arg4=1, arg5=2):
    print arg4, arg5


def func3(arg1, arg2, arg3, arg4=1, arg5=1):
    print arg1, arg2, arg3, arg4, arg5


@app.route('/api/model/args_kwargs', methods=['POST'])
def create_train_model():
    """
    Create and train new model.

    """
    args, kwargs = request.json
    func3(*args, **kwargs)

    return jsonify(success=True)

@app.route('/api/model/args', methods=['POST'])
def create_train_2():
    """
    Create and train new model.

    """
    args = request.json
    func1(*args)

    return jsonify(success=True)

@app.route('/api/model/kwargs', methods=['POST'])
def create_train_3():
    """
    Create and train new model.

    """
    kwargs = request.json
    func2(**kwargs)

    return jsonify(success=True)

app.run(host="0.0.0.0", port=9900)

client.py

import requests
import json

def test1():
    resp = requests.post("http://0.0.0.0:9900/api/model/args", json=[12,3,4])
    return None

def test2():
    resp = requests.post("http://0.0.0.0:9900/api/model/kwargs", json={"arg4":234, "arg5":678})
    return None

def test3():
    resp = requests.post("http://0.0.0.0:9900/api/model/args_kwargs", json=([12,3,4], {"arg4":234, "arg5":678}))
    return None


test1()
test2()
test3()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...