目录 style="font-s..." />

文化图谱表示学习与涉及推理(二零一四-语言2017)(二)

小编:整理2015-二〇一七年ACL、EMNLP、SIGI凯雷德、IJCAI、AAAI等国际著名会议中实体关系推理与学识图谱补全的连带诗歌,供自然语言处理切磋职员,越发知识图谱领域的我们参考,如有错误了解之处请提议,不胜感谢!(如需转发,请联系本身:jtianwen2014,并注明出处

style=”font-size: 18pt;”>目录

style=”font-size: 14pt;”>前言

style=”font-size: 14pt;”>1
准备干活

style=”font-size: 14pt;”>2
具体贯彻

EMNLP 2016

 

A Position Encoding Convolutional Neural Network Based on Dependency Tree for Relation Classification

  • 作者:Yunlun Yang, Yunhai Tong, Shulei Ma, Zhi-Hong Deng
  • 机构:School of Electronics Engineering and Computer Science,
    Peking University

本文的任务为涉及分类,即对于给定句子中的给定实体对开始展览关联分类。本文叙述,守旧特色选用的主意严重信赖于特征的品质以及词语能源,为了完结最优往往必要耗费时间的人工采用特征子集。基于核函数的不二法门纵然不要选拔特征,但仍需精心设计的核函数并拥有较大的乘除费用。近期,随着神经互联网的兴起,深度学习所提供的端到端的方法被运用于广大经典的自然语言处理难点。君越NN和CNN已经被证实对关联分类具有巨大协助。

但是,一些探究工作表明古板的风味对于涉及分类的神经网络方法仍有拉长效率,能够提供更加多的消息。三个粗略而卓有功能的点子是将词语级的性情和神经互联网获取的特色简单组合(一般是连接起来),组合后的代表输入到分类器。另一种特别错综复杂的艺术是依据句子的句法依存树调整神经网络的布局,取得了较好的功力。

正文认为,句法依存树在论及分类的职务上是很有价值的。正文发现实体对间的存活路径对关系分类更有价值,相比于完整句子的幸存路径,由于其存世路径的偏离往往小于句子的依存路径距离,剪枝后的实业间依存路径收缩了广大噪信息息。为了更好的运用句法依存所提供的言语学知识,本文建议了基于句法依存树和的职分编码卷积神经网络方法PECNN。方法的历程图如下:

语言 1 

各种词的代表由两有的组成:词向量、该词的依存树地方特征。地方特征的拿走首要思想是将离散的职务映射到实数向量,它和词向量相似,只可是是将词替换为离散的距离。正文提议了三种艺术来定义依存树中的地点特征TPF壹 、TPF2。TPF第11中学距离定义为近日词到目的实体的最短路径中依存弧的个数,映射方式和PF相同,即区其他相距随机开头化一个永恒维度的向量,练习的历程中学习。三个词到实体的最短路径能够分开为多个子路径:被压低祖先节点分割,TPF2则将偏离用二元组表示,分别代表四个子路径的长度。下图是各样词语到实体Convulsions的TPF1与TPF2:

语言 2 

优异的CNN的1个卷积窗口每便获得当前词的贴近上下文词语作为输入,在本文中为了丰盛利用树结构新闻,本文将如今词的父节点和子节点作为作为其临近上下文输入到卷积窗口,相应的正文对卷积核也做了修改,采纳了二种卷积核:Kernel-壹 、Kernel-2,具体定义见杂谈。个中Kernal-1意在从依存树中多层次抽取特征,而Kernel-2专注于发掘共享父节点的词之间的语义新闻。多个核函数的分寸均取3。最后将Kernel-一 、Kernel-2分别池化并拼接在联合营为CNN输出。

作者:本文利用卷积神经网络对实业关系进展分拣,革新性地将依存树作为输入,将词在树中的地方新闻嵌入式表示并拼接到词向量中一道学习,同时,本文对CNN面向树结构划设想计了特其余卷积核。本文建议的不二法门在实体关系分类职务上,比较于未使用地方新闻的CNN和LSTM取得了进一步提升。在实验中本文也将POS等特征融入PECNN,也得到了较好的结果。但文中就像未深究卷积核设计对结果的影响,面向树结构的卷积核的宏图是不是是本文独立建议的?读者可参看文中参考文献探寻一下。

 

Jointly Embedding Knowledge Graphs and Logical Rules

  • 作者:Shu Guo, Quan Wang, Lihong Wang§, Bin Wang, Li Guo
  • 机构:Institute of Information Engineering, Chinese Academy of
    Sciences

本文的职分为文化图谱表示学习,本文指出逻辑规则包罗丰盛的背景音信,但始终不曾很好的在知识图谱表示学习的天职上被商量。本文建议KALE的不二法门,将文化图谱与逻辑规则进行共同嵌入表示学习。

事先有专家同时接纳知识表示方法和逻辑规则,但互相是分离建立模型的,那也使得尚未得到更好的嵌入式表示。Rocktaschel
et al.
(2015)
提出协同模型将一阶逻辑融入嵌入式表示,但那项工作专注于关系分类,对实体对进展停放表示仅创立3个向量表示,而不是实业拥有各自的代表。

KALE方法可分为三个部分:三元组建立模型、逻辑规则建立模型,以及一块学习。1个完好无损的办法框图如下图所示:

语言 3 

对此三元组建立模型部分使用简便的翻译模型(TransE衍生)完结,具体的打分函数如下:

\[I(e_i, r_k, e_j)=1-\frac {1}{s\sqrt
{d}}||\mathbf{e}_i+\mathbf{r}_k-\mathbf{e}_j||_1\]

对此逻辑规则建模部分,本文使用t-norm模糊逻辑(t-norm fuzzy
logics),本文主要考虑三种档次的逻辑:第叁类是:\(\forall x,y: (x,r_s,y)\Rightarrow
(x,r_t,y)\),给定\(f\triangleq
(e_m,r_s,e_n)\Rightarrow
(e_m,r_t,e_n)\),置信度的总结如下:

\[I(f)=I(e_m,r_s,e_n)\cdot
I(e_m,r_t,e_n)-I(e_m,r_s,e_n)+1\]

其中,\(I(\cdot ,\cdot
,\cdot)\)是伊利组建模时的置信度函数。

其次类是:\(\forall x,y,z:
(x,r_{s1},y)\land (y,r_{s2},z)\Rightarrow
(x,r_t,z)\),给定\(f\triangleq
(e_l,r_{s1},e_m)\land (e_m,r_{s2},e_n)\Rightarrow
(e_l,r_t,e_n)\),置信度的计量如下:

\[I(f)=I(e_l,r_{s1},e_m)\cdot
I(e_m,r_{s2},e_n)\cdot I(e_l,r_t,e_n)-I(e_l,r_{s1},e_m)\cdot
I(e_m,r_{s2},e_n)+1\]

联机学习的长河同样是时整治长富组的置信度远高于负例伊利组的置信度。

值得注意的是,就算规则唯有三种,但为了采用于实际必须找到规则的关联实例,为了化解人工的下压力,本文使用了半机关的方式协会规则关系实例。其艺术是,先是选用TransE学习到实体和关联的意味,为可能存在那三个逻辑规则的实体关系计算置信度,然后开始展览排序,进而采取适合逻辑规则的实业关系实例。局地实例如下:

语言 4 

笔者:本文提议将逻辑规则融入文化图谱嵌入式表示学习的不二法门,并且逻辑规则和雅士利组的读书是一同开始展览的。方法提高的瓶颈仿佛在逻辑规则的抉择与实例的结构上,本文使用了本活动的主意营造,固然这一有个别并非本文重点,但真正该方法是够有效可以应用于周边知识图谱的关键,本文对FB15K创设了4七个规则实例,但对此广泛知识图谱那一个规则还远远不够,那种规则的办法存在移植性的题材,是或不是足以设想使用随机游走获取此类逻辑规则,类似PRA中利用的章程。其它,将关联路径融入表示学习的方法和本文的法门相比接近,实质上都以行使关乎路径去演绎关系。


Mining Inference Formulas by Goal-Directed Random Walks

  • 作者:Zhuoyu Wei, Jun Zhao and Kang Liu
  • 作者:University of Chinese Academy of Sciences

本文的职务为面向知识图谱的实体关系推理,即采用知识图谱中已有的涉及推理新的关系事实。推理规则对于基于知识图谱的涉及推理有着分明的意义,而人工构造大量的推理规则是不具体的。方今依照数据驱动的机动挖掘推理规则的主意中,随机游走的法门被认为最适用于文化图谱。不过,在学识图谱中无指标的一味随机游走挖掘有价值的推理规则的效能较低,甚至会引入误导的推理规则。固然一些专家建议应用启发式规则引导随机游走,但鉴于推理规则的多样性,那种办法仍回天乏术获得较好的效劳。

本着上述现状,本文提议一种指标引导的推理规则挖掘算法:在自由游走的每一步使用明确的演绎目标作为方向。具体地,为了达到目的教导的体制,在每一步随机游走的长河中,算法依照最终目标动态地打量走向各种邻居的神秘或许性,依据潜在或者性分配游走到各种邻居的可能率。比如,当推理“一人的语言”时,算法更倾向走“国籍”边而非“性别”边。

正文首先想起了主导的用来推理规则挖掘的自由游走算法,当中也关系早期基于枚举的(枚举给定满足关系的实体对中间的装有途径)根据频率计算置信度的演绎规则挖掘算法。随机游走算法随机地(概率均等,和出度有关)选拔下一跳到达的邻里,而非遍历全数邻居。同理可得,那种随意游走的算法是独立用目的的。而且,由于随机性,随机游走无法确认保证高速低挖掘到对象实体对的路径,甚至引入噪声。为了缓解这一题材,PRA引入了启发式的规则:对概率矩阵展开改动,是的邻里的选料并不均等,而是依照到达目标实体的或许。

为了完结目的指导的任意游走,本文对给定指标(\(\rho=R(H,T)\))的境况下,对实业\(i\)到\(j\)的连边g(关系\(r\))被挑选的概率定义为:

\[ P_{r_{i,j}}= \begin{cases} \frac
{\Phi (r(i,j),\rho)}{\sum_{k\in Adj(i)}\Phi (r(i,j),\rho)},
&\mbox{}j\in Adj(i)\\ 0, &\mbox{}j\notin Adj(i) \end{cases}
\]

其中,\(\Phi(r(i,j),\rho)\)是在加以指标\(\rho\)情况下,对实体\(i\)到\(j\)的连边被增选的只怕度量。路径的落脚点为\(H\),最后要到达\(T\),游走的进程中递归定义已走路径的似然为:\(P_{pHt}=P_{pHs}\cdot
P_{r_st}\)。似然函数定义为:

\[\rm{max}
P_{\mathbb{P}}=\prod_{pHt\in
\mathbb{P}}P_{pHt}^{a}(1-P_{pHt})^{b+c}\]

其中\(\mathbb{P}\)是随机游走获得的门道集合,\(a,b,c\)分别对应二种意况,a)\(t=T\)且产生不利的演绎规则;a)\(t\not=T\);c)\(t=T\)且爆发噪音推理规则;\(a,b,c\)都以0-1值,且每回有且唯有3个为1。将最大化转为最小化\(L_{rw}=-\rm{log}
P_{\mathbb{P}}\),本文中又将该对象函数划分为两片段来计量:\(L_{rw}=L_{rw}^t+\lambda
L_{rw}^{inf}\)。对于三个家喻户晓的路线\(p\),\(L_{rw}\)能够写为:

