2017年8月13日

  1. img标签的alt用于图片不加载的时候显示,是用来做浏览器引擎优化(SEO)的, title是鼠标放上去显示的,用来给用户看的。
  2. django 模板如果需要应用某个变量或模块,可以在一个view里写一个函数,返回 字典值,再通过settings.py的TEMPLATE的context_processors中进行注册即可。
  3. django日志配置。示例
LOGGING = { 'disable_existing_loggers': False, 'version': 1, 'handlers': {     'console_handler': {         # logging handler that outputs log messages to terminal
         'class': 'logging.StreamHandler',         'level': 'DEBUG',  # message level to be written to console
         'formatter': 'simple',
     },     'default_handler': {         'level': 'DEBUG',         'class': 'logging.handlers.RotatingFileHandler',         'filename': 'log/all.log',  # 日志输出文件
         'maxBytes': 1024 * 1024 * 5,  # 文件大小
         'backupCount': 5,  # 备份份数
         "encoding": "utf-8",         'formatter': 'standard',  # 使用哪种formatters日志格式
     },     'error_handler': {         'level': 'ERROR',         'class': 'logging.handlers.RotatingFileHandler',         'filename': 'log/error.log',         'maxBytes': 1024 * 1024 * 5,         "encoding": "utf-8",         'backupCount': 5,         'formatter': 'standard',
     },     'login_logout_handler': {         'level': 'DEBUG',         'class': 'logging.handlers.RotatingFileHandler',         'filename': 'log/login_logout.log',         'maxBytes': 1024 * 1024 * 5,         "encoding": "utf-8",         'backupCount': 5,         'formatter': 'standard',
     }
 }, 'formatters': {     'standard': {         'format': '%(asctime)s [%(threadName)s:%(thread)d] [%(name)s:%(lineno)d] [%(module)s:%(funcName)s] [%(levelname)s]- %(message)s'},     'simple': {         'format': '%(levelname)s %(message)s'},
 }, 'loggers': {     # 所有django应用下的日志使用DEBUG级别
     'django': {         # this sets root level logger to log debug and higher level
         # logs to console. All other loggers inherit settings from
         # root level logger.
         'handlers': ['console_handler', "default_handler", 'error_handler'],         'level': 'DEBUG',         # 'propagate': True,  # this tells logger to send logging message
         # to its parent (will send if set to True)
     },     # 所有django.template下的日志使用INFO级别,并且不向上(django日志)传递,
     # 原因是如果使用DEBUG级别,碰到不存在的变量会在debug里打印错误栈帧
     'django.template': {         'handlers': ['console_handler', "default_handler", 'error_handler'],         'level': 'INFO',         'propagate': False,
     },     # 所有djanog.template下的日志使用DEBGUG级别打印日志
     'chameleon': {         'handlers': ['console_handler', "default_handler", 'error_handler'],         'level': 'DEBUG',
     },     # 登录登出系统专门用login_logout_handeler记录,并且会继续向上(chameleon)传递,记录到完整的里面
     'chameleon.views.views_login_logout': {         'handlers': ['login_logout_handler'],         'level': 'DEBUG',         'propagate': True,
     }
 },
}

首先根据需求定义处理器handlers,模型formatters。loggers里键为模块的名字。 值里有使用的处理器handler,level是本应用的日志级别,propagate表示是否向上传达。 向上传达的意思是django.template如果向上传达,会传达到django模块。 这里遇到了一个django的bug,即当django.template会在日志级别为DEBUG时再render Template 时遇到没有的变量以DEBUG级别打印错误栈帧轨迹(即使判断了{%if xxx%})。所以解决办法是配置一个 django.template模块的日志级别设为INFO就不再打印了,而且要将propagate设为True,防止向上传递。 而chameleon.views.views_login_logout这个模块希望单独通过一个handler来处理,就配置一个就好了,把 propagate设为True这样chameleon.views.views_login_logout会经由向上传递到chameleon里打印到all.log中。 另外如果想把error日志单独打印到error.log中,不需要额外处理,只需要再handlers中加入error_handler这样当 遇到error日志时就会打印到里面。

  1. django管理后台国际化需要设置 LANGUAGE_CODE = 'zh-hans'TIME_ZONE = 'Asia/Shanghai'USE_TZ = False

