小编Bor*_*kov的帖子

如何在RESTful API中处理多对多关系?

想象一下,你有2个实体,玩家团队,玩家可以在多个团队中.在我的数据模型中,我有一个每个实体的表,以及一个用于维护关系的连接表.Hibernate可以很好地处理这个问题,但是我如何在RESTful API中公开这种关系呢?

我可以想几个方面.首先,我可能让每个实体都包含另一个实体的列表,因此Player对象将拥有它所属的Teams列表,并且每个Team对象都有一个属于它的Players列表.因此,要向团队添加播放器,您只需将播放器的表示形式发布到端点,例如POST /player或POST /team,并将相应的对象作为请求的有效负载.这对我来说似乎是最"RESTful"但感觉有点奇怪.

/api/team/0:

{
    name: 'Boston Celtics',
    logo: '/img/Celtics.png',
    players: [
        '/api/player/20',
        '/api/player/5',
        '/api/player/34'
    ]
}

/api/player/20:

{
    pk: 20,
    name: 'Ray Allen',
    birth: '1975-07-20T02:00:00Z',
    team: '/api/team/0'
}
Run Code Online (Sandbox Code Playgroud)

我能想到的另一种方法就是将关系本身作为一种资源来揭露.因此,要查看给定团队中所有玩家的列表,您可以执行GET /playerteam/team/{id}或类似的操作并获取PlayerTeam实体列表.要将球员添加到球队,请/playerteam使用适当构建的PlayerTeam实体作为有效负载进行POST .

/api/team/0:

{
    name: 'Boston Celtics',
    logo: '/img/Celtics.png'
}

/api/player/20:

{
    pk: 20,
    name: 'Ray Allen',
    birth: '1975-07-20T02:00:00Z',
    team: '/api/team/0'
}

/api/player/team/0/:

[
    '/api/player/20',
    '/api/player/5',
    '/api/player/34'        
]
Run Code Online (Sandbox Code Playgroud)

这是什么最好的做法?

rest entity-relationship

276
推荐指数
5
解决办法
8万
查看次数

如何使用nvm正确升级节点

是否可以直接升级node,而不是手动安装最新的稳定版本?

我已经安装了Node.js的版本5.0nvm,但现在我想将其更新到5.4.我试图避免手动重新安装我的所有全局包(例如通过运行npm install -g grunt-cli bower yo yoman-angular-generator blabla blablablabla...).

package-management node.js npm nvm

184
推荐指数
7
解决办法
11万
查看次数

如何让docker-compose始终从新图像重新创建容器?

我的docker镜像是在Jenkins CI服务器上构建的,并被推送到我们的私有Docker Registry.我的目标是使用docker-compose配置环境,它始终启动图像的最初构建状态.

我目前在不同的机器上使用docker-compose 1.3.2以及1.4.0,但我们之前也使用过旧版本.

我总是使用docker-compose pull && docker-compose up -d命令从注册表中获取新图像并启动它们.我相信我的首选行为在某个时间点按预期工作,但从那时起docker-compose up开始重新运行先前停止的容器,而不是每次都启动最初构建的映像.

有没有办法摆脱这种行为?这种方式可能是在docker-compose.yml配置文件中连接的,在每次调用时都不依赖于"忘记"命令行中的某些内容吗?

PS.除了找到实现目标的方法之外,我还想更多地了解这种行为的背景.我认为Docker的基本思想是构建一个不可变的基础架构.docker-compose的当前行为似乎与这种方法完全冲突..或者我在这里错过了一些观点?

docker docker-compose

161
推荐指数
8
解决办法
13万
查看次数

gdb:如何打印当前行或查找当前行号?

list 命令打印一组行,但我需要一行,我在哪里,可能发生错误.

debugging gcc gdb

84
推荐指数
5
解决办法
8万
查看次数

Webpack:如何使角度自动检测jQuery并将其用作angular.element而不是jqLit​​e?

我正在使用Webpack构建一个Angular 1.4项目.该项目使用了几个jQuery插件,这些插件包含在angular指令中.那些指令在内部使用angular.element,可能暗示angular.element是真正的jQuery,而不是jqLit​​e.