\[L_{rw}(p)=-y\rm{log}
P_{p}-(1-y)\rm{log} (1-P_{p})\]

\(\Phi(r(i,j),\rho)\)的乘除必要融入文化图谱全局的消息,为了减弱总计量,本文引入知识图谱的嵌入表示来计量\(\Phi\):

\[\Phi(r(i,j),\rho)=\Psi(E_{r(i,j)},E_{R(H,T)})\]

其中,\(\Psi(E_{r(i,j)},E_{R(H,T)})=\sigma(E_{r(i,j)}\cdot
E_{R(H,T)})\),\(E_{r(i,j)}=[E_r,
E_j]\),\(E_{R(H,T)}=[E_R,
E_T]\),\(E_r,E_j,E_R,E_T\)代表提到和实体的嵌入式表示。

教练推理模型的算法如下:

语言 5

末段的推理是选拔打分函数,对明确实体对的两样关系进展打分:

\[\mathcal{X}(\rho)=\sum_{f\in
F_{\rho}}\delta(f)\]

其中,\(F_{\rho}\)是随便游走为涉及找到的演绎规则集合,\(\delta(f)=w_f\cdot
n_f\)。最终本文应用逻辑斯谛回归来对实业关系可能率实行总计:

\[P(\rho =
y|\mathcal{X})=\mathcal{F}(\mathcal{X})^y(1-\mathcal{F}(\mathcal{X}))^{1-y}\]

