我想我了解OAuth 2.0如何在移动应用或网站的环境中运行 - 我的情况也不是.
我有一个C++ 命令行应用程序,我想访问其中一个Google服务(Google Fusion Tables),但我认为这个问题适用于任何Google服务,或者heck,也许还有任何必须处理的命令行应用程序使用OAuth2.
我有用户名.我有密码(用户输入密码).我需要获得一个令牌,以便我可以通过Curl进行调用.实现这一目标的最简单方法是什么?
更新1:
在完成文档后,似乎最难以理解的OAuth2流程将是"已安装的应用程序".
我的想法是我的命令行工具将在不需要令牌的情况下发出对公共表的请求(但似乎我们仍然需要从Google发送AppID,我可以从Google API仪表板中获取).
每当我的命令行工具,需要使用专用的资源,该用户将被要求提供一个谷歌提供的授权码(其中我的命令行工具,就可以使用得到一个可用的令牌).如果用户未在命令行中提供授权代码,我的工具只会打印一个用户可以粘贴到URL的链接以生成授权代码.链接看起来像这样:
一旦用户接受,她将必须将该授权代码粘贴到终端,以便命令行工具使用它.命令行工具将使用授权代码向Google请求令牌,然后,最后,我可以使用Google令牌进行API调用.
我还不清楚一些事情.授权码是否会改变?如果是这样,似乎我需要保存令牌并在某处刷新令牌,这样每次令牌到期时我都可以重用刷新令牌.
它只是我,还是整个事情看起来像是疯狂的谈话,以便我可以从命令行使用Google API?
我通常会使用ClientLogin流程,但似乎所有内容都指出它很快就会被弃用.
我很好奇Google地理编码器的工作原理.
我一直在研究开源地理编码器的一些实现,例如geocommons的地理编码器或PostGIS的新Tiger Geocoder.这大致是我目前所知的(希望证明我一直在做我的作业):
我意识到,在开源地理编码器的核心,有三个主要元素.
1.-一个地址规范化器,它接受一个任意字符串并对其进行规范化(以此为例):
normalize_address('address string');
e.g.: SELECT naddy.* FROM normalize_address('29645 7th Street SW Federal Way 98023') AS naddy;
address | predirabbrev | streetname | streettypeabbrev | postdirabbrev | internal | location | stateabbrev | zip | parsed
---------+-------------+-----------------------+------------------+---------------+----------+----------+-------------+-------+--------
29645 | | 7th Street SW Federal | Way | | | | | 98023 |
Run Code Online (Sandbox Code Playgroud)
和:
2.-一个地理编码器,对核心算法为Levenshtein距离的名称进行一些神奇的模糊匹配.
一个很好的例子是维基百科文章中的一个,它计算单词kitten和sitting之间的Levenshtein距离(距离是3,因为这是将一个字符串更改为另一个字符串所需的编辑数):
kitten ? sitten (substitution of 's' for 'k')
sitten ? sittin …Run Code Online (Sandbox Code Playgroud) 我写了几个Android和iOS原生移动应用程序,它直接连接到我托管的XMPP服务器.他们通过XMPP推送和提取实时数据.我还使用了一些XMPP XEP扩展.对于其他操作,我在同一服务器上运行django应用程序,所有移动应用程序都通过HTTP REST接口使用该服务器.我使用Celery和Redis为django方面异步进行一些操作(比如对我的数据库进行大量的批量写入).
这一切都很好,花花公子.好极了.
但是现在我想为所有这些编写一个Web前端,所以我开始研究我的选择并且很好 - 有很多方法可以让我想要首先检查SO社区.
有一个js库给我一个统一的套接字通信API的想法(即尝试不同的Web套接字实现或回退到flash)吸引我,因此我提到了Socket IO.必须运行nodejs服务器的想法,不是那么多(还有一件事需要学习),但如果必须的话,我肯定会.我知道有些人使用gevent作为节点服务器的替代品.其他人,决定写一个小nodejs,他们连接到他们的堆栈的其余部分.我可能会这样做.
另一种选择是使用像Strophe这样的js XMPP库,我认为它不具备闪回后备功能.另外,我需要研究这对我的服务器意味着什么.
我已经阅读了关于如何做彗星和django的几个Stackoverflow答案 - 因此为什么看起来有几个选项.
问题是:
如果我想拥有Socket IO行为的优势(使用回退)并且我想将实时数据推送到Web客户端(通过XMPP送到服务器),并使用Django我最好的选择是什么?
更新:我使用的XMPP服务器是ejabberd,它也支持BOSH.我意识到我可以使用Strophe.js,因此我的通信将通过一种长轮询http连接而不是websockets.据我所知,Websockets上有一些XMPP开源库,但AFAIK社区并不像SocketIO那样活跃.
更新2:我需要支持的浏览器只是现代浏览器.我想这意味着Flash后备不会那么重要,这让我倾向于strophe.js.
问题:使用Django时,实现0(或尽可能接近0)停机时间的好策略是什么?
我读到的大多数答案都说"使用南方"或"使用面料",但那些非常模糊的答案恕我直言.我实际上使用了两者,我仍然想知道如何尽可能地实现零停机.
一些细节:
我有一个体积适中的Django应用程序,我在EC2上主持.我使用South进行模式和数据迁移以及使用boto进行结构化,以自动执行通过一组Jenkins(持续集成服务器)任务触发的重复部署/备份任务.我使用的数据库是标准的PostgreSQL 9.0实例.
我有一个...
我们的团队不断编辑的暂存服务器,包含所有新内容,并加载了最新最好的代码和...
不断更改用户帐户和用户数据的实时服务器 - 全部记录在PostgreSQL中.
目前的部署策略:
部署新代码和内容时,会创建两个服务器(实时和暂存)的两个EC2快照.直播切换到"正在更新新内容"页面...
停工开始了.
实时克隆服务器迁移到与登台服务器相同的模式版本(使用南).仅创建我想要保存的表和序列的转储(特别是用户帐户及其数据).完成此操作后,转储将上载到登台克隆服务器.从实时保留的表将被截断并插入数据.随着我的实时服务器中的数据增长,这一次显然在不断增加.
加载完成后,实时服务器的弹性ips将更改为分段克隆(因此它已被提升为新的实时).实时实例和实时克隆实例终止.
停工结束.
是的,这有效,但随着数据的增长,我的"虚拟"零停机时间越来越远.当然,我想到的是以某种方式利用复制并开始研究PostgreSQL复制和"最终一致"的方法.我知道我可以使用负载平衡器做一些魔术,但同时创建的帐户问题使它变得棘手.
我建议你看什么?
更新:
我有一个典型的Django单节点应用程序.我希望有一个解决方案可以更深入地了解django特定问题.例如,我想到了使用Django支持多个数据库以及自定义路由器以及复制的想法.有些问题与我希望回答的问题有关.
我已经想出如何使用pycurl进行GET,PUT,DELETE和基本的POST.
不过,我无法弄清楚这个curl命令行(对于python来说效果很好)的等价物是什么:
curl -u admin:geoserver -XPOST -H 'Content-type: application/vnd.ogc.sld+xml'
-d @/Users/rburhum/src/calthorpe/calthorpe/server/calthorpe/media/styles/1_my-scenario
"http://127.0.0.1:8080/geoserver/rest/styles?name=1_my-scenario" -v
Run Code Online (Sandbox Code Playgroud)
我在回购时见过样品.然而,传递一个参数(在这种情况下是名称)和一个要上传的文件似乎不起作用.
对于PUT调用,我已成功使用:
filesize = path.getsize(sldFile)
f = open(sldFile,'rb')
c = pycurl.Curl()
c.setopt(pycurl.HTTPHEADER, ["Content-type: application/vnd.ogc.sld+xml"])
c.setopt(pycurl.USERPWD, GEOSERVER_USER + ':' + GEOSERVER_PASSWORD)
c.setopt(pycurl.INFILESIZE, filesize)
c.setopt(c.URL, str(GEOSERVER_URL + '/rest/styles/' + path.basename(sldFile)))
c.setopt(pycurl.PUT, 1)
c.setopt(pycurl.INFILE, f)
c.perform()
f.close()
Run Code Online (Sandbox Code Playgroud)
因此,我天真地认为POST等价物将是:
filesize = path.getsize(sldFile)
f = open(sldFile,'rb')
c = pycurl.Curl()
c.setopt(c.URL, str(GEOSERVER_URL + '/rest/styles?name=' + path.basename(sldFile)))
c.setopt(pycurl.POST, 1)
c.setopt(pycurl.HTTPHEADER, ["Content-type: application/vnd.ogc.sld+xml"])
c.setopt(pycurl.USERPWD, GEOSERVER_USER + ':' + GEOSERVER_PASSWORD)
c.setopt(pycurl.INFILESIZE, filesize)
c.setopt(pycurl.INFILE, …Run Code Online (Sandbox Code Playgroud) django ×2
amazon-ec2 ×1
comet ×1
command-line ×1
curl ×1
deployment ×1
django-south ×1
geocoding ×1
google-api ×1
google-maps ×1
libcurl ×1
oauth ×1
oauth-2.0 ×1
postgresql ×1
pycurl ×1
python ×1
rest ×1
socket.io ×1
strophe ×1
xmpp ×1