初学Tornado框架以及和Django的对比

django和tornado区别
* 性能
 * 多线程或者多进程
 *  django使用的是( 多线程或者多进程)
 *  tornado使用的是协程(微线程),协程性能非常高(没有线程这种上下文创建,切换的开销)yield
* 功能
 * django 大而全(什么都有)(定制太困难了)
            后台(admin) 
            orm(对象关系映射类库)
            session
 * tornado 小而精 (轻量级)什么也没有 
 * tornado 单线程异步分阻塞(node.js)
 * tornado适用场景
            高并发,长连接

### tornado单线程异步分阻塞 ###
* 代码

            # 处理网络请求的    
            class IndexHandler(tornado.web.RequestHandler):
                # get请求
                def get(self):
                    # 输出响应体
                    self.write('hello world')

                #Application 其实是一个设置的容器
                app = tornado.web.Application([
                        (r'/',IndexHandler)
                    ])
                # 绑定端口(调用了HttpServer)
                app.listen(8000)
                # 死循环(从epoll中获得需要操作的socket)
                tornado.ioloop.IOLoop.instance().start()
* epoll
 * 客户端socket的储存的容器 

### 步骤 ###
* 清理类(RequestHandler)
* Application对象 (很多设置)
* app.listen(8000) 绑定端口,创建服务器
* ioLoop.start(不断的从epoll中读取要处理的客户端socket)

### 为什么tornado能处理高并发,长连接 ###
* 长连接(epoll容器存储起来了)    
* 高并发(使用的是协程,没有线程创建和线程上下文切换开销)        

                    def printa():
                        while True:
                        yield 'a'    
                    def printb():
                        while True:
                        yield 'b'
                    while True:
                        pirnta()
                        printb()

                    abababababab

### tornado特性 ###
* 单线程
* 异步(协程)
* 非阻塞

###  查询参数 ###
* get/post
 * get  get_query_argument  get_query_arguments 
 * post get_body_argument get_body_arguments
 * 缩写 get_argument  get_arguments(通用的)
 * 捕获  
 
                     

class TimeHandler(tornado.web.RequestHandler):
    def get(self,year,month,day):
        self.write('time'+year+month+day)
app = tornado.web.Application([
     (r'/time/(?P<month>\d+)/(?P<year>\d+)/(?P<day>\d+)',TimeHandler),具名捕获
     (r'/time/(\d+)/(\d+)/(\d+)',TimeHandler),
])                 
 * self.write(响应体)            
* file,大文件               

### 查询I(Input) ###
* get_argument 获得get/post参数
* 捕获/具名捕获
* self.request.files 上传多个文件
* self.request.headers 请求头
* self.request.remote_ip 获得客户端ip

class FileHandler(tornado.web.RequestHandler):
    def get(self, *args, **kwargs):
        if 'img' in self.request.files:
            imgfile=self.request.files['img']
            filename=imgfile[0]['filename']
            filebody=imgfile[0]['body']
            if not os.path.exists(MEDIA_ROOT):
                os.makedirs(MEDIA_ROOT)
            with open(os.path.join(MEDIA_ROOT,filename),'wb') as fw:
                fw.write(filebody)
        self.write('上传成功')
class IPBlock(object):
    def __init__(self,get_response):
        self.get_response = get_response
    def __call__(self, handler=None,*args, **kwargs):
        BLACK_IP=['127.0.0.1']
        if  handler.request.remote_ip in BLACK_IP:
            handler.write('禁止访问')
            return
        return self.get_response(handler)


class RemoteIPHandler(tornado.web.RequestHandler):
    # @IPBlock
    def get(self, *args, **kwargs):
        self.write(u'您的ip是:'+self.request.remote_ip)

    #get = IPBlock(get)
    # IPBLOCK(get)(self,)

###  输出O(Output) ###
* write () 响应体
* add_header()添加响应头  

         self.add_header('name','张三')

* set_status 设置状态码
* 自定义重定向

        class RedirctHandler(tornado.web.RequestHandler):
            def get(self, *args, **kwargs):

                # self.set_status(404,'照比到了')
                self.set_status(302,'FOUND')
                self.add_header('LOCATION','http://www.bjsxt.com')
 * 重定向(302,301)self.redirct(地址)
 * 301 永久重定向,         
 * set_cookie 
 

class CookieHandle(tornado.web.RequestHandler):
    def get(self,*args,**kwargs):
        print(self.get_cookie('sessionid','找不到'))
        import uuid
        import datetime
        self.set_cookie('sessionid',str(uuid.uuid4()),expires=datetime.datetime.utcnow()+ datetime.timedelta(minutes=30),path='/coo')
        self.write('cookie')


 * get_cookie

### 生命周期 ###    
* initialize--》prepare-->get/post-->on_finish    
* initialize和on_finish是一对,如果说initialize初始化工作,on_finish是清理功能。
* url中 (r'/',Handler,字典,name)    #字典是给Handler中的initialize方法的

              name的使用

class UserHandler(tornado.web.RequestHandler):
    def get(self, *args, **kwargs):
        print '用户没有登录到重定向login',self.reverse_url('lol')
        self.redirect(self.reverse_url('lol'))
app = tornado.web.Application([
    (r'/user',UserHandler),
    URLSpec(r'/login',LoginHandler,name='lol'),
])

* write_error 出错之后,会自动调用
* set_default_headers设置默认响应头
 *  write_error和set_default_headers 一般写在父类中,设置通用的响应头

class DefaultHandler(tornado.web.RequestHandler):
    def set_default_headers(self):
        self.add_header('name','hello')
        self.add_header('age',10)
    def get(self, *args, **kwargs):
        self.write('set_default_headers')
class CartHandler(tornado.web.RequestHandler):
    def get(self, *args, **kwargs):
        1/0 会出错
        self.write('测试错误')
    def write_error(self, status_code, **kwargs):
        print status_code,状态码
        print kwargs出错信息
        self.write('服务器暂时维护中')

### url路由 ###
* 元组
* URLSpec
 * 正则,处理类,初始化参数,名字(self.reverse_url('名字'))

               

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值