\[\mathcal{F}(\mathcal{X})=\frac{1}{1+e^{-x}}\]

小编:对于随意游走的无对象指引从而导致推理规则挖掘作用低并引入噪声的标题,本文在随心所欲游走的每一步引入指标的点拨,即基于路径对指标完毕的恐怕性总结游走到各种邻居的概率,而不是随机选择。

前言

方今在捣鼓怎么样运用Ali云服务器搭建叁个简易的基于Flask框架的后端接口,刚初阶为了图方便,就平昔买了1个Windows
Server 2010体系服务器,那也埋下了十分的大的坑。

 

劳动买下来后,会给您三个公网IP和内网IP,由于是率先次学习搭建后端接口,对于怎样科学行使阿里云服务器,来拍卖好公网IP和内网IP之间的涉及埋下了十分的大的坑,真是对应的一句话:技术的成材往往是一步3个坑。

 

下边简单说一下搭建Flask服务器端碰到的题材:

先是,Flask自带了二个服务器,直接动用很有利,但是这一个服务器的习性太低,可是对于调节和测试和读书大概绰绰有余。刚初阶把代码放到Ali云服务器上,并跑通后,测试接口时公网IP不可能访问,那时自个儿认为是Flask自带服务器的标题,即因为Flask自带服务器原因造成力不从心利用公网IP访问。

 

