我想知道是否有人知道在Tornado中实现登录/注册页面的任何示例代码或教程?我看过它附带的例子,但它们看起来非常以facebook/oauth为中心.
这可能是一个愚蠢的问题,但究竟什么是"非阻塞Web服务器"?所有的Web服务器在技术上都是非阻塞的,不是吗?否则他们怎么能处理同时连接?Apache2使用fork()和pthreads的组合实现了这一点.龙卷风(和Twisted)究竟有何不同?他们只是将一堆套接字设置为非bocking模式,构建FD列表(或等效的),然后使用一个大的select()sys调用来循环它吗?
你会在哪里使用这样的框架,以及它们可以通过Apache2(或其他流行的服务器)给你带来什么好处?谢谢
在龙卷风中是否有等效的命令用于延迟功能而不影响主进程进入休眠状态(因此即使主线程正在分析新的函数调用,回调也会执行)
标题简单描述了我的问题.我想用特定的返回值来模拟"_func_inner_1".谢谢你的任何建议:)
被测代码:
from tornado.gen import coroutine, Return
from tornado.testing import gen_test
from tornado.testing import AsyncTestCase
import mock
@coroutine
def _func_inner_1():
raise Return(1)
@coroutine
def _func_under_test_1():
temp = yield _func_inner_1()
raise Return(temp + 1)
Run Code Online (Sandbox Code Playgroud)
但是,这种直观的解决方案无效
class Test123(AsyncTestCase):
@gen_test
@mock.patch(__name__ + '._func_inner_1')
def test_1(self, mock_func_inner_1):
mock_func_inner_1.side_effect = Return(9)
result_1 = yield _func_inner_1()
print 'result_1', result_1
result = yield _func_under_test_1()
self.assertEqual(10, result, result)
Run Code Online (Sandbox Code Playgroud)
如果出现以下错误,似乎_func_inner_1没有修补,因为它具有协同性质
AssertionError: 2
Run Code Online (Sandbox Code Playgroud)
如果我添加coroutine补丁返回模拟功能
@gen_test
@mock.patch(__name__ + '._func_inner_1')
def test_1(self, mock_func_inner_1):
mock_func_inner_1.side_effect = Return(9)
mock_func_inner_1 = coroutine(mock_func_inner_1)
result_1 = yield …Run Code Online (Sandbox Code Playgroud) 最近升级到Python 3.8,并已安装jupyter。但是,当尝试运行时jupyter notebook出现以下错误:
File "c:\users\user\appdata\local\programs\python\python38\lib\site-packages\tornado\platform\asyncio.py", line 99, in add_handler
self.asyncio_loop.add_reader(fd, self._handle_events, fd, IOLoop.READ)
File "c:\users\user\appdata\local\programs\python\python38\lib\asyncio\events.py", line 501, in add_reader
raise NotImplementedError
NotImplementedError
Run Code Online (Sandbox Code Playgroud)
我知道ProactorEventLoop默认情况下Windows上的Python 3.8已切换为默认设置,因此我怀疑它与此相关。
Jupyter目前不支持Python 3.8?有没有解决的办法?
我对这整个异步游戏(主要是一个Django家伙)有点新鲜,但我想知道:如何将额外的参数传递给Tornado的AsyncHTTPClient.fetch回调?例如,我正在跟踪调用回调的次数(为了等到某个数字在执行数据之前已执行),我想做的事情如下:
def getPage(self, items,iteration):
http = AsyncHTTPClient()
http.fetch(feed, callback=self.resp(items,iteration))
def resp(self, response, items, iteration):
#do stuff
self.finish()
Run Code Online (Sandbox Code Playgroud) 我刚开始学习网络服务器,特别是龙卷风.
我想写一个带登录功能的简单网页.如Tornado文档中所述,我在用户成功插入后创建了一个安全的cookie:
self.set_secure_cookie("user", self.get_argument("user"))
Run Code Online (Sandbox Code Playgroud)
但是,如何为用户提供注销方式?如前所述,我不熟悉Web服务器,但是当我在用户尝试进入主页时检查此cookie时,我想我只需要在用户按下"注销"后将其删除?
不幸的是,我无法在龙卷风文件中找到任何关于此的信息,也无法在SO上找到.
我有一个基本的Tornado websocket测试:
import tornado.httpserver
import tornado.websocket
import tornado.ioloop
import tornado.web
class WSHandler(tornado.websocket.WebSocketHandler):
def open(self):
print 'new connection'
self.write_message("Hello World")
def on_message(self, message):
print 'message received %s' % message
def on_close(self):
print 'connection closed'
application = tornado.web.Application([
(r'/ws', WSHandler),
])
if __name__ == "__main__":
http_server = tornado.httpserver.HTTPServer(application)
http_server.listen(8888)
tornado.ioloop.IOLoop.instance().start()
Run Code Online (Sandbox Code Playgroud)
我希望能够处理多个连接(它似乎已经存在),但也能够引用其他连接.我没有看到识别和跟踪各个连接的方法,只是为了能够处理连接打开,消息接收和连接关闭的事件.
[编辑]
想创建一个dict,其中键是Sec-websocket-key,而值是WSHandler对象......想法?我不确定Sec-websocket-key的独特性是多么可靠.
我想知道是否有更好的方法来处理我的Tornado index.html文件.
我对所有请求使用StaticFileHandler,并使用特定的MainHandler来处理我的主要请求.如果我只使用StaticFileHandler,我得到了403:Forbidden错误
GET http://localhost:9000/
WARNING:root:403 GET / (127.0.0.1): is not a file
Run Code Online (Sandbox Code Playgroud)
这是我现在的表现:
import os
import tornado.ioloop
import tornado.web
from tornado import web
__author__ = 'gvincent'
root = os.path.dirname(__file__)
port = 9999
class MainHandler(tornado.web.RequestHandler):
def get(self):
try:
with open(os.path.join(root, 'index.html')) as f:
self.write(f.read())
except IOError as e:
self.write("404: Not Found")
application = tornado.web.Application([
(r"/", MainHandler),
(r"/(.*)", web.StaticFileHandler, dict(path=root)),
])
if __name__ == '__main__':
application.listen(port)
tornado.ioloop.IOLoop.instance().start()
Run Code Online (Sandbox Code Playgroud) tornado ×10
python ×9
apache2 ×1
asynchronous ×1
cookies ×1
login ×1
login-script ×1
mocking ×1
twisted ×1
unit-testing ×1
websocket ×1
windows ×1