zoukankan      html  css  js  c++  java
  • django和tornado的一些区别

    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,等等

  • 相关阅读:
    第五周反向传播算法
    PHP数组排序
    <meta-data>
    Android之Intent
    Fragment生命周期
    前端后台学习笔记汇杂
    IntelliJ IDEA 14.x 与 Tomcat 集成,创建并运行Java Web项目
    用java将excel中数据导入mysql
    幸运观众抽奖
    JTextField
  • 原文地址:https://www.cnblogs.com/arrow-kejin/p/8961450.html
Copyright © 2011-2022 走看看