那么,难点出现了,就要摸索消除办法吧,网上检索资料交给参照意见:使用nginx
+gunicorn来配置Flask相关服务,能够制止公网IP不或许访问难题。然后,作者就去找资料,安装gunicorn,结果运营测试时平昔报错,最终发现gunicorn不支持Windows系统,那也太坑了,早知道自家当下买服务器时就不应当图便宜,直接买三个基于Linux的系统了。

 

今昔,新的题材又来了,既然不能够利用nginx
+gunicorn来陈设Flask相关服务,那就要动用别的格局来缓解吧,网上资料参照结果:使用tornado。好,那么小编又来查看学习tornado安顿应用开发文书档案,依据支付文档布署完成后,在服务器上跑通后,发现依旧无法应用公网IP实行接口访问和测试。

 

到了那里,就让作者反省,这些难道真是Flask布署应用服务器难题呢?后来,就在网上找到了一篇关于Ali云公网IP不可能访问难题的小说,发现那一个需求团结去Ali云官网上去配置安装。

 

即以上碰到的题材,压根就不是Flask陈设服务器难点,是团结不曾搞通晓Ali云服务器如何利用的难题……

 

具体配置安装格局见:Ali云服务器 ECS 访问不了公网 ip 恐怕的来由及化解方法

附:

 语言 6

 

 


