我一直在玩Tornado,我写了一些看起来不太好的代码.
我正在编写一个应用程序来存储食谱作为示例.这些是我的处理程序:
handlers = [
(r"/recipes/", RecipeHandler),
(r"/recipes", RecipeSearchHandler), #so query params can be used to search
]
Run Code Online (Sandbox Code Playgroud)
这导致我写这个:
class RecipeHandler(RequestHandler):
def get(self):
self.render('recipes/index.html')
class RecipeSearchHandler(RequestHandler):
def get(self):
try:
name = self.get_argument('name', True)
self.write(name)
# will do some searching
except AssertionError:
self.write("no params")
# will probably redirect to /recipes/
Run Code Online (Sandbox Code Playgroud)
有没有更好的方法来处理这些URL没有尝试/除外?我喜欢/食谱和/食谱/显示相同的东西,而/食谱?名称=某些东西会进行搜索,理想情况下是一个不同的处理程序.
据我所知,Tornado是一个服务器和一个框架.在我看来,使用Flask和Tornado就像添加另一个抽象层(更多的开销).为什么人们一起使用Flask和Tornado,有什么优势?
我一直在玩Tornado Web服务器,并且已经到了我想停止Web服务器的地步(例如在单元测试期间).Tornado网页上存在以下简单示例:
import tornado.ioloop
import tornado.web
class MainHandler(tornado.web.RequestHandler):
def get(self):
self.write("Hello, world")
application = tornado.web.Application([
(r"/", MainHandler),
])
if __name__ == "__main__":
application.listen(8888)
tornado.ioloop.IOLoop.instance().start()
Run Code Online (Sandbox Code Playgroud)
一旦tornado.ioloop.IOLoop.instance().start()被调用,它就会阻塞程序(或当前线程).读取所述源代码的IOLoop对象给出了文档在这个例子中stop功能:
To use asynchronous methods from otherwise-synchronous code (such as
unit tests), you can start and stop the event loop like this:
ioloop = IOLoop()
async_method(ioloop=ioloop, callback=ioloop.stop)
ioloop.start()
ioloop.start() will return after async_method has run its callback,
whether that callback was invoked before or …Run Code Online (Sandbox Code Playgroud) 我在尝试这个:
favicon_path = '/path/to/favicon.ico'
settings = {'debug': True,
'static_path': os.path.join(PATH, 'static')}
handlers = [(r'/', WebHandler),
(r'/favicon.ico', tornado.web.StaticFileHandler, {'path': favicon_path})]
application = tornado.web.Application(handlers, **settings)
application.listen(port)
tornado.ioloop.IOLoop.instance().start()
Run Code Online (Sandbox Code Playgroud)
但是它一直favicon.ico在我的static_path中提供服务(我在两个不同favicon.ico的路径中有两个不同的路径,如上所示,但我希望能够覆盖它中的那个static_path).
我有一个RequestHandler传入post()的对象.如何找到发出请求的客户端的IP?我浏览了大部分RequestHandler的方法和属性,似乎错过了一些东西.
我需要在生产模式下运行React,这可能需要在环境中的某个地方定义以下内容:
process.env.NODE_ENV = 'production';
Run Code Online (Sandbox Code Playgroud)
问题是我在Tornado(一个python web-server)后面运行它,而不是Node.js. 我还使用Supervisord来管理龙卷风实例,所以在运行环境中如何设置它并不是很清楚.
但是我使用Gulp将我的jsx文件构建为javascript.
是否有可能以某种方式在Gulp中设置这个?如果是这样,我如何检查React是否在生产模式下运行?
这是我的Gulpfile.js:
'use strict';
var gulp = require('gulp'),
babelify = require('babelify'),
browserify = require('browserify'),
browserSync = require('browser-sync'),
source = require('vinyl-source-stream'),
uglify = require('gulp-uglify'),
buffer = require('vinyl-buffer');
var vendors = [
'react',
'react-bootstrap',
'jquery',
];
gulp.task('vendors', function () {
var stream = browserify({
debug: false,
require: vendors
});
stream.bundle()
.pipe(source('vendors.min.js'))
.pipe(buffer())
.pipe(uglify())
.pipe(gulp.dest('build/js'));
return stream;
});
gulp.task('app', function () {
var stream = browserify({
entries: ['./app/app.jsx'],
transform: [babelify],
debug: false,
extensions: ['.jsx'],
fullPaths: …Run Code Online (Sandbox Code Playgroud) 我目前正在使用以下内容来引发HTTP错误请求:
raise tornado.web.HTTPError(400)
Run Code Online (Sandbox Code Playgroud)
返回一个html输出:
<html><title>400: Bad Request</title><body>400: Bad Request</body></html>
Run Code Online (Sandbox Code Playgroud)
是否可以使用自定义正文返回HTTP响应代码?
如何将Django与Tornado Web服务器一起使用?
我想知道龙卷风的内部工作流程,看过这篇文章,它很棒,但是我无法弄清楚
在ioloop.py中,有这样的功能
def add_handler(self, fd, handler, events):
"""Registers the given handler to receive the given events for fd."""
self._handlers[fd] = handler
self._impl.register(fd, events | self.ERROR)
Run Code Online (Sandbox Code Playgroud)
这是什么意思?每个请求都会触发add_handler,或者只是在init时触发一次?
每个socket连接都会生成一个文件描述符,或者它只生成一次?
ioloop和iostream之间的关系是什么?
httpserver如何与ioloop和iostream一起使用?
是否有任何工作流程图,所以我可以清楚地看到它?
对不起这些问题,我只是感到困惑
任何链接,建议,提示有帮助.非常感谢 :)
除了Twistar之外还有其他异步Python ORM 吗?
我正在寻找基于龙卷风的非阻塞API的轻量级ORM.当然,我可以使用momoko编写原始SQL查询,但我想使用对象.