对等应用同步协议

flocksync的Python项目详细描述



什么是flock
==


flock是一个分布式应用同步系统。它允许您构建不需要任何web服务器的web应用程序。每个用户的计算机都作为应用程序的一部分工作。flock的目标是使更多的网站分布,这意味着更少的中央控制。

flock准备好使用了吗?
——
现在,flock已经为开发人员和savy命令行用户做好了准备。我们计划在不久的将来为OSX和Windows安装程序,以使安装过程更容易。此外,我们仍然是1.0之前的版本,因此可能仍会发生破坏兼容性的更改。


————————————————————————————————————————————————————————————————————————————————————————————————
----
首先,启动flock服务:

`````
flock-d<;storage戥dir>;
````

`<;storage戥dir>;`是flock存储文件的路径,这些文件是您使用或创建的各种应用程序的一部分。

完成后,您需要加入一个或多个"应用程序"。如果要开发新应用,请参阅"开发应用"部分。要加入应用程序,您需要知道应用程序的ID号。现在,作者正在运行一个名为"5A6961CA9A2D774B2A53E7F4B93D285CBA586AC3"的"测试应用程序"。我们计划创建一个Web界面,用于查找和连接内置的新应用程序,但目前,您需要使用curl。


若要加入应用程序运行:

`````
curl-v-x post--header"content type:application/json"localhost:8000/<;id>;/加入应用程序-d'{}
```

where`<;id>;`被应用程序的ID替换,例如:

```
curl-v-x post--header"content type:application/json"localhost:8000/5a6961ca9a2d774b2a53e7f4b93d285cba586ac3/join_app-d'{}
```

是的,这真的很难看,不用担心,我们很快就会修复它。加入应用程序后,打开浏览器并转到:

```
http://localhost:8000/<;id>;/index.html
```

,其中`<;id>;`将再次替换为应用程序的ID。现在,我们不会自动重定向到index.html,您必须这样做。

ory在flock源中。

首先,您需要创建一个新的应用程序,这只是一个post:

````
curl-v-x post--header"content type:application/json"localhost:8000/create-app-d'{}
````

您可以"放置"和"删除"站点的静态内容,例如:

```
curl-v-x put--header"内容类型:text/html"localhost:8000/<;id>;/index.html--data binary@index.html
````

,因为这有点烦人,请参阅flock source f中包含的"示例"应用程序或者一些shell脚本的一个例子,让它更容易一些。在近期内,我们将添加一个批量复制功能(或寻找一些现有的工具)。需要注意的一点是:put中使用的内容类型是用户在获取内容时将获得的内容类型。


如果您只需要一个静态站点,就可以了。任何用户都可以加入你的应用程序,内容将同步到他们。只要至少有一台机器启动(包括您的机器或任何用户的机器),新用户就可以获得最新的数据。如果您对内容进行任何更改,下次您联机时,它们将自动同步到网络的其他部分。值得注意的是,更改通常是"按顺序"同步的,但是只有任何内容的最新版本才会同步。还要注意,内容的总大小有一个限制,which通常设置为100 MB左右,单个文件通常限制为10 MB,因此不要尝试上载您的电影集。

Action逻辑存在于客户端,但Flock后端执行同步、保留和允许搜索用户"记录"的重要工作。它的工作原理如下:

1)任何用户都可以"发布"一条记录,这只是一个json对象。通常,您的应用程序将通过ajax调用为用户执行此操作。

2)这些记录与每个人同步。为了防止垃圾邮件,我们使用基于工作令牌的系统(在协议详细信息中描述)。

<3)基于应用程序所有者定义的"架构",这些记录被放入每个用户计算机上的sqlite3数据库中,其中可以包含所需的任何索引

<4)应用程序然后可以通过ajax调用对生成的数据库运行任意只读查询。

hema
----

让我们先谈谈模式。模式将json记录对象转换为数据库行。如果发布的行与架构不匹配,它仍将被同步,但不会在数据库中结束。一般来说,真正的数据是json表单,模式将其映射到数据库表单,但是同步和存储层并不关心模式。这意味着可以更新模式并保留现有数据,如果它与模式匹配,则将重新映射这些数据。这允许进行合理的更新。