最后一项USE_TZ默认是True,这样管理后台显示的时间会比数据库里的时间早8个小时。

1.python读取xml,并用jinja2模板解析。

import xml.etree.cElementTree as ETfrom jinja2 import Template
xml_root_cache = Nonedef get_sql_from_xml(xml, tag, **kwargs):
 logger.info(f"sql-info:get   {tag}   from {xml} kwargs: {kwargs}") global xml_root_cache if DEBUG:
     root = ET.ElementTree(file=xml).getroot() else:     if xml_root_cache is None:
         root = ET.ElementTree(file=xml).getroot()
         xml_root_cache = root     else:
         root = xml_root_cache
 t = root.find(tag) if not hasattr(t, "text"):     return ""
 template = Template(t.text)
 sql = template.render(**kwargs) return sql

2.django中执行原生sql

from django.db import connection, transactiondef db_execute_with_trasaction(sql, *param):
 with connection.cursor() as cursor:
     cursor.execute(sql, *param)
     transaction.commit()def db_execute_with_trasaction(sql, *param):
 with connection.cursor() as cursor:
     cursor.execute(sql, *param)
     transaction.commit()def db_select_all(sql, *params):
 with connection.cursor() as cursor:
     cursor.execute(sql, *params)
     col_names = [desc[0] for desc in cursor.description]
     rows = cursor.fetchall()
     row = [dict(zip(col_names, r)) for r in rows]
 logging.info(f"sql-result:  {row}") return rowdef db_select_one(sql, *params):
 with connection.cursor() as cursor:
     cursor.execute(sql, *params)
     col_names = [desc[0] for desc in cursor.description]
     row = cursor.fetchone()     if row:
         row = dict(zip(col_names, row))     else:
         row = None
 logging.info(f"sql-result:  {row}") return row

原文发布于微信公众号 - python全栈布道师(gh_f7cbe2f9567b)

原文发表时间:2017-08-13

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏爱撒谎的男孩

Spring MVC处理异常

注意:使用SimpleMappingExceptionResolver处理异常时,不可以使用@ExceptionHandler!

36250
来自专栏编舟记

R3 Corda 和 springboot 集成

因为Corda内置的Corda Webserver已经被标记成弃用了,一般不再提供支持;再者,springboot的生态明显占优。

26220
来自专栏Spark学习技巧

锁机制-java面试

何为同步?JVM规范规定JVM基于进入和退出Monitor对象来实现方法同步和代码块同步,但两者的实现细节不一样。代码块同步是使用monitorenter和mo...

40160
来自专栏LEo的网络日志

python i18n实现

40270
来自专栏技术墨客

Spring核心——数据校验

在Java数据校验详解中详细介绍了Java数据校验相关的功能(简称Bean Validation,涵盖JSR-303、JSR-349、JSR-380),本文将在...

13410
来自专栏java思维导图

Spring思维导图,让Spring不再难懂(ioc篇)

写在前面 写过java的都知道:所有的对象都必须创建;或者说:使用对象之前必须先创建。而使用ioc之后,你就可以不再手动创建对象,而是从ioc容器中直接获取对象...

42070
来自专栏Java3y

Spring IOC知识点一网打尽!

19380
来自专栏技术墨客

Spring核心——数据校验

在Java数据校验详解中详细介绍了Java数据校验相关的功能(简称Bean Validation,涵盖JSR-303、JSR-349、JSR-380),本文将在...

67120
来自专栏haifeiWu与他朋友们的专栏

阿里 RPC 框架 DUBBO 初体验

最近研究了一下阿里开源的分布式RPC框架dubbo,楼主写了一个 demo,体验了一下dubbo的功能。

41820
来自专栏偏前端工程师的驿站

Eclipse魔法堂:任务管理器

一、前言                                  Eclipse的任务管理器为我们提供一个方便的入口查看工程代办事宜,并定位到对应的代...

22780

扫码关注云+社区

领取腾讯云代金券