Lifted Rule Injection for Relation Embeddings

  • 作者:Thomas Demeester, Tim Rocktäschel and Sebastian Riedel
  • 机构:Ghent University – iMinds
  • 机构:University College London

本文提议了一种将规则注入到嵌入式表示中,用于关系推理的主意。本文叙述,嵌入式的意味方法能够从普遍知识图谱中上学到鲁棒性较强的象征,但却通常不够常识的引导。将双方融合起来的艺术,已经得到了较好的效益,其常识平时以规则的样式出现。但在大规模知识图谱中,由于某个平整并不是单身于实体元组的,所以那些规则所能覆盖的实例仅占一小部分,如:\(\forall x: \rm{isMan}(x)\Rightarrow
\rm{isMortal}(x)\)。

正文建议将隐式的规则融入到实体和事关的分布式表示中。本文首先想起了Riedel
et al.
(2013)的工作
,在该工作中,小编用三个向量\(\boldsymbol{r,t}\)来分别表征关系和实业元组(头尾实体对),优化的指标是:\(\boldsymbol{r_p^{\rm{T}}t_p\leq
r_q^{\rm{T}}t_q}\),其中\(p\)代表负例的标识。并以此优化目的定义相应的损失函数:

\[\mathcal{L}_R=\sum_{(r,t_q)\in
\mathcal{O},t_p\in \mathcal{T},(r,t_p)\notin
\mathcal{O}}l_R(\boldsymbol{r^\rm{T}[t_p-t_q]})\]

为了将如:\(\forall t\in \mathcal(T):
(r_p,t)\Rightarrow
(r_q,t)\)的规则融入分布式表示,本文模仿上述措施,能够将上述规则转化为:

\[\forall t\in
\mathcal{T}:\boldsymbol{r_p^{\rm{T}}t_p\leq
r_q^{\rm{T}}t_q}\]

也正是左侧元组分数越高,左边元组分数必然更高,从而达成左边元组创建,左边一定成立的推理原则。同时优化损失函数:

\[\mathcal{L}_R=\sum_{\forall t \in
\mathcal{T}}l_R(\boldsymbol{[t_p-t_q]^\rm{T}\tilde
t})\]

其中,\(\boldsymbol{\tilde
t}:=t/{||t||_1}\)。

为了减小总计花费,同时抵达独立于实体元组的目标,本文对指标损失函数做了如下修改:

\[\mathcal{L}_I=\sum_{\forall t \in
\mathcal{T}}l_I(\sum_{i=1}^{k}\tilde
t_i\boldsymbol{[t_p-t_q]^\rm{T}\bf{1}_i})\]

尤其有:

\[\mathcal{L}_I\leq
\sum_{i=1}^{k}l_I(\boldsymbol{[t_p-t_q]^\rm{T}\bf{1}_i})\sum_{\forall
t \in \mathcal{T}}\tilde t_i\]

令:

\[\mathcal{L}_I^U:=
\sum_{i=1}^{k}l_I(\boldsymbol{[t_p-t_q]^\rm{T}\bf{1}_i})\]

透过最小化损失函数\(\mathcal{L}_I^U\),能够将隐式规则\((r_p,t)\Rightarrow
(r_q,t)\)融入到表示中。其余细节请参考原文,那里不做赘述。

1 准备工作

导入Flask及相关扩充:

pip
install flask

pip
install flask-pymongo

pip
install
tornado(此处可选可不选。假若不采纳,间接运用Flask自带的服务器安顿即可;即便采取,能够运用tornado铺排)

 