我想使用angular来自动检测jQuery并使用它代替jqLit​​e.我试图在我的入口点模块中本地需要jquery app.js:require('jquery')并使用全局公开jQuery require(expose?$!expose?jQuery!jquery).

不过,无论我做什么,都angular.element指的是jqLit​​e.


我的研究得出了一些结论:

  1. 即使作为CommonJS模块导入,Angular也会将自己分配给一个全局变量window.angular,所以我不需要expose使用Webpack:当作为CommonJS模块加载时,Angular会将自身全局分配给`window.angular`吗?.
  2. ProviderPlugin似乎没有做到这一点:它没有将jQuery暴露给全局命名空间; 相反,对于依赖于全局名称jQuery的每个模块,它都会插入require('jquery')其中.我不是100%肯定,但看起来像角不访问jQuery直接,相反,它试图访问从全局命名空间window.jQuerybindJQuery的功能,所以这也是没有办法:暴露了jQuery用的WebPack真正的Window对象.
  3. 出于与ProviderPlugin相同的原因,imports-loader似乎不合适:Angular想要window.jQuery,而不仅仅是jQuery.
  4. 使用expose-loader,jquery使它成为窗口对象.我的问题是,Babel将其所有导入提升到生成的代码中的模块顶部.因此,虽然在源文件require(expose?jquery!jquery)之前,但是在jquery之前import angular from "angular",bundle require("angular")中位于文件的顶部,因此在导入Angular时,jquery尚不可用.我想知道,如何使用带有ECMA6导入语法的Webpack加载器.
  5. 有人建议使用import语法而不是require语法与jquery:import "jquery"或者import $ from "jquery",不是require(jquery):(Petr Averyanov:如何使用ECMAScript 6导入的Webpack加载器语法(导入/导出/公开)?).jquery源代码包装有一个特殊的包装器,它确定了如何需要jquery(使用AMD/require,CommonJS或global with <script>语句).基于此,它 …

jquery angularjs webpack

39
推荐指数
2
解决办法
1万
查看次数

如何在另一个模块中设置断点(如果要在函数开始执行时中断,请不要在函数定义行上设置断点)

我正在尝试调试模块"main",它在"another_module"的第356行调用一个函数"broken_function".我在该函数中遇到错误,并希望在其开头添加断点.以下是列表.难道我做错了什么?原因,断点不起作用:

$ python -m pdb main
(Pdb) import sys
(Pdb) sys.path.append("/home/user/path/to/another/module")
(Pdb) import another_module
(Pdb) b another_module:356
Breakpoint 1 at /home/user/path/to/another/module/another_module.py:356
(Pdb) c
Traceback (most recent call last):
...
File "/home/user/path/to/another/module/another_module.py", line 383, in broken_function
f=open("../jobs/temptree.tre", "r")
IOError: [Errno 2] No such file or directory: '../jobs/temptree.tre'
Uncaught exception. Entering post mortem debugging
...
Run Code Online (Sandbox Code Playgroud)

python pdb

34
推荐指数
2
解决办法
2万
查看次数

内核如何知道虚拟地址空间中的哪些页面对应于换出的物理页面框架?

请考虑以下情况:内核耗尽了物理RAM并需要换出页面.它选择最近最少使用的页面框架,并希望将其内容交换到磁盘并将该框架分配给另一个进程.

困扰我的是,这个页面框架已经映射到一般来说,几个(相同的)几个进程的页面.内核必须以某种方式找到所有这些进程并将页面标记为已换出.它是如何实现的?

谢谢.

编辑:问题的插图:

在交换过程1和2之前有一个共享的Page 1,它位于物理内存帧1中:

在此输入图像描述

现在,系统中的内存耗尽,内核通过从第1帧交换第1页并将其替换为第2页来为进程3分配内存.为了做到这一点,它必须

1)找到所有流程,参考第1页(在我们的案例中为流程1和流程2)

2)修改其页表条目,将"Present"位设置为0并在Swap中设置Page 1位置

在此输入图像描述

所以,我不知道,第1步是如何进行的.内核不能只是迭代地查看每个进程的页表,以便找到指向第1帧的页表条目.应该存在从页框到页表条目的某种反向映射.

答案是:

