-
从模板上来说
-
前端模板上的使用的语法有些区别
-
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,等等
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:django和tornado的一些区别 - Python技术站