提供成员数据支持的django rest框架适配器。当jsonapi.org达到1.0时,这个适配器计划采用它。
rest_framework_ember的Python项目详细描述
默认的ember数据rest适配器约定不同于默认的 django rest framework json请求和响应格式。而不是添加 一个特定于django的适配器来成员数据我们在django中使用这个适配器来 以ember数据rest适配器期望的格式输出并接受json。
默认情况下,django rest framework将生成如下响应:
{ "count": 20, "next": "http://example.com/api/1.0/identities/?page=2", "previous": null, "results": [ { "id": 1, "username": "john", "full_name": "John Coltrane" }, { ... } ] }
但是,对于emberjs中的identity模型,ember数据rest适配器 期望响应如下:
{ "identity": [ { "id": 1, "username": "john", "full_name": "John Coltrane" }, { ... } ], "meta": { "count": 20, "next": 2, "next_link": "http://example.com/api/1.0/identities/?page=2", "page": 1, "previous": null, "previous_link": null } }
要求
- Django
- django rest框架
安装
来自Pypi
pip install rest_framework_ember
来源
$ git clone https://github.com/ngenworks/rest_framework_ember.git $ cd rest_framework_ember && pip install -e .
运行测试
$ python runtests.py
用法
rest_framework_ember假设您在django中使用基于类的视图 休息框架。
设置
可以添加rest_framework_ember.parsers.JSONParser和 rest_framework_ember.renderers.JSONRenderer到每个ViewSet类,或 覆盖settings.REST_FRAMEWORK:
REST_FRAMEWORK = { 'PAGINATE_BY': 10, 'PAGINATE_BY_PARAM': 'page_size', 'MAX_PAGINATE_BY': 100, # DRF v3.1+ 'DEFAULT_PAGINATION_CLASS': 'rest_framework_ember.pagination.PageNumberPagination', # older than DRF v3.1 'DEFAULT_PAGINATION_SERIALIZER_CLASS': 'rest_framework_ember.pagination.PaginationSerializer', 'DEFAULT_PARSER_CLASSES': ( 'rest_framework_ember.parsers.JSONParser', 'rest_framework.parsers.FormParser', 'rest_framework.parsers.MultiPartParser' ), 'DEFAULT_RENDERER_CLASSES': ( 'rest_framework_ember.renderers.JSONRenderer', 'rest_framework.renderers.BrowsableAPIRenderer', ), }
如果设置了PAGINATE_BY,则呈现程序将返回一个meta对象 记录计数以及下一个和上一个链接。django rest框架外观 默认情况下,pageget参数允许您对 具有this.store.find('identity', {page: 2});的数据子集。
资源名称属性
在不属于rest_framework.viewsets.ModelViewSet子类的资源上, 类上需要resource_name属性:
class Me(generics.GenericAPIView): """ Current user's identity endpoint. GET /me """ resource_name = 'data' serializer_class = identity_serializers.IdentitySerializer allowed_methods = ['GET'] permission_classes = (permissions.IsAuthenticated, )
余烬数据<;->;rest框架格式转换
(驼峰化/下划线/复数)
此包包括自动转换json请求的可选功能 以及从ember data camelcase到python/rest_框架首选的响应 强调。另外,当一个对象数组 会被退回。要连接此功能,请在项目设置中包括以下内容:
REST_EMBER_FORMAT_KEYS = True REST_EMBER_PLURALIZE_KEYS = True
注意:由于屈折符的工作方式,地址1将转换为地址1 输出时,但无法将地址1转换回投递或投递时的地址1。保留 在用数字命名字段时要记住这一点。
示例-无格式转换:
{ "identity": [ { "id": 1, "username": "john", "first_name": "John", "last_name": "Coltrane" }, { "id": 2, "username": "frodo", "first_name": "Bilbo", "last_name": "Baggins" }, ], ... }
示例-格式转换:
{ "identities": [ { "id": 1, "username": "john", "firstName": "John", "lastName": "Coltrane" }, { "id": 2, "username": "frodo", "firstName": "Bilbo", "lastName": "Baggins" }, ], ... }
管理尾随斜杠
默认情况下,django期望url上有一个尾随的斜杠,并将301重定向任何 缺少尾随斜杠的请求。您可以在旁边更改服务器 像这样实例化django rest框架的路由器:
router = routers.SimpleRouter(trailing_slash=False)
如果不使用simplerouter,则可以将append_slash设置为false 在django的settings.py文件中,修改url模式regex以匹配路由 没有斜线。
如果希望在客户端进行更改,请添加 应用程序适配器到Ember应用程序并重写buildUrl方法:
App.ApplicationAdapter = DS.RESTAdapter.extend({ buildURL: function() { var url = this._super.apply(this, arguments); if (url.charAt(url.length -1) !== '/') { url += '/'; } return url; } });
显示服务器端验证消息
成员数据不附带验证错误的默认实现 处理程序,但在Rails ActiveModelAdapter中除外,以便显示验证错误 您需要添加一个小型客户端适配器:
App.ApplicationAdapter = DS.RESTAdapter.extend({ ajaxError: function(jqXHR) { var error = this._super(jqXHR); if (jqXHR && jqXHR.status === 400) { var response = Ember.$.parseJSON(jqXHR.responseText), errors = {}, keys = Ember.keys(response); if (keys.length === 1) { var jsonErrors = response[keys[0]]; Ember.EnumerableUtils.forEach(Ember.keys(jsonErrors), function(key) { errors[key] = jsonErrors[key]; }); } return new DS.InvalidError(errors); } else { return error; } } });
当响应具有 400状态码。根键(本例中为“post”)被丢弃:
{ "post": { "slug": ["Post with this Slug already exists."] } }
要显示所有错误,请将以下内容添加到模板:
{{#each message in errors.messages}} {{message}} {{/each}}
要显示特定的内联错误,请使用以下命令:
{{#each errors.title}} <div class="error">{{message}}</div> {{/each}} {{input name="title" value=title}}
侧装资源
如果全局使用json呈现程序,这可能会导致问题 当命中要侧加载其他对象的端点时。
例如:
{ "users": [], "cars": [] }
将对象的resource_name属性设置为False,然后 将按上述方式返回。
下面的MIXIN类可用于REST框架 资源。
重写get_queryset以按URL查询参数中的ids[]进行筛选。