schema定义一组表,对于每个表,定义一组列。现在,当我们使用数据库来方便索引和查询时,请注意这里的数据库实际上就是这样,一种索引和查询的方法。由于同步层的性质,诸如唯一索引、外键等将不起作用,因此不要太依赖sql概念。

每个表依次是一个json对象,由字段组成,这些字段只是"类型"(int、text等)。索引只是一个索引列表,对于每个索引,表后面跟着要索引的字段(注意,两个索引表示两个条目,一个包含多个字段的条目将构成一个复合索引)。

":{
"user":{
"handle":"text",
"pub-key":"text"
},
"post":{
"user-id":"text",
"link":"text",
"title":"fulltext",
"text",
"s签名":"text"
},
"comment":{
"parent-id":"text",
"user-id":"text",
"text":"fulltext"
"signature":"text"
}
"index":[
["user","handle"],
"index"["post","timestamp"],
["comment","parent_id"],
["post","score"],
["user","score"],
],
}
`````


首先,请注意每个表都有三个"隐式"字段,分别是:

`id text`:每个"记录"的唯一文本字段(sha256的base64)'added
`timestamp in t`:上次添加记录或'upvotes'时。
`score real`:此记录的分数(newness+upvots的函数)



其次,类型只能是"int"、"real"(或float)、"text"或"fulltext"。两者的区别xt`和'full text'决定是否应用sqlite3全文索引魔术。这也会使查询复杂化,下面将解释这些查询。

todo:解释全文,通常,编写更多有关架构的信息

ve,只需"添加记录"。此文章的内容类型必须为"application/json"。通常,记录将是json对象。其中一个字段是'\u table',该字段确定要将记录放入架构中的哪些表。其余字段是列(不包括"隐式"列)。例如:

```
{"U表":注释,
"父ID":"0afavnb2avsdfa<;etc>;…=",
"用户ID":"0hacxksfa0as<;etc>;…=",
"文本":"我真的很喜欢你的帖子,希望永远是你的朋友",
"签名":"<;魔法公钥goo"
}
```

add-record post的返回将是:
```
{"success":true,"id":"ab053xga<;etc>;.=="}

,其中id当然是新生成记录的id。此数据现在将与所有人同步,并输入数据库。注意,如果记录和架构的字段不匹配,则会发生以下情况:


1)如果表不存在,则记录将不会出现在数据库中(尽管仍将同步)
2)如果架构中不存在某些字段,则将忽略它们当将它们输入数据库时,3)如果数据库中缺少某些字段,将为它们提供"默认"值。

同样,内容类型必须是'application/json'。查询有两个字段,"query",这是一个sql查询,可能有一些参数,"params",这是一个列表或带有参数值的对象。例如:

````
{
"查询":"选择id,从handle=?的用户中评分",
"params":["melvin"]
}
````

这将返回一个行列表,每个列都是一个列列表,例如:
```
{
成功:真,
结果:[["hs0zxf0<;etc>;…",1023.17]["0hacxksfa0as<;etc>;…",20.17]]
}
```


通常返回500个状态,错误出现在消息中。




developing flock
==


首先,确保删除flock的任何PIP安装。在开发过程中,很容易意外地加载库的"系统"版本,从而导致许多混乱。其次,查看github中的内容。最后,由于flock被打包用于安装/pip,因此要直接从开发环境中运行它,请使用:

`````
pythonpath=`pwd`./scripts/flock-d<;storage\u path>;
````

r/>pythonpath=`pwd`./flock/sync
``


还要注意:尽量使代码通过pylint


protocol details
==




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

推荐PyPI第三方库


热门话题
当IntellijIDEA打开时,java Gluon SceneBuilder不会打开FXML文件   java在启动tomcat后执行某些操作   如何在Java中使用Google Cloud语音API在识别语音时录制音频   Java端口转发性能   写入Java项目文件夹中的txt文件   使用java中的命令提示符cmd   对象类型方法的java assertequal   java如何通过应用程序在设备上更新Android操作系统   java是否可以在@BeforeClass注释方法中运行Android Espresso单元测试?   java如何使用JMS API将NACK从Solace侦听器发送到Solace队列?   如何将Java和C集成到同一个项目中?   Android中的java安装\u失败\u冲突\u提供程序   java时间输入和显示   使用GAE数据存储对实体用户进行java身份验证时返回null   netbeans向Java运行时添加本机DLL时出现问题(JIntellitype)