Django的日志配置

Django对于日志输出的信息是很完善的,request的信息,setting配置,trackback的信息,一应俱全,足够我们调试了。但是在线上环境,如果让用户看到这些信息,是很不安全的(暴露代码)。所以在线上我们要关闭Debug,但是又不能扔掉这些调试信息,这就要用到logging模块。

logging模块其实是Python的模块,在Django中有很多本地化的支持。

理解Logger

首先要理解logging的工作,这里面主要有四个东西:格式器formatter,过滤器filter,处理器handler,日志实例logger。

处理流程是这样的。首先,在代码中。我们拿到的是logger实例,通过这个实例来记录信息。

然后,名字是django的这个logger就会把信息交给相应的handler,handler把信息用formater和filter处理一下,提交log(保存到文件,数据库,或者发送邮件)。

一般来说,handler可以是send_email,error_file等负责处理的方式,在logger中可以重复使用handler。例如我们的django处理器使用了send_email, error_file 这两个处理器,request处理器使用error_file,info_file两个处理器,logger和handler可以理解成多对多的关系,嘻嘻。

配置方式

Python中可以使用多种格式配置logging,比如.conf, .ini等。

在Django中,我们是把有关logging的配置写到settings里面。相应的配置及解释如下(仅供参考)。

以上的配置文件中,有三个日志处理器。分别是:

  1. ‘django.request’:django的request发生error会自动记录,然后使用debug将信息记录到文件,还有mail_admins将信息通过邮件发送给管理员。这里邮件的功能非常棒!并不是一个纯文本信息,而是一个html文件,和我们在浏览器看到的错误页面一模一样!要正常使用邮件功能需要像我一样配置一下上面的邮件发件人信息。我是直接去网易申请了一个邮箱。要格外注意三点:1.一定要去邮件服务商开启SMTP服务;2.不同的邮件服务商可能有一些特殊的设置,比如网易,会给你一个客户端授权码,这个才是密码,而不是网页的登录密码。3 注意服务商有没有对发信频率的限制。
  2. ‘django’:使用console处理器,将信息输出。在开发的时候就可以使用这个处理器(什么?print? 太low了!)
  3. 最后一个处理器见注释。

最后,不要忘了给日志的路径响应的权限。比如Apache2服务器,就需要给www-data写权限:

参考资料

  1. python logging模块使用教程
  2. Django文档 – logging
  3. 我的网站搭建(第12天) 关闭调试
 

VimScript学习笔记(6):变量

既然VimScript可以作为一门编程语言,那么别人都有的变量、条件判断、循环,它也应该有。本文介绍这些内容。

变量

使用let为变量赋值。

从上面的代码也可以看出,VimScript是一个动态类型的编程语言。

如果使用set,那么就会作为一个选项(Option)赋值。取得Option的值需要在前面加一个&符号。

布尔类型有些特殊,是通过在前面no或者不加来区分。

由此也可以看出,Vim将0作为假,1零)作为真。

使用let&符号也可以为选项赋值。

区别在于,set只能赋一个单一的值,而let可以将它们作为变量来计算

如果要使用let设置Buffer-Local(只在当前窗口有效)的选项,要加l:前缀。同时打开两个文件,分别执行下面的代码。发现一个显示了行号,另一个没显示。

除了将选项作为变量,你还可以将寄存器作为变量。

输入下面的命令,然后移到切换到Normal Mode,键入"ap。你会发现Vim粘贴了寄存器a保存的内容。

寄存器的变量也可以被读出来:

其实,其他有很多地方都是用到了寄存器。例如使用yy复制一行,可以通过:echo @"查看,"就是一个匿名的寄存器。使用/someword搜索功能,可以使用:echo @/查看搜索的单词。

Vim中的变量有“名字空间”的概念,下面这个方式,会只设置当前窗口的hello变量。

通过:help internal-variables命令,可以查看Vim支持的所有的名字空间。

Numbers

VimScript支持两种数字类型,Numbers和Floats。

Number是32位的有符号整数。Float是单浮点数字类型。

Number类型支持不同的进制表示方法。0x0X开头的是16进制,0开头的是八进制。尝试以下代码。

因为019不是一个合法的八进制数,所以Vim会静默地将它当做10进制。这样并不安全,应该尽量不使用八进制。

Float类型支持科学表示方法。

如果涉及到NumberFloat的运算,Vim会将Number转换成Float,然后返回一个Float(类型提升)。

如果两个Number做除法,Vim会丢掉余数。(这几点和高级语言,如Python,的表现是一致的)

String

需要注意的是,+Number的运算符,而.才是用来连接字符串的。如果对字符串使用+,Vim会把字符串转换成数字。关于转换规则,我们在VimScript学习笔记(7):条件判断和比较这里讨论过了。

参考下面的运算。

要记住,String不能和Float一起处理,只能和Number进行处理。

特殊字符,使用\转义。

单引号包裹的,是纯字符串。不会进行转义。特殊的,连续两个单引号,被转义为一个单引号。