"页表管理最重要和最重要的变化是引入了反向映射(rmap).将其称为"rmap"是故意的,因为它是"首字母缩略词"的常见用法,不应与-rmap混淆由Rik van Riel开发的树,它对库存VM的更多改动而不仅仅是反向映射.

在一个句子中,rmap授予定位所有PTE的能力,这些PTE仅在给定结构页面的情况下映射特定页面.在2.4中,找到映射共享页面的所有PTE(例如内存映射共享库)的唯一方法是线性搜索属于所有进程的所有页表.这太昂贵了,Linux试图通过使用交换缓存来避免这个问题(参见11.4节).这意味着对于许多共享页面,无论页面使用时间和使用模式如何,Linux都可能必须更换整个进程.2.6而是有一个与每个结构页面相关联的PTE链,可以遍历该页面以从引用它的所有页面表中删除页面.这样,LRU中的页面可以以智能方式交换出来,而无需交换整个过程."

了解Linux内存管理,"Linux2.6中的新功能"

kernel memory-management virtual-memory mmu

30
推荐指数
1
解决办法
6211
查看次数

Docker和netstat:netstat没有显示由docker容器公开的端口

我将我的容器的docker端口暴露给主机

docker run -p 80:80 ...
Run Code Online (Sandbox Code Playgroud)

然后我尝试显示所有监听端口以进行调试,netstat例如:

netstat -at
Run Code Online (Sandbox Code Playgroud)

奇怪的是,netstat不会显示具有暴露端口的docker容器,尽管他们正在监听并回复浏览器.

如何netstat显示这些暴露的端口?


更新: 我在Debian 8 Jessie上运行它.这是我做的:

docker ps -a
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS                      PORTS                                      NAMES
9dfa08bab50d        workflows-nginx     "/bin/sh -c '/usr/sbi"   2 hours ago         Up 2 hours                  0.0.0.0:80->80/tcp, 0.0.0.0:443->443/tcp   workflows-nginx
d0b0c3f90f13        workflows-django    "/bin/sh -c 'python /"   7 hours ago         Up 3 hours                  0.0.0.0:8000->8000/tcp                     workflows-django
99a857c92533        workflows-db        "/docker-entrypoint.s"   7 hours ago         Up 3 hours                  5432/tcp                                   workflows-db
Run Code Online (Sandbox Code Playgroud)

这里docker报告容器端口被转发到主机.此外,如果我停止workflows-nginx容器,它将停止通过http(端口80)回答浏览器.如果我再次启动它,它会再次开始响应.

这是输出sudo netstat -at | less:

Active …
Run Code Online (Sandbox Code Playgroud)

netstat docker

28
推荐指数
3
解决办法
2万
查看次数

WSGI:start_response函数的目的是什么

你能提供一个WSGI start_response功能的真实例子吗?(Web服务器为wsgi应用程序提供该功能)

我无法理解引入的目的start_response.

(我喜欢阅读有关WSGI标准的10个相同的文本.他们都说"WSGI标准是......"他们没有说"WSGI设计这样才能 ......" :()

python web-services middleware wsgi web-applications

14
推荐指数
1
解决办法
8113
查看次数

Django REST框架:序列化程序上下文如何工作?

Django REST Framework中的一个非常标准的任务是提供附加args/ kwargs序列化程序,以设置不通过设置的字段值request.data,但通过url参数或cookie中的值.例如,我需要将user我的Comment模型的字段设置为等于request.userPOST请求.这些额外的参数称为上下文.

几个问题(1,2 StackOverflow上)认为我重写get_serializer_context()我的方法ModelViewSet.我做了,但没有帮助.我试图理解,出了什么问题,并发现我从源代码中无法理解,这个上下文系统应该如何工作.(关于此事的文件也缺失了)

任何人都可以解释,序列化程序在正常请求数据中添加上下文?我发现了两个地方,它从上下文中保存了值.

  1. serializer.save(),方法,它将kwargs与验证数据混合,但通常不带参数调用(例如,通过ModelMixins).
  2. 领域.__new__(),它缓存args和kwargs,但似乎以后没有人读过它们.

django-rest-framework

12
推荐指数
1
解决办法
1万
查看次数