Routing¶
Example:
from flask import Flask
from flask_rest_jsonapi import Api
from your_project.resources import TopicList, TopicDetail
app = Flask(__name__)
api = Api(app)
api.list_route('topic_list', /topics', resource_cls=TopicList)
api.detail_route('topic_detail', '/topics/<int:topic_id>', resource_cls=TopicDetail)
This routing example will create this site map:
url | method | endpoint |
---|---|---|
/topics | GET,POST | topic_list |
/topics/<int:topic_id> | GET,PATCH,DELETE | topic_detail |
You can add multiple URLs for the same resource:
from flask import Flask
from flask_rest_jsonapi import Api
from your_project.resources import TopicList
app = Flask(__name__)
api = Api(app)
api.list_route('topic_list', /topics', '/topic_list', resource_cls=TopicList)
Blueprint¶
your_project.views.py
from flask import Blueprint
from flask_rest_jsonapi import Api
from your_project.resources import TopicList
rest_api_bp = Blueprint('rest_api', __name__)
api = Api(rest_api_bp)
api.list_route('topic_list', /topics', resource_cls=TopicList)
your_project.app.py
from flask import Flask
from your_project.views import api
app = Flask(__name__)
api.init_app(app)
Flask extension¶
your_project.extensions.py
from flask_rest_jsonapi import Api
api = Api()
your_project.views.py
from your_project.resources import TopicList
from your_project.extensions import api
api.list_route('topic_list', /topics', resource_cls=TopicList)
your_project.app.py
from flask import Flask
from your_project.extensions import api
app = Flask(__name__)
api.init_app(app)
Resource configuration¶
You can directly configure your resources from the routing system. But I don’t recommand to do that. I think it is better to organize your project with a strong separation between resources definitions and routing.
Example:
api.list_route('topic_list',
'/topics',
resource_type='topic',
schema=TopicSchema,
data_layer=SqlalchemyDataLayer,
data_layer_kwargs={'model': Topic, 'session': session},
data_layer_additional_functions={'get_base_query': topic_get_base_query})
But I think it is better to write code like that:
def get_base_query(self, **view_kwargs):
return self.session.query(Topic)
class TopicResourceList(ResourceList):
class Meta:
data_layer = {'cls': SqlalchemyDataLayer,
'kwargs': {'model': Topic, 'session': sql_db.session},
'get_base_query': get_base_query}
resource_type = 'topic'
schema = {'cls': TopicSchema}
endpoint = {'name': 'topic_list'}
api.list_route('topic_list', '/topics', resource_cls=TopicResourceList)