基于Flask类的API和jsonrpc

时间:2016-02-18 18:18:45

标签: flask json-rpc

我在django中开发了一个rest API后开始使用Flask。我想开始使用Flask并构建一个JSONRPC API。我正在使用python 3.4,我想知道如何(以及如果)我可以使用类来实现API,而不是我到目前为止看到的教程中描述的方式。

例如:

@jsonrpc.method('app.index')
def index(a):
    return 'hello {a}'.format(a=a)

我可以这样做:

class Index()
   def mymethod(self, a)
       return 'hello {a}'.format(a=a)

如果这样的构造完全可能,有人可以指出我正确的方向吗?

关键是我想为所有API端点实现身份验证,并且在使用类时我可以创建一个身份验证类并使用

class Index(Auth, SomeOtherBehaviour):
   def mymethod(self,a)
        return 'a'

我是否正确地看待它(来自Django,这看起来很熟悉),还是有其他/更好的方式在Flask中如何做到这一点?

2 个答案:

答案 0 :(得分:2)

这取决于API的用途。

如果您试图允许客户:
 -获取有关对象的信息
 -创建和存储新对象
 -更新旧对象
 -删除现有对象

然后,您将基于Resources创建一个API(资源=对象实例),并且您应该使用RESTful api,例如flask-Restful。如果您创建网站并尝试组织这些资源,将它们存储在数据库中,显示它们并通过api与它们进行交互,则应该使用Django,因为所有这些问题都已经使用Django的ORM解决了。

如果您试图允许客户:
  -根据参数向服务器远程发布命令之类的功能

然后,您正在创建RPC API,应使用类似flask-jsonrpc的内容。

祝你项目顺利。

答案 1 :(得分:1)

看看Flask-Restful。它为您提供了基于类的视图,这些视图与HTTP动词相结合,并且会消除路由带来的一些痛苦。该框架提供上述动词路由,输入验证和JSON编组。

class FooResource(Resource):  
     def get(self, name):  
         return 'hello {0}'.format(name)

     def post(self):
         # save data or pass data to DjangoAPI
         return 201

修改 您可以使用Flask-Restful的基于类的端点,如果您对基于类的功能(我不熟悉Django)真的感兴趣,只需将它们用作RPC端点,您可能还想看看blueprints。 Flask-Restful只是为您提供了编写RESTful API的方法,但并不能让您做到。

至于身份验证,我们在Flask应用程序中所做的是编写一个装饰器来检查auth-token并在请求进入时对其进行验证。所以像这样:

def authenticate(func=None, *, roles=None):
    if func is None:
        return partial(authenticate, roles=roles)

    @wraps(func)
    def wrapper(*args, **kwargs):
        try:
            if authorization_check():
                result = func(*args, **kwargs)
            else:
                result = flask.abort(401)
        except ResourceNotFoundException:
            result = flask.abort(404)

        return result
    return wrapper

然后你的终端只需要一个@authenticate装饰器。