燕之庐网站建设 - 优质网站设计公司

Archive for 3月 13th, 2010

python

2010/03/13

用python来收发邮件

Tags:

由于python的模块很强大,用python来收发邮件,就显得很轻松了。
python不仅有email模 块,还有专门处理popsmtp甚至imap的模块。
下面就来演示一下这几个的用法,先看看怎么用pop3和email模块来收邮件。

>>> import poplib
>>> p=poplib.POP3_SSL('pop.gmail.com')  #如果服务器不需要启用SSL,那么只需要用 poplib.POP3('xxx.com') 就好了。
>>> p.user('xxxxx')
'+OK send PASS'
>>> p.pass_('密码')
'+OK Welcome.'
>>> p.stat() #统计状态,返回一个元组,第一个表示几封邮件,第二个表示一共几个字节
(2, 4543)
>>> p.list() #返回每个邮件的状态
('+OK 2 messages (4543 bytes)', ['1 3679', '2 864'], 15)
>>> p.retr(2) #获取某个邮件的全文,这个邮件就是我自己给另一个测试账号发的邮件,元组里包含了邮件头和邮件的正文。
('+OK message follows', ['Delivere
...为了排版方便,此处有删节...
e--'], 869)
>>> mailsrc='\n'.join([l for l in p.retr(2)[1]])
>>> print mailsrc #如果上面还看不出啥的话,这样看应该就明显了。
Delivered-To: xxxxx@gmail.com
Received: by 10.216.47.83 with SMTP id s61cs422102web;
        Sat, 15 Aug 2009 07:58:32 -0700 (PDT)
MIME-Version: 1.0
Received: by 10.114.180.16 with SMTP id c16mr2819847waf.57.1250348310512; Sat,
	15 Aug 2009 07:58:30 -0700 (PDT)
Date: Sat, 15 Aug 2009 22:58:30 +0800
Message-ID: <ae14629e0908150758n49649527xf326b8c1a60f36bf@mail.gmail.com>
Subject: =?UTF-8?B?5rWL6K+V5Li76aKY?=
From: LLY <xxxxx@gmail.com>
To: xxxxx@gmail.com
Content-Type: multipart/alternative; boundary=001636417e2fe4c3a904712f669e

--001636417e2fe4c3a904712f669e
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: base64

5rWL6K+V5q2j5paHCg==
--001636417e2fe4c3a904712f669e
Content-Type: text/html; charset=UTF-8
Content-Transfer-Encoding: base64

5rWL6K+V5q2j5paHPGJyPgo=
--001636417e2fe4c3a904712f669e--
>>> p.quit() #收完邮件了,理论上是要退出一下的
'+OK Farewell.'
>>> import email #源码得到了,现在轮到email模块登场了
>>> e=email.message_from_string(mailsrc) #这个就可以把邮件源码转换成一个email的对象了。
>>> print e['subject'] #这个是编码后的主题
=?UTF-8?B?5rWL6K+V5Li76aKY?=
>>> print email.header.decode_header(e['subject'])[0][0] #这个是解码后的主题
测试主题
>>> e.get_payload() #获取当前email的有效部分,可以看到有这个邮件有两个部分,从上面的邮件源码,我们也可以得知,此邮件确实有text/plain 和 text/html 两部分
[<email.message.Message instance at 0xb751102c>, <email.message.Message instance at 0xb751172c>]
>>> e.get_payload(0) #获取有效部分的第一个,这个还是一个email对象的实例。
<email.message.Message instance at 0xb751102c>
>>> type(e)
<type 'instance'>
>>> type(e.get_payload(0))
<type 'instance'>
>>> import base64 #解码邮件正文还得用上base64模块
>>> print base64.decodestring(e.get_payload(0).get_payload()) #解码正文的第一部分
测试正文

>>> print base64.decodestring(e.get_payload(1).get_payload()) #解码正文的第二部分,是html,看来只多了个br而已,哈哈
测试正文<br>

当然,上面的例子只是最简单的,复杂的附件什么的,也可以用库里的相关函数一一搞定的。另外,看文档的意思,传了get_payload的第二个参数按理 应该能自动调用base64模块解码的,但是不知道为什么,我没有试验成功,只能自己手工解了~
 下面,再来看看怎么用smtp发邮件,如果是复杂的邮件,也需要建立一个email对象的实例,把正文/附件等一一放上去就好,但是作为演示,我们就用邮 件的源码来发一个纯手工的,哈哈
>>> import smtplib #加载模块
>>> msg='To: xxxxx@gmail.com\r\nFrom: my@localhost\r\nSubject: test\r\n\r\nthis is msg body\r\n' #邮件的源码
>>> s=smtplib.SMTP('smtp.163.com') #同样这里也有SMTP_SSL,到底用什么要看服务器的设置
>>> s.login('xxxxx','密码') #一般都要登录了,才能发邮件,login里提供两个参数,用户名和密码
(235, 'Authentication successful')
>>> s.sendmail('xxxxx@163.com','xxxxx@gmail.com',msg) #发送邮件,三个参数分别是 from/to/msg,就这名简单就成功了。。
{}
>>> s.quit()
(421, 'closing transmission channel')

网站建设

python

python代码风格检查工具──pylint

Tags:

pylint是一个python代码检查工具,可 以帮助python程序员方便地检查程序代码的语法和风格,通过这个工具,可以使你的python代码尽量保持完美,哈哈。
具体可以检查什么东西呢?
比如你写了 from XXX import * 了,它就会提示你这样import是不好的。
比如你操作符的前后没有空格,它也会提示你。
比如逗号后面没跟空格也会。
还有你import了没用到的模块,定义了没使用的变量等也会提示。
还有你的变量名是否符合规范也会提示。
总之它提示的内容很多很全面,而且它最后会给出一个所检查的代码的总体分数,如果能达到满分10分的话,简直就是神作了,因为pylint本身的代码也才 9.5分左右,哈哈。
比较惨的是,TX发现这个工具以后,检查了几个python项目的分数,都不是很高,我那gmbox得了2分多点,还算是高的。不过,经过一番优化,现在 的gmbox已经有6.64分,及格了,哈哈。。
值得一提的是,pylint不仅可以像默认那样输出字符结果,还可以彩色化输出,甚至还可以输出HTML和visual studio的格式。具体用法可以参见man页和这个文 档。

网站建设

python

Django中解决for循环数据下面套循环

Tags:

有的时候我们需要解决在查询的时候这种情况
for()
{

记录1 以此记录为条件继续进行一个条件查询 得到一个新的数据集

在Django这一层处理已经到了模板层了 而模板层是HTML代码不可能进行数据库再查所以

}

解 决方案:

1. 方案就是写自定义标签
模板层这样写:
<td align=”center”>{{typename|nagio1filter}}</td>

第二步:写这个自定义 标签体的内容

@register.filter(name=’nagio2filter’)
def nagio2filter(value):

str1 = value.upper()

if str1.find(”MAIL”) > 0 :
return “MAIL”
这样的话就相当于  把传过来的参数值替换掉成新的值了!

北京网站建设公司

python

Django的数据库查询,filter和 get的区别

Tags:

filter returns a QuerySet representing the set of all objects that match the query,

but get tries to return one, and only one, object. (If no objects match your query, or if more than one object
matches, it will raise an exception.)

说白了一点:如果get操作可能会导 致出来异常原因

get只能返回一条记录集多了或没有就有异常

而filter 相当于是 where条件性查询了!

我 刚才在命令行进行调试发现了一个新的区别点!

对象.objects.get()

不能使用len 取长度的!

而 如果是使用filter 的话就能够使用len 取长度的!

python

Django+Ajax实战

Tags:

1.看到网上这方面的资料比较少的。自己写点东西出来看看对将来有所整理帮助!
示例一:
前端<div>
服务端:返回 的是文本或是一段HTML代码
JS代码还是原来的一样:
var xmlHttp;
function createXMLHttpRequest() {
if (window.ActiveXObject) {
xmlHttp = new ActiveXObject(”Microsoft.XMLHTTP”);
} else if (window.XMLHttpRequest) {
xmlHttp = new XMLHttpRequest();
}
}
function startRequest(i_option) {
createXMLHttpRequest();
xmlHttp.onreadystatechange = handleStateChange;
var qurl = “/networkport/ajax/?i_option=’”+i_option+”‘”;//发送请求到的URL地址
xmlHttp.open(”GET”, qurl, true);
xmlHttp.send(null);
}
function handleStateChange() {
if(xmlHttp.readyState == 4) {
if(xmlHttp.status == 200) {
document.getElementById(’np_server_serial’).innerHTML = xmlHttp.responseText;
}
}
}
<div id = “np_server_serial”></div>
服务器端代码:
def ajax(request):
return HttpResponse(”hello”)
返回的是一段文本。
也 可以是返回一段HTML代码请看:
def ajax(request):
return HttpResponse(”<select><option>123</option><option>456</option></select>”)
直 接生成一段HTML片段出来。则客户端一样是可以解析出来使用的!

还可以是从模型层中读取出来的数据拼结出来的数据返回到客户端如下:
def ajax(request):
i_option = request.GET.get(’i_option’,”)
result = “<select>”
serverinfolist = ServerInfo.getAllServerInfo(i_option)
for record in serverinfolist:
i_serverserial = record[1]
result = result + “<option>%s</option>”%(i_serverserial)
result = result + “</select>”
return HttpResponse(result)
直 接是一段<select>的HTML代码。

现在我将<select> 部分放到客户端去。服务端只返回的是<option>里面的内容

option 集合可返回包含 <select> 元素中所有 <option> 的一个数组。即返回的是一个数组。
obj.options[obj.options.length] = new Option(’0123′,’0′);\n

obj.options[obj.options.length] = new Option(’123′,’456′);\n

function handleStateChange() {
if(xmlHttp.readyState == 4) {
if(xmlHttp.status == 200) {
var obj = document.getElementById(’np_server_serial’);
eval(xmlHttp.responseText);
}
}
}
客户端 的解析函数直接使用了eval方法处理的!
服务端的代码:
def locaajax(request):
i_option = request.GET.get(’i_option’,”)
result = “obj.options[obj.options.length] = new Option(’位置’,'0′);\n”
serverinfolist = ServerInfo.getAllServerInfo(i_option)
for record in serverinfolist:
i_location = record[3]
result = result + “obj.options[obj.options.length] = new Option(’456′,’123′);\n”

logging.debug(result)
return HttpResponse(result)
可以直接返回一段HTML代码片段回来的。然后重新解析生成SELECT数据的!

解 决上面的BUG。不能正常读取来自数据库的记录值 即:
result = result + “obj.options[obj.options.length] = new Option(’456′,’123′);\n”
这一句 有问题。
result = result + “obj.options[obj.options.length] = new Option(’” + i_serverserial + “‘,’” + i_serverserial +”‘);\n”
这样的解决不行!
(报 的异常是:’ascii’ codec can’t decode byte 0xe8)
表示的是:有编码问题。我查了一个DB发现是gbk编码 而我页面是UTF-8

解决方法整理:
第一步:原来我建表的时候是直接使用ORM创建的。而ORM创建的时候原来将表都设置成了 GB2312
估计是数据库是GB2312的编码 而我的页面是UTF-8的编码所以不能正常转换过来的!

整理一下Python里 面的编码函数:

result=result.decode("gbk").encode("utf-8")

上面的语句即是将结果按gbk解码,然后按utf-8编码。

decode表示这个字符串是按照什么进行解码。encode表示按照什 么进行编码

(报的异常是:’ascii’ codec can’t decode byte 0xe8) 我的解决之道:

因为我的数据库是GB2312的编码。所以取出来是GB2312了。

而我的页面代码是UTF-8的编码所以。 需要进行一次转码

result=result.decode("gbk").encode("utf-8")

前面因为是DB为GBK的编码所以先进行解码出来。然后再重新编码一下。

我的最终解决方案:
def ajax(request):
i_option = request.GET.get(’i_option’,”)
result = “obj.options[obj.options.length] = new Option(’请选择’,'0′);\n”
serverinfolist = ServerInfo.getAllServerInfo(i_option)
for record in serverinfolist:
i_serverserial = record[1]
i_serverserial = i_serverserial.decode(”gbk”).encode(”utf-8″)
result = result + “obj.options[obj.options.length] = new Option(’%s’,'%s’);\n”%(i_serverserial,i_serverserial)
return HttpResponse(result)
返回的是select中的中间部分数据出来。
返回到了客户端再进行一次新的拼结出来!

完 成select的联动AJAX!没用JQuery框架

网站建设

python

Django中常用命令

Tags:

python django
django 基本命令操作:
django-admin startproject jay:建立一个jay的项目
django-admin startapp haha 建立一个haha的APP
python manage.py runserver 启动服务器
python manage.py validate 检查模型的有效性
python manage.py sqlall app名称
manage.py syncdb:同步数据库,这也大大减少了不懂的数据库知识的开发人员的工作量
manage.py sql <appname>:查看数据库中所存在的表
manage.py shell:进入SHELL状态

settings.py:设置数据库,环境语言,时区,中间件,安装APP,模板目录,国际化等等

urls.py:配置VIEW和URL的映射

网站建设

python

浅谈Python的相对路径与绝对路径

Tags:

对于Python入门不久的同志这可能是一个比较头疼的问题,但对老鸟来说可能已经是老生常谈了.由于网上关于这方面的资料不多,所以这道菜更主要是为小 鸟准备的,虽然我也还是一支小鸟.也欢迎老鸟们品尝,并提出您们宝贵的意见.

Python是一门跨平台的语言,但并不是说你用Python随便写的一个程序就能在不同的平台都能运行.而相对路径和绝对路径是这方 面的典型(相对路径在Windows下可行,而在Linux下提示找不到相应的文件路径),因为Linux和Windows本身结构就存在着较大的差异, 而这差异也给写扩平台的程序造成了困难.我自己尝试过两种方法来解决这个问题,下边就与大家一起分享.
The first one: 程 序中涉及路径时先区分系统类型,再根据不同的操作系统作不同的处理.Python目前支持以下操作系统的识别: ‘posix’, ‘nt’, ‘mac’, ‘os2′, ‘ce’, ‘java’, ‘riscos’,我也没有完全试验过,不过目前主流的应用系统是Windows,Linux也在蓬勃的发展,所以我们主要区分它们就行了.一般我用一个 if…else语句来区分,菜鸟的做法,老鸟们怎么做呢?
if os.name == ”nt”
Windows路径…
else
Linux路径…
小节: 这种方法较笨,非常不灵活,但这样做解决了同一个程序可以同时在Windows和Linux下运行而不需要改动的问题
The second one: 这 种方法相对灵活的将相对路径转化为不同操作系统的绝对路径,我相对喜欢这种方法.for example: 你写了一个小系统,所有文件和子文件夹都放在一个f:\school的主文件夹里,这个主文件夹下有class,teacher,student,log 等文件夹,有main.py这个小系统的主文件,还有好一些subfile.py的文件.而主文件夹在Linux的路径可能为/home/kkk /school,其他相对的路径和Windows中相同.那么怎样统一他们呢?在main.py中定义一个全局变量path,赋值于path = os.path.abspath(os.path.dirname(sys.argv[0])),这个path在Windows下运行它的值 为”f:/school”,而在Linux下运行它的值为”/home/kkk/school”,写到这估计大家也知道我想干啥了,如果在程序中要访问 (读写)日志文件可以用path+”/log/kk.log”来表示文件的路径.
小节: 此方法相对于第一种方法灵活,需要注意的是path+”/log/kk.log”,我们一般喜欢用path+\\log\\kk.log这样的方式,但这 样在Linux中就行不通了,提示找不到文件路径.
注: 网上还有在主程序中加入sys.path.append(path),然后系统中访问文件用相对路径的方法,但我试了一下好像有问题(大家可以尝试一下, 让我也分享你们的劳动成果)
网站建设

python

python实现三元表达式

Tags:

wio = True if(int(result[0]) > int(s_perfalarm.wio)) else False
实现 的功能与if:
else
一样的!

北京网站建设公司

python, 产业新闻

如何判断输入的变量值为数字

Tags:

Q:如何判断一个字符串只包含数字字符

A:一种方法是 a.isdigit()。但这种方法对于包含正负号的数字字符串无效,因此更为准确的为:

try:
x = int(aPossibleInt)
… do something with x …
except ValueError:
… do something else …

这样更准确一些,适用性也更广。但如果你已经确信没有正负号,使用字符串 的isdigit()方法则更为方便。

a = “12.36″
print a.isdigit()   输出false

a = “12″
print a.isdigit()  输出 true

北京网站建设公司