Универсальный ресурсный подход в Python по сравнению с PHP - PullRequest
0 голосов
/ 11 сентября 2018

Я новичок в Python, и в качестве своего первого опыта я разрабатываю REST API с flask-RESTful.

Внезапно я хочу создать суперкласс, который обрабатывает основы для большинства используемых глаголов http, но япредставьте себе, что это сложнее по сравнению с PHP.

Таким образом, цель состоит в том, чтобы создать класс Resource, который реализует функции: get (), post (), put () и delete ().

В PHP это будет выглядеть так:

trait RESTActions
{
  public function get($id)
    {
        $m = self::MODEL;
        $model = $m::find($id);
        if (is_null($model)) {
            return $this->respond(Response::HTTP_NOT_FOUND);
        }
        return $this->respond(Response::HTTP_OK, $model);
    }
  }

class ProfessionsController extends Controller
{

  const MODEL = "App\Profession";

  use RESTActions;

}

class Profession extends Model
{

    public static $rules = [
        // Validation rules
    ];
    protected $fillable = [];
    protected $dates = [];

    // Relationships

}

Этот метод будет работать для каждого контроллера, который реализует "use RESTActions;"

В Python я думаю, что это будет звучать так:

from flask_restful import Resource

class Resource(Resource):
    model = None

    def get(self, name):
        obj = model.get(name)
        if obj:
            return obj.json()
        return {'message': 'Not found'}, 404




from resources.resource import Resource
from models.store import StoreModel

class Store(Resource):
    model = StoreModel

    def get(self):
        super().get(name)



from db import db

class StoreModel(db.Model):
__tablename__ = 'stores'

id = db.Column(db.Integer, primary_key=True)
name = db.Column(db.String(80))

items = db.relationship('ItemModel', lazy='dynamic')


def __init__(self, name):
    self.name = name
    self.items = None

@classmethod
def get(cls, name):
    return cls.query.filter_by(name=name).first()

При этом я ожидал доступа к Store.get (имя) -> Resource.get (self, name) -> StoreModel.get (cls, name)

Но он не запускаетсятаким образом

Я могу добраться до Resource.get (), но модель не имеет допустимой ссылки на класс для вызова StoreModel.get ()

Мне нужен способ ссылки на "ClassModel", которыйдолжен быть указан в подклассе, который позволяет мне вызывать методы "ClassModel", и эта ссылка может бытьStoreModel, ItemModel, AnythingModel в качестве подкласса - Store, Item, Anything соответственно.

1 Ответ

0 голосов
/ 11 сентября 2018

Обнаружил проблему.

Было место, где я звонил StoreModule вместо StoreModel. Это работает !!!

...