对一个编辑器的脚本语言来说,最重要的就是处理字符串了。在Vim中,内置了一些处理字符串的方法。例如,获取字符串的长度,分割,连接,处理大小写等等。具体的用法,参考下面的代码。

 

 

 

VimScript学习笔记(5):组织VimScript代码

VimScript可以作为一个完整的编程语言使用,这也是Vim的强大之处。但是又和我们以前学过的编程语言不太一样。毕竟,这是一个针对编辑器的语言。

很多在别的编程语言方面的经验适用于Vim,比如给超过1行的代码写注释,解释这段代码的作用;保持VimScript的可读性和可维护性。

也有很多奇怪的地方,我们用别的原因的时候,不会这么做。其中一个主要的原因是,我们可以想当然的认为,VimScript只可能在Vim中打开。如果有人用别的编辑器编辑Vim脚本,我就不说什么了。

折叠VimScript

时间一长,~/.vimrc文件就变得很长,这一段那一段,很不好维护,也不好跳转。那么,有经验的程序员就会想到模块化。

之前的我们讨论了给命令分组,这里就派上了用场。例如,将与VimScript相关的代码分成一组:

此外,还可以通过打开Vim的折叠,让~/.vimrc文件的浏览,跳转更加方便。Vim支持不同的折叠方法,比如根据缩进折叠,根据语法折叠,等等。详细的可以在Vim中通过:help foldmethod查看。针对Vim文件,我们用maker来折叠。这个折叠方法会折叠所有{{{和}}}之间的内容。像下面这样。

这种方式初次看起来有些奇怪,因为用首尾注释,感觉代码都被注释了一样。但是这毕竟是VimScript,一般来说只会在Vim中看到。所以熟悉之后也还好。建议再加一个缩写,写起来更快。

关于命令的简写

Vim对大多数命令都支持简写形式,比如上面的foldmethod,等价于fdm

但是缩写一般是用于手打的情况,写VimScript,建议都写全写,便于阅读和维护。

 

认识Django的Class-Based-View

学习Django非常简单,几乎不用花什么精力就可以入门了。配置一个url,分给一个函数处理它,返回response,几乎都没有什么很难理解的地方。

写多了,有些问题才逐渐认识到。比如有一个view比较复杂,调用了很多其他的函数。想要把这些函数封装起来,怎么办?当然,可以用注释#------view------这样将函数隔离开,这种方法太low了,简直是在骗自己,连封装都算不上。

Python是一个面向对象的编程语言,如果只用函数来开发,有很多面向对象的优点就错失了(继承、封装、多态)。所以Django在后来加入了Class-Based-View。可以让我们用类写View。这样做的优点主要下面两种:

  1. 提高了代码的复用性,可以使用面向对象的技术,比如Mixin(多继承)
  2. 可以用不同的函数针对不同的HTTP方法处理,而不是通过很多if判断,提高代码可读性

使用class-based views

如果我们要写一个处理GET方法的view,用函数写的话是下面这样。

如果用class-based view写的话,就是下面这样。

Django的url是将一个请求分配给可调用的函数的,而不是一个class。针对这个问题,class-based view提供了一个as_view()静态方法(也就是类方法),调用这个方法,会创建一个类的实例,然后通过实例调用dispatch()方法,dispatch()方法会根据request的method的不同调用相应的方法来处理request(如get(),post()等)。到这里,这些方法和function-based view差不多了,要接收request,得到一个response返回。如果方法没有定义,会抛出HttpResponseNotAllowed异常。

在url中,就这么写:

类的属性可以通过两种方法设置,第一种是常见的Python的方法,可以被子类覆盖。

第二种方法,你也可以在url中指定类的属性:

使用Mixin

Django中使用Mixin来重用代码,一个View Class可以继承多个Mixin,但是只能继承一个View(包括View的子类),推荐把View写在最右边,多个Mixin写在左边。Mixin也是比较复杂的技术,本文不详细说了,以后写一篇针对Mixin的文章吧。

使用装饰器

在CBV中,可以使用method_decorator来装饰方法。

也可以写在类上面,传入方法的名字。

如果有多个装饰器装饰一个方法,可以写成一个list。例如,下面这两种写法是等价的。

 

参考资料

  1. Introduction to class-based views
  2. Django 1.6 最佳实践: 如何正确使用 CBVs (Class-based views)
 

VimScript学习笔记(4):状态条

Vim的状态条支持自定义,键入下面这条命令,会让Vim的状态条只显示文件名。

状态条的格式和C语言的printf以及Python格式化字符串的方式很像,支持左对齐,右对齐,最小宽度,0补位等等。具体格式如下:

此外,使用下面这种方式定义,可以大大增加可读性。

更多相关的细节,以及Vim支持的所有状态,可以在Vim中使用:help statusline命令查看。

至此,基本的Vim命令已经差不多了。相关概念已经准备好了,即使遇到不会的,也可以通过Google+help文档解决。下面开始,就要将VimScript作为一个真正的Script编程语言来学习了。