我有nginx上传模块处理网站上传,但仍然需要传输文件(假设每个3-20mb)到我们的cdn,而不是将其委托给后台作业.
使用龙卷风执行此操作的最佳方法是什么,而不阻止其他请求?我可以在异步回调中执行此操作吗?
我是龙卷风网络框架的新手.目前我正在构建一个Web应用程序,它应该加载csv文件然后处理它.我尝试在python中使用csv模块,并尝试了表格模块,这对我没有帮助.
所以,我的问题是,是否有任何包或开源库将读取csv文件数据并将其存储在某种变量类型中,以便我可以对该文件执行各种操作.
我收到以下错误:
raise ValueError, "Need formats argument"
Run Code Online (Sandbox Code Playgroud)
我的代码是:
import re
import sys
import os.path
import tornado.httpserver
import webbrowser
import personalfile
import tabular as tb
import csv
try:
import tornado.ioloop
import tornado.web
except:
print 'No tornado module installed, Please install the tornado from http://www.tornadoweb.org/'
sys.exit()
SRC = os.path.dirname(__file__)
# Main Handler
class MainHandler(tornado.web.RequestHandler):
def get(self):
self.render("static/template_upload.html")
class OutputHandler(tornado.web.RequestHandler):
def post(self):
template_file = self.get_argument('template_html', None)
**data_file = self.get_argument('csvfile', None)
data_file = csv.DictReader(data_file)**
data_file = tb.tabarray(data_file, verbosity=0, headerlines=1)
xhtmlOutput = …Run Code Online (Sandbox Code Playgroud) 我有处理post请求的处理程序并将一些JSON返回给客户端,在我返回之前我需要验证输入数据,如果数据没有通过验证我需要放入头文件(我不知道如何修改头文件并添加额外的key)它不是在VALIDATION键或其他任何东西下传递验证标志.如何更改tornado post header并将此数据添加到标题中?
def post(self):
data = tornado.escape.json_decode(self.request.body)
key = data.get('key', None)
# here if key is not in db and did not pass validation I should add VALIDATION key value False to header and send back to client
result = fetch_data_for(key)
self.write(json.dumps(result))
self.flush()
Run Code Online (Sandbox Code Playgroud) 我一直在尝试使用Tornado Framework创建一个Web服务.该系统应该处理如下URL:
IP:Port/?user=1822&catid=48&skus=AB1,FS35S,98KSU1
首先我创建了这段代码来阅读网址:
#!/usr/bin/env python
from datetime import date
import tornado.httpserver
import tornado.escape
import tornado.ioloop
import tornado.web
class WService(tornado.web.RequestHandler):
def get(self, url):
self.write("value of url: %s" %(url))
application = tornado.web.Application([
(r"/([^/]+)", WService)])
if __name__ == "__main__":
http_server = tornado.httpserver.HTTPServer(application)
http_server.listen(9000)
tornado.ioloop.IOLoop.instance().start()
Run Code Online (Sandbox Code Playgroud)
并输入网址:
IP:Port/hello_world
导致:
value of url: hello_world
除了"?"之外,URL中使用的任何字符都有效.更改代码时,例如:
application = tornado.web.Application([
(r"/?([^/]+)", WService)])
Run Code Online (Sandbox Code Playgroud)
并将网址发送到"?" mark(IP:Port/?hello_world)结果是:
404: Not Found
研究龙卷风来解决这个问题我发现了这个get_argument方法并尝试应用它,例如:
class WService2(tornado.web.RequestHandler):
def get(self):
user = self.get_argument('user', None)
respose = { 'user': user }
self.write(response) …Run Code Online (Sandbox Code Playgroud) 我编写了一个简单的龙卷风应用程序,使用web-socket来管理守护进程(就像传输web界面一样).困扰我的一件事是状态更新的实施.我的WebSocketHandler只接收来自客户端的消息,执行必要的操作,检查状态并将其发送给客户端.它没有请求就不会向客户端发送状态.
class WebSocketHandler(tornado.websocket.WebSocketHandler):
def open(self):
print('connected')
self.daemon = Daemon()
self.write_message(self.daemon.get_status())
def on_message(self, message):
if message == 'start':
self.daemon.start()
elif message == 'stop':
self.daemon.stop()
self.write_message(self.daemon.get_status())
def on_close(self):
print('disconnected')
Run Code Online (Sandbox Code Playgroud)
我在客户端使用javascript的setInterval函数来请求状态更新,如下所示:
ws = new WebSocket("ws://localhost:8080/websocket");
ws.onopen = function () {
setInterval(function() {
if (ws.bufferedAmount == 0)
ws.send('status');
}, 1000);
};
}
Run Code Online (Sandbox Code Playgroud)
如何在服务器端实现相同的结果,以便龙卷风在不阻塞on_message方法的情况下将当前状态发送给客户端?
以下是我的测试代码.我正在使用Python2.7,futures安装使用:
pip install futures
Run Code Online (Sandbox Code Playgroud)
以下是我的演示代码:
import tornado.ioloop
import tornado.web
from tornado.gen import coroutine, Task
from tornado.concurrent import Future
import time
class MainHandler(tornado.web.RequestHandler):
@coroutine
def get(self):
print "in"
res = yield Task(self._work)
self.write(res)
def _work(self, callback):
time.sleep(10)
callback("hello world!")
if __name__ == "__main__":
application = tornado.web.Application([
(r"/", MainHandler),
])
application.listen(8888)
tornado.ioloop.IOLoop.instance().start()
Run Code Online (Sandbox Code Playgroud)
这段代码应该同时进行,不应该吗?但是,它没有.
我用Firefox和IE测试过.我想我犯了一些错误.你指出我的错误会很高兴.
一次只有一个请求(http://localhost:8888/:
import tornado.ioloop
import tornado.web
from tornado.gen import coroutine, Return, Task
from tornado.process import Subprocess
from tornado.concurrent import Future
from threading import Thread
import …Run Code Online (Sandbox Code Playgroud) 我已经做了几年的Web应用程序开发人员,现在正在使用Python和Robotics.
我已经设置了Python Tornado来运行基于javascript websocket命令.这很棒,移动电机,打开LED.不是问题.
我想做的2件事.
1)闪烁LED
2)使用超声波范围传感器,停止FORWARD动作IF范围<X
我知道如何在自己内部做两件事.
但是,我的python方式如下
WS.py
import tornado.httpserver
import tornado.websocket
import tornado.ioloop
import tornado.web
import time
# My Over python module
import tank
class WSHandler(tornado.websocket.WebSocketHandler):
def open(self):
print 'New connection was opened'
self.write_message("Welcome to my websocket!")
tank.init()
def on_message(self, message):
print 'Incoming message:', message
tank.run(message)
self.write_message("You said: " + message)
def on_close(self):
tank.end()
print 'Connection was closed...'
def check_origin(self, origin):
return True
application = tornado.web.Application([
(r'/ws', WSHandler),
])
if __name__ == "__main__":
http_server = tornado.httpserver.HTTPServer(application)
http_server.listen(8888) …Run Code Online (Sandbox Code Playgroud) 我想下载一个远程文件并提供文件名.如果文件在我们的服务器上,则此方法有效.但它不适用于远程文件和下载somerandomname.pdf
<a href="http://file.com/somerandomname.pdf" download="mypdf.pdf">DOWNLOAD</a>
Run Code Online (Sandbox Code Playgroud)
现在我尝试在python处理程序中下载它.它工作并下载我想要的文件名.但问题是我只能在浏览器中看到下载的文件util已完成下载.我无法在浏览器中看到下载过程.它只是在后端加载远程文件.有没有办法来解决这个问题?
def get(self):
url = self.get_argument('url')
filename = self.get_argument('filename')
self.set_header('Content-Type', 'application/octet-stream')
self.set_header('Content-Disposition', 'attachment; filename=%s' % filename)
f = urllib2.urlopen(url)
self.write(f.read())
self.finish()
Run Code Online (Sandbox Code Playgroud) 我想在龙卷风的异步GET请求处理程序中运行一个缓慢的阻止方法(实际上是从第三方库中)。将该方法设为:
def blocking_method(uid):
print("slow method started: ", uid)
time.sleep(10)
print("slow method done: ", uid)
return "slow method ({}) result".format(uid)
Run Code Online (Sandbox Code Playgroud)
此外,我更喜欢在asyncio的事件循环中运行龙卷风服务器:
if __name__ == '__main__':
tornado.platform.asyncio.AsyncIOMainLoop().install()
loop = asyncio.get_event_loop()
loop.run_until_complete(make_app())
loop.run_forever()
Run Code Online (Sandbox Code Playgroud)
我知道@run_in_executor装饰器,但是它不适合我,因为我使用asyncio。要在异步协程中运行阻止方法,应使用的run_in_executor方法asyncio.get_event_loop()。这是一个示例,如何从此答案中做到这一点:
import asyncio
async def main():
loop = asyncio.get_event_loop()
executor = concurrent.futures.ThreadPoolExecutor(max_workers=4)
future1 = loop.run_in_executor(executor, blocking_method, 1)
future2 = loop.run_in_executor(executor, blocking_method, 2)
response1 = await future1
response2 = await future2
print(response1)
print(response2)
if __name__ == '__main__':
loop = asyncio.get_event_loop()
loop.run_until_complete(main())
Run Code Online (Sandbox Code Playgroud)
而且效果很好,这是先前脚本的输出:
slow …Run Code Online (Sandbox Code Playgroud) 我正在尝试仅运行Tornado文档中的Hello World代码
import tornado.ioloop
import tornado.web
class MainHandler(tornado.web.RequestHandler):
def get(self):
self.write("Hello, world")
def make_app():
return tornado.web.Application([
(r"/", MainHandler),
])
if __name__ == "__main__":
app = make_app()
app.listen(8888)
tornado.ioloop.IOLoop.current().start()
Run Code Online (Sandbox Code Playgroud)
除非出现错误: AttributeError: module 'test' has no attribute '__path__'
我只是使用IDLE运行 test.py
我以为这是由于我的Windows 10计算机没有Python可以访问,PATH但是即使在Python 3.6中添加了Python,PATH我仍然遇到相同的错误。有任何想法吗?
屏幕截图是我向其中添加python的方式PATH,我认为我理解正确。
------ 编辑 ------
我会添加一些我遇到的错误/回溯的屏幕截图。第一个是test.pyWindows 10中在IDLE 3.6中运行时下面的命令提示符。
python ×10
tornado ×10
asynchronous ×1
cdn ×1
csv ×1
download ×1
path ×1
python-2.7 ×1
raspberry-pi ×1
regex ×1
url ×1
websocket ×1