MongoDB数据库绑定服务ip地址设置(PS:如若不举行下述设置,私下认可ip为本机127.0.0.一人置):

开辟CMD,进入MongoDB安装的bin文件夹下,例如笔者的装置目录为:C:\Program
Files\MongoDB\Server\3.2\bin

然后在CMD中输入mongod.exe
–bind_ip yourIPadress

内部参数–bind_ip意思:绑定服务IP,若绑定127.0.0.1,则只可以本机访问,不钦定默许本地全数IP。(注意:当中yourIPadress填写自身搭建服务器的内网ip地址)

实际如下图:

 语言 7

语言 8

 

开启Flask自带的服务器,一般选拔app.run(),在那之中一般采取如下四个参数:host(钦定ip地址,假如不填写,暗许为127.0.0.1)、port(钦赐使用的端口,假使不点名,私下认可为陆仟端口)、debug(开启调节和测试形式,暗中同意值为Flase,即不开启调节和测试形式,如要开启则能够安装为True)。

 

设若在服务器上搭建Flask接口相关服务,设置当中host=’0.0.0.0’表示在公网ip下的同一个局域网段全部ip都得以访问那一个服务,假诺把host钦定为当中2个内网ip地址,则那一个局域网下全部用户能够经过拜访那么些钦点的ip地址访问Flask服务。

 

末尾介绍能够稍微看看,也一定于是询问一下nginx
+gunicorn以及tornado的基本概念。也足以忽略,直接查看2
具体贯彻

 

应用nginx
+gunicorn来配置Flask相关服务,即不行使Flask自带的服务器。

 

探望地点的铺排方式,作为初学者,不免会有新的疑难,什么是nginx和gunicorn呢?

自个儿要好也是新接触的,查看了一下网上资料,差不离精晓了一晃。

 

什么是nginx呢?

摘要自百度百科(https://baike.baidu.com/item/nginx/3817705?fr=aladdin)的一段解释:Nginx是一款[轻量级](https://baike.baidu.com/item/%E8%BD%BB%E9%87%8F%E7%BA%A7/10002835)的[Web](https://baike.baidu.com/item/Web/150564) 服务器/反向代理服务器及电子邮件(IMAP/POP3)代理服务器,并在二个BSD-like
协议下发行。其特点是侵吞内存少,并发力量强,事实上nginx的面世能力确实在同体系的网页服务器中显现较好,中夏族民共和国次大陆使用nginx网站用户有:百度、京东、搜狐、搜狐、腾讯、Taobao等。

 

什么是gunicorn呢?

摘要自网上1回文章(http://www.pythontip.com/blog/post/5155/)一段解释:Gunicorn“绿色独角兽”是一个被广泛使用的高性能的Python
WSGI UNIX HTTP服务器,移植自Ruby的独角兽(Unicorn )项目,使用pre-fork
worker形式,具有应用极度简单,轻量级的能源消耗,以及高质量等性子。

Gunicorn
服务器作为wsgi
app的容器,可以与各类Web框架包容(flask,django等),得益于gevent等技能,使用Gunicorn能够在基本不改动wsgi
app代码的前提下,大幅升高wsgi app的质量。

 

看来上边的消除办法,试着搭建筑和安装装,发现gunicorn不支持Windows系统,坑啊,早知道那样就买二个Linux服务器。

选取gunicorn报错音信:

Traceback (most recent call last):

  File "d:\program files (x86)\python27\Lib\runpy.py", line 174, in _run_module_as_main

    "__main__", fname, loader, pkg_name)

  File "d:\program files (x86)\python27\Lib\runpy.py", line 72, in _run_code

    exec code in run_globals

  File "E:\WorkPlace\Git_python\liu_demo\venv\Scripts\gunicorn.exe\__main__.py", line 5, in <module>

  File "e:\workplace\git_python\liu_demo\venv\lib\site-packages\gunicorn\app\wsgiapp.py", line 10, in <module>

    from gunicorn.app.base import Application

  File "e:\workplace\git_python\liu_demo\venv\lib\site-packages\gunicorn\app\base.py", line 12, in <module>

    from gunicorn import util

  File "e:\workplace\git_python\liu_demo\venv\lib\site-packages\gunicorn\util.py", line 9, in <module>

    import fcntl

ImportError: No module named fcntl

 

 语言 9

 

只是笔者的服务器还是是Windows版本,Flask服务器环境依旧要搭建,那么得利用什么样方案吗?

此处推荐使用tornado。

那正是说什么样是tornado呢?

摘抄至网上一篇小说http://www.tornadoweb.cn/)介绍:Tornado 是 FriendFeed 使用的可增加的非阻塞式
web 服务器及其有关工具的开源版本。那一个 Web
框架看起来有点像 web.py 或者 Google 的
webapp
,然则为了能使得采用非阻塞式服务器环境,这一个Web 框架还包括了有的连锁的灵光工具 和优化。

Tornado
和现行反革命的主流 Web 服务器框架(蕴涵半数以上 Python
的框架)有着显明的区分:它是非阻塞式服务器,而且速度至极快。得利于其
非阻塞的措施和对 epoll 的施用,Tornado
每秒能够拍卖数以千计的连日,那象征对于实时 Web 服务以来,Tornado
是贰个了不起的 Web 框架。大家开发那一个 Web 服务器的主要指标正是为着处理
FriendFeed 的实时功效 ——在 FriendFeed
的应用里每三个运动用户都会维持着贰个服务器连接。(关于怎么样扩容服务器,以处理数以千计的客户端的连日的题材,请参阅 C10K
problem
。)

 

至于实际怎么选用,能够查看上边小说介绍,也能够参见下文的具体使用代码。

 

 


2 具体完成

看看上边具体贯彻代码,会让大家感慨,Python的确是1个美观的言语,Flask框架也真的是对应小而又轻量级的框架美称呀。使用MongoDB数据库,操作数据库也变得极为简略。

 

在看下面代码从前,须求不难说一下REST的主导思想原理,也一定于是自身要好更为加重印象吧。上边解释应用自阮一峰博客的三个评头论足,作者感觉到那样描述的很客观。

 

REST多个基本尺度:
1.使用HTTP动词:GET
POST PUT DELETE;
2.无状态连接,服务器端不应保存过多上下文状态,即每一种请求都以单独的;
3.为各类财富设置USportageI;
4.透过XML
JSON进行数量传递;
福如东海上述原则的框架结构即可称为RESTFul架构。
1.互连网环境下,任何利用的架构和API能够被连忙掌握;
2.分布式环境下,任何请求都能够被发送到任意服务器;
3.异构环境下,任何能源的走访和动用方法都统一;

 

看来地方介绍,既然说了REST格局使用HTTP动词GET
POST PUT DELETE来落到实处相关操作。

那正是说上边代码就大约达成一下那多少个动词的具体操作功效。

GET:达成从服务器后台获取数据效用,例如登陆接口效率完结;

POST:实现向服务器后台提交数据效能,例如登记接口功效完结;

PUT:达成修改服务器后台已有数量效用;

DELETE:实现删除服务器后台已有数量效能。

 

看完上边介绍,下边就请看代码:

借使不利用tornado,直接选择上面3个mongo.py文件中代码即可兑现本文标题所述效用:

#coding=utf-8
#mongo.py
from flask import Flask,abort
from flask import jsonify
from flask import request
from flask_pymongo import PyMongo


app = Flask(__name__)

app.config['MONGO_DBNAME'] = 'rest'
app.config['MONGO_URI'] = 'mongodb://172.18.252.20:27017/rest'  #如果部署在本上,其中ip地址可填127.0.0.1

mongo = PyMongo(app)

@app.route('/login', methods=['GET'])
def get_all_users():
  star = mongo.db.userInfo.find()
  output = []
  for s in star:
    output.append({'name' : s['name'], 'pwd' : s['pwd']})
  return jsonify({'result' : output})


@app.route('/register', methods=['POST'])
def add_user():
  star = mongo.db.userInfo
  name = request.json['name']
  pwd = request.json['pwd']
  star_id = star.insert({'name': name, 'pwd': pwd})
  new_star = star.find_one({'_id': star_id })
  output = {'name' : new_star['name'], 'pwd' : new_star['pwd']}
  return jsonify({'result' : output})

@app.route('/modify/<string:name>', methods=['PUT'])
def update_user(name):
    user = mongo.db.userInfo.find({"name":name})
    output = []
    for s in user:
      output.append({'name': s['name'], 'pwd': s['pwd']})
    if len(output) == 0:
      abort(404)
    mongo.db.userInfo.update({"name":name},{'$set':{"name":"LZ111"}})
    return jsonify({'result': output})

@app.route('/delete/<string:name>', methods=['DELETE'])
def delete_user(name):
    user = mongo.db.userInfo.find({"name": name})
    output = []
    for s in user:
      output.append({'name': s['name'], 'pwd': s['pwd']})
    if len(output) == 0:
      abort(404)
    mongo.db.userInfo.remove({'name': name})
    return jsonify({'result': True})



if __name__ == '__main__':
    # app.run(host = '0.0.0.0', port = 80, debug = True)
    app.run()

 

假若使用tornado,新建三个tornado_server.py文件,添加以下代码,作为Flask服务运转陈设,也得以达成相关职能:

#coding=utf-8
#tornado_server.py
from tornado.wsgi import WSGIContainer
from tornado.httpserver import HTTPServer
from tornado.ioloop import IOLoop

from mongo import app


http_server = HTTPServer(WSGIContainer(app))
# http_server.listen(9000)  #此时,开启端口9000,默认本机127.0.0.1的IP地址
http_server.bind(80, "172.18.252.20")# 开启端口为9000,172.18.252.20为内网ip地址,也可以设置为0.0.0.0,
http_server.start(1)
IOLoop.instance().start()

 

看完下边代码,点击运维,即可兑现相关接口效用了。既然是接口,GET方式幸亏说,若是是POST形式,使用浏览器就不那么好操作了,此时我们必要利用一款接口测试软件,在此地自个儿推荐使用Postman(PS:Postman百度经验介绍Postman官网下载链接),如若有同学利用基于Linux相关系统,推荐使用CU奇骏L来兑现。

 

上边就规范启幕应用Postman测试Get、Post、Put和Delete格局接口:

Get格局,选中下图中下拉框GET格局,直接输入U汉兰达L,然后点击Send石青按钮即可得到请求数据。

 语言 10

 

Post格局,选中下拉框中Post格局,那里由于要发送数据,要求有个别设置一下。

率先,在下图中Headers中要选拔Content-Type的多少格局,那里本身采取的是json格式:

 语言 11

然后,点开下图中Body,选用raw,添加要存入的json格式数据,如下:

 语言 12

终极,点击Send按钮,在最上面出现相关提示消息后,即可查看Post请求结果。

 

Put方式操作和Get格局一样,分裂的是内需选中操作格局为Put,具体如下图:

 语言 13

 

Delete情势和Put请求差不离一模一样,区其他是二个推行修改操作,3个推行删除操作而已,具体如下图:

 语言 14

 

基本操作就像此,看完下边代码,发现使用FLask+MongoDB写后端接口是否特意不难?

 

 

参考资料:
1.Designing a
RESTful API with Python and
Flask
(PS:附加多少个中文版,可是个中代码有bug)

2.理解RESTful架构

3.MONGODB
RESTFUL API WITH
FLASK

 

发表评论

电子邮件地址不会被公开。 必填项已用*标注

网站地图xml地图