提供成员数据支持的django rest框架适配器。当jsonapi.org达到1.0时,这个适配器计划采用它。

rest_framework_ember的Python项目详细描述


https://travis-ci.org/django-json-api/rest_framework_ember.svg?branch=master

默认的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
    }
}

要求

  1. Django
  2. 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.JSONParserrest_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,然后 将按上述方式返回。

< H2>混合蛋白< /H2>

下面的MIXIN类可用于REST框架 资源。

RestyFraskWork.Boo.Mixin。

重写get_queryset以按URL查询参数中的ids[]进行筛选。

欢迎加入QQ群-->: 979659372 Python中文网_新手群

推荐PyPI第三方库


热门话题
试图读取字段“java”。lang.反对安卓。util。一对首先   gradle对java的影响。属性作为任务的输入?   java我的return语句不起作用。我做错了什么?   java通用同步代码块[无对象锁定]   macos Java小程序游戏不能在Mac上运行,即使它可以在PC上运行   java Firebase GeoFire设置位置未在服务中工作   java排序字符串对象   java通过JLabel上传背景图像(jpg)后,如何将图像缩放到它所在的面板上?   java无法连接到jsp中的数据库   java如何在整个ant taskdef操作的执行过程中拥有一个singleton类实例   java如何在按键事件中检查JTtextField中的字符串数字验证器   如何最好地输出大型单行XML文件(使用Java/Eclipse)?   内存不足,Java运行时环境无法在Java应用程序中继续运行   java Hibernate连接错误:组织上的NullPointerException。冬眠hql。阿斯特。HqlSqlWalker。createFromJoinElement   linux将参数从shell脚本传递到java类   java对于接受多个参数的setter是否有类似于@JsonCreator的注释?   java在链表中添加节点