Универсальный ресурсный подход в Python по сравнению с PHP
Я новичок в 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
}
Это get будет работать для каждого контроллера, который реализует "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 ответ
Нашел проблему.
Было место, где я звонил StoreModule вместо StoreModel Это работает!!!