tornado和django的区别

  • 从模板上来说

    • 前端模板上的使用的语法有些区别

    • tornado可以通过render传类及函数

      class Calculation:
          def sum(self,a,b):
              return a+b
      class UiHandler(tornado.web.RequestHandler):
          def func(self):
              return 'arrow'
          def get(self):
              name = self.get_argument('name', 'no')
              self.render(
                  'index.html',
                  name = name,
                  func=self.func,
                  cal=Calculation,
              )
    • tornado可以通过ui_methods,ui_modules传函数和类

      handlers = [ui_methods=util.uimethod,
                  ui_modules=util.uimodules,
                  ]
      • ui_methods中的函数要传self参数 

        def methods1(self):
            return 'ui_methods1'
      • ui_modules要继承UIModule类

         

        from tornado.web import UIModule
        class Advertisdement(UIModule):
            def render(self, *args, **kwargs):
                return self.render_string('07ad.html')  #render传html文件 
            def css_files(self):
                return "/static/css/King_Chance_Layer7.css"  #css_files传css文件
            def javascript_files(self):   #javascript_files传js文件   
                return [
                    "/static/js/jquery_1_7.js",
                    "/static/js/King_Chance_Layer.js",
                    "/static/js/King_layer_test.js",
                ]
    • django可以通过上下文渲染器来传

      • 创建上下文渲染器文件context_processors.py

         

        from .models import GoodsCategory
        ​
        def category_list(request):
            category_list = GoodsCategory.objects.filter(status=0).all()
            return {"category_list": category_list}
      • 添加到settings的TEMPLATES中

         

        TEMPLATES = [
            {
                'BACKEND': 'django.template.backends.django.DjangoTemplates',
                'DIRS': [os.path.join(BASE_DIR, 'templates')],
                'APP_DIRS': True,
                'OPTIONS': {
                    'context_processors': [
                        'django.template.context_processors.debug',
                        'django.template.context_processors.request',
                        'django.contrib.auth.context_processors.auth',
                        'django.contrib.messages.context_processors.messages',
                        'django.template.context_processors.static',
                        'shop.context_processors.category_list',
                    ],  
                },
            },
        ]
      • 在前端页面使用

        <div class="breadcrumb">
                <a href="{% url 'shop:index' %}">全部分类</a>
                <span>></span>
                <a href="#">{{ goods_category.name }}</a>
            </div><div class="main_wrap clearfix">
                <div class="l_wrap fl clearfix">
                    <div class="new_goods">
                        <h3>新品推荐</h3>
                        {% refferral_goods cid %}
                    </div>
                </div>
    • django可以通过自定义标签来传

      • 在app下创建templatetags包在该目录下创建tags.py

         

        @register.simple_tag
        def divide_page(curr_page, page_obj, url_name, request_url, page_name="", args=(), kwargs={}):
            """
                算法
                    1、先获取所有页码列表
                    range_list = [1, 2, 3, 4, 5, 6, 7, 8, 9]
        ​
                    2、 然后定义需要展示的数目,这里定义为一个5
                    max_page_count = 5
        ​
                    3、获取中间位置前后需要加减索引
                    center_index = max_page_count / 2
        ​
                    4、获取当前页面索引,这里定义为当前页面为5
                    curr_index = range_list.index(5)
                    range_list[curr_index-center_index:]
                    [3, 4, 5, 6, 7, 8, 9]
        ​
                    5、循环处理右边
                    获取一个计数器
                    当计数器的索引大于总数目时退出
                    [3, 4, 5, 6, 7, 8, 9] 迭代这个时
                    当迭代到7的位置,计数器的值就为6,退出循环,就获取到以下列表
                    [3, 4, 5, 6, 7]
        ​
            """
            def parse_qs(qs):
                res = {}
                params = qs.split("&")
                for p_str in params:
                    k, v = p_str.split("=")
                    res[k] = urllib.unquote(v)
                return res
        ​
            url = reverse(url_name, args=args, kwargs=kwargs)       # 点击页码需要跳转的url前缀
            # 默认为unicode,这里修改为utf8
            url = url.encode("utf8")
            page_str = '<div class="pagenation">'
            max_page_count = 5
            page = page_obj.page(curr_page)
        ​
            # 获取当前get参数
            params = parse_qs(urlparse.urlparse(request_url).query.encode("utf8"))
        ​
            if not page_name:
                page_name = "curr_page"# 生成上一页html
            if page.has_previous():
                params[page_name] = curr_page - 1
        ​
                curr_url = "%s?%s" % (url, urllib.urlencode(params))
                page_str += '<a href="%s" style=" 上一页 </a>' % curr_url
        ​
            center_index = max_page_count / 2
            page_range = [c for c in page_obj.page_range]
            page_index = page_range.index(curr_page)
        ​
            if page_index >= center_index:
                page_range = page_range[page_index-center_index:]
        ​
            i = 1
            # 生成中间页码html
            for cp in page_range:
                params[page_name] = cp
                # curr_url = "%s?%s" % (url, "&".join(["%s=%s" % (k,v) for k,v in params.items()]))
                curr_url = "%s?%s" % (url, urllib.urlencode(params))
                if cp == curr_page:
                    page_str += '<a href="%s" class="active" style="%s</a>' % (
                        curr_url, cp)
                else:
                    page_str += '<a href="%s" >%s</a>' % (
                        curr_url, cp)
        ​
                i += 1
                if i > max_page_count:
                    break# 生成下一页html
            if page.has_next():
                params[page_name] = curr_page + 1
                curr_url = "%s?%s" % (url, urllib.urlencode(params))
                page_str += '<a href="%s" style=" 下一页 </a>' % curr_url
        ​
            page_str += "</div>"return mark_safe(page_str)
      • 在前端模板中调用

      •  

        {% extends 'shop_base.html' %}
        {% load tags %}
        ​
        {% block shop_js %}
            <script type="text/javascript" src="{{ STATIC_URL }}js/list.js"></script>
        {% endblock shop_js %}
        ​
        {% block index_content %} 
        {{ block.super }}
        ​
        <div>
            {% divide_page curr_page p 'shop:categorys' request.get_full_path kwargs=params %}
        </div>
  • 从数据库来说

    django有自己的ORM,而tornado的torndb不是很强大,所以一般都使用sqlalchemy

  • 从视图上来说

    • django可以用form做一些验证

    • render中django没有tornado可以传的参数类型多

  • 性能上来说

    tornado由于是单线程异步回调的模式,所以比django的并发要高

    django是多线程但是没有做异步,所以要比tornado的并发低

  • 从提供的插件上来说

    django提供了ORM,django.core.mail,django crontab,等等