django和tornado的一些區別

tornado和django的區別

  • 從模板上來講javascript

    • 前端模板上的使用的語法有些區別css

    • tornado能夠經過render傳類及函數html

      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參數 java

        def methods1(self):
            return 'ui_methods1'
      • ui_modules要繼承UIModule類jquery

         
        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能夠經過上下文渲染器來傳web

      • 建立上下文渲染器文件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中sql

         
        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={}):
            """
                算法
                    一、先獲取全部頁碼列表
                    range_list = [1, 2, 3, 4, 5, 6, 7, 8, 9]
        ​
                    二、 而後定義須要展現的數目,這裏定義爲一個5
                    max_page_count = 5
        ​
                    三、獲取中間位置先後須要加減索引
                    center_index = max_page_count / 2
        ​
                    四、獲取當前頁面索引,這裏定義爲當前頁面爲5
                    curr_index = range_list.index(5)
                    range_list[curr_index-center_index:]
                    [3, 4, 5, 6, 7, 8, 9]
        ​
                    五、循環處理右邊
                    獲取一個計數器
                    當計數器的索引大於總數目時退出
                    [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,等等

相關文章
相關標籤/搜索