哪些框架/库是构建现代多用户Web应用程序的最佳选择?我希望有一个异步的网络服务器,这将允许我轻松扩展.什么解决方案将提供最佳性能/可扩展性/最有用的框架(在易用性和易于开发方面)?
如果它能提供良好的功能(websockets,rpc,streaming等)会很棒.
每种解决方案的优缺点是什么?
我正在使用Backbone.js和Tornado Web服务器.在Backbone中接收集合数据的标准行为是作为JSON数组发送.
另一方面,由于以下漏洞,Tornado的标准行为是不允许使用JSON Array:
http://haacked.com/archive/2008/11/20/anatomy-of-a-subtle-json-vulnerability.aspx
相关的一个是:http: //haacked.com/archive/2009/06/25/json-hijacking.aspx
当我真的是一个对象列表时,我不必在对象中包装我的JSON.
我无法在现代浏览器中重现这些攻击(即当前的Chrome,Firefox,Safari和IE9).与此同时,我无法确认现代浏览器解决这些问题的任何地方.
为了确保我既没有任何可能的糟糕的编程技能,也没有糟糕的谷歌搜索技能:
在现代浏览器中,这些JSON劫持攻击现在仍然是一个问题吗?
(注意:很抱歉可能重复:在现代浏览器上可以进行'JSON劫持'吗? 但由于接受的答案似乎没有回答这个问题 - 我认为现在是时候再问一遍并得到一些更明确的解释.)
好吧,Tornado是非阻塞的,非常快,它可以轻松处理很多常备请求.
但我想这不是一个银弹,如果我们盲目地运行基于Django或任何其他Tornado网站,它将不会给任何性能提升.
我找不到对此的全面解释,所以我在这里问:
除了node.js是用JS和Tornado用Python编写的,这两者之间有什么区别?它们都是非阻塞的异步Web服务器,对吧?除了语言之外,为什么选择其中一个?
我是Flask的忠实粉丝- 部分原因是因为它很简单,部分原因是因为它有很多扩展.但是,Flask意味着在WSGI环境中使用,而WSGI不是非阻塞的,所以(我相信)它不像某些类型的应用程序那样扩展到Tornado.
由于每个人都有一个URL调度程序,它将调用一个函数,并且两个都将使用Python文件(在Django中你不启动python文件,但是你在烧瓶或龙卷风中)你是否有意义在你的网站上有两个独立的部分 - 一部分用Tornado运行非阻塞作业,另一部分用Flask编写?
如果这是一个好主意,您将如何在Flask和Tornado之间共享cookie /会话?我会遇到问题,因为Flask将使用它自己的系统,而Tornado将使用自己的系统吗?
我正在迁移tornado到asyncio,而且我找不到asyncio相同tornado的东西PeriodicCallback.(A PeriodicCallback有两个参数:运行的函数和调用之间的毫秒数.)
asyncio?RecursionError一会儿的风险?我有几个关于龙卷风和其他Web框架的问题.
1)龙卷风声称是一个网络服务器(非阻塞的,因此效果很好),所以有些人说它不起作用django --ie,他们说龙卷风不是一个网络框架.
但是,它确实提供了一个我认为的Web框架(http://www.tornadoweb.org/documentation#main-modules) - 这样,它似乎取代了django作为Web开发框架.
我的上述理解是否正确?
2)通常,在Nginx之后设置了几个龙卷风.Tomcat通常也设置在Apache Web服务器之后.我可以说Tornado扮演的是Tomcat与Java Web服务器完全相同的角色吗?如果答案是肯定的,那么Tornado就是一个Web框架.
3)我读了一些文章说使用Tornado和Django,例如http://www.jeremybowers.com/blog/post/3/on-deploying-tornado-web-server-framework/,但我在线阅读了一些文章声称"如果你使用Django,那么你就失去了Tornado的异步",这是真的还是假的?一个相关的问题,如果Tornado本身就是我在1)中所说的网络框架,为什么人们会费心使用Django?(结果插件?)
有人可以给我101介绍吗?
我正在使用I/O非阻塞python服务器Tornado.我有一类GET请求可能需要很长时间才能完成(想想在5-10秒的范围内).问题是Tornado会阻止这些请求,以便随后的快速请求被保留,直到缓慢的请求完成.
我查看了:https://github.com/facebook/tornado/wiki/Threading-and-concurrency,得出结论我想要#3(其他进程)和#4(其他线程)的某种组合.#4本身有问题,当有另一个线程正在进行"重举"时,我无法获得可靠的控制回ioloop.(我假设这是由于GIL以及heavy_lifting任务具有高CPU负载并且不断控制远离主ioloop的事实,但这是猜测).
所以我一直在原型化如何通过GET在单独的进程中在这些缓慢的请求中执行"繁重的"任务来解决这个问题,然后在完成该请求的过程中将回调放回到Tornado ioloop中.这释放了ioloop来处理其他请求.
我创建了一个演示可能解决方案的简单示例,但我很想从社区获得反馈.
我的问题有两个方面:如何简化当前的方法?它可能存在哪些陷阱?
利用Tornado的内置asynchronous装饰器,允许请求保持打开状态并继续ioloop.
使用python的multiprocessing模块为"繁重的"任务生成一个单独的过程.我首先尝试使用该threading模块,但无法将任何可靠的放弃控制权交还给ioloop.它似乎mutliprocessing也会利用多核.
使用threading正在工作的模块在主ioloop进程中启动一个"观察者"线程,multiprocessing.Queue以便在完成时查看"繁重"任务的结果.这是必要的,因为我需要一种方法来知道重载任务已经完成,同时仍能通知ioloop此请求现已完成.
确保'观察者'线程经常通过time.sleep(0)调用放弃对主ioloop循环的控制,以便继续处理其他请求.
当队列中有结果时,从"观察者"线程添加回调,使用tornado.ioloop.IOLoop.instance().add_callback()该回调记录是从其他线程调用ioloop实例的唯一安全方法.
请务必调用finish()回调以完成请求并移交回复.
下面是一些显示此方法的示例代码. multi_tornado.py是实现上述大纲的服务器,call_multi.py是一个示例脚本,它以两种不同的方式调用服务器来测试服务器.两个测试都调用服务器3个慢GET请求,然后是20个快速GET请求.结果显示在打开和不打开线程的情况下运行.
在使用"无线程"运行它的情况下,3个慢速请求阻塞(每个需要花费一点多秒才能完成).20个快速请求中的一些请求在ioloop中的一些慢速请求之间挤压(不完全确定如何发生 - 但可能是我在同一台机器上运行服务器和客户端测试脚本的工件).这里的要点是所有快速请求都被保持不同程度.
如果在启用线程的情况下运行它,则20个快速请求立即首先完成,然后三个慢速请求在几乎同时完成,因为它们各自并行运行.这是期望的行为.三个慢速请求并行完成需要2.5秒 - 而在非线程情况下,三个慢速请求总共需要3.5秒.所以总体上加速了大约35%(我假设由于多核共享).但更重要的是 - 快速请求立即以慢速列表处理.
我对多线程编程没有很多经验 - 所以虽然这看起来很有用,但我很想知道:
有没有更简单的方法来实现这一目标?在这种方法中潜藏着什么怪物?
(注意:未来的权衡可能是使用反向代理运行更多Tornado实例,如nginx进行负载平衡.无论我将使用负载均衡器运行多个实例 - 但我担心只是抛出硬件来解决这个问题因为看起来硬件在阻塞方面与问题直接相关.)
multi_tornado.py (样本服务器):
import time
import threading
import multiprocessing
import math
from tornado.web import RequestHandler, Application, asynchronous …Run Code Online (Sandbox Code Playgroud) 我发现这个python脚本应该允许我打开一个WebSocket.但是,[W 1402720 14:44:35 web:1811] 403 GET / (192.168.0.102) 11.02 ms当我尝试打开实际的WebSocket(使用Old WebSocket Terminal Chrome插件)时,我在Linux终端中收到警告.永远不会在终端窗口中打印消息"连接已打开","连接已关闭"和"已接收消息".
import tornado.httpserver
import tornado.ioloop
import tornado.options
import tornado.web
import tornado.websocket
class MyHandler(tornado.websocket.WebSocketHandler):
def open(self):
print "connection opened"
self.write_message("connection opened")
def on_close(self):
print "connection closed"
def on_message(self,message):
print "Message received: {}".format(message)
self.write_message("message received")
if __name__ == "__main__":
tornado.options.parse_command_line()
app = tornado.web.Application(handlers=[(r"/",MyHandler)])
server = tornado.httpserver.HTTPServer(app)
server.listen(8888)
tornado.ioloop.IOLoop.instance().start()
Run Code Online (Sandbox Code Playgroud) 如何使SQLAlchemy中Tornado是async?我在async mongo示例中找到了MongoDB的示例,但我找不到类似motor的内容SQLAlchemy.有没有人知道如何SQLAlchemy执行查询tornado.gen(我在MySQL下面使用SQLAlchemy,目前我的处理程序从数据库读取并返回结果,我想使这个异步).
tornado ×10
python ×8
javascript ×2
nonblocking ×2
asynchronous ×1
browser ×1
comparison ×1
django ×1
flask ×1
gevent ×1
json ×1
node.js ×1
python-2.7 ×1
python-3.5 ×1
python-3.x ×1
security ×1
sqlalchemy ×1
twisted ×1
webserver ×1
websocket ×1
wsgi ×1