我是python的新手,也是我第一次使用flask-RESTful开发REST API。
突然之间,我想创建一个超类来处理大多数使用过的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将适用于实现“使用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(name) - > Resource.get(self,name) - > StoreModel.get(cls,name)
但它不是这样运行的
我可以访问Resource.get()但模型没有有效的类引用来调用StoreModel.get()
我需要一种方法来引用必须在子类中给出的“ClassModel”,它允许我调用“ClassModel”方法,并且该引用可以是StoreModel,ItemModel,AnythingModel,因为子类分别是Store,Item,Anything。
发现了问题。
有一个地方我调用StoreModule而不是StoreModel它工作!