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('名字'))