超实用python小项目--基于python的手机通讯录二维码生成网站--2、python代码详解

  上班忙里偷闲,更新一下昨天的项目。

  首先展示一下项目的目录树形图:

  

  上代码:

 1 # -*- coding:utf-8 -*-
 2 
 3 import qrcode
 4 import web
 5 import time
 6 from PIL import Image
 7 import sys
 8 reload(sys)
 9 sys.setdefaultencoding('utf8')
10 '''不添加sys模块的setdefaultencoding方法,将会报错:
11  UnicodeDecodeError: 'ascii' codec can't decode byte 0xe5 in position 17: ordinal not in range(128) '''
12 
13 
14 #urls是一个元祖对象,左边的'/'是代表首页的意思,右边的‘Index’是映射到下文的Index类
15 urls = (
16     '/', 'Index'
17 
18 )
19 render = web.template.render('templates')   #此行代码作用是调用templates文件夹下的html模板
20 
21 
22 def code(info):
23     qr = qrcode.QRCode(
24         #二维码的基本配置:
25         version = 1,    #二维码的大小12*12
26         error_correction = qrcode.constants.ERROR_CORRECT_H, #二维码容错率,容错率越高,越容易被识别,中间的图片可以设置越大,二维码越密集;容错率最小,中间不能内嵌图片,二维码稀疏
27         box_size = 10,
28         border = 4,
29     )
30         #二维码的数据导入:
31     qr.add_data(
32         '''
33         BEGIN:VCARD\n       #名片开始
34         VERSION:3.0\n       #版本3.0
35         FN:%s\n             #名字
36         ORG:%s\n            #公司
37         TITLE:%s\n          #职位
38         ADR;WORK:%s\n       #地址
39         TEL;WORK:%s\n       #联系电话
40         EMAIL;WORK:%s\n     #邮箱
41         URL:%s\n            #个人主页
42         NOTE:%s\n           #备注
43         END:VCARD           #名片结束
44         ''' % (info['name'], info['company'], info['title'], info['address'], info['mobile'], info['email'], info['url'],info['desc'])
45     )   #添加数据
46     img = qr.make_image()   #创建二维码
47     img = img.convert("RGBA")   #转换为黑白格式
48     icon = Image.open("static/images/logo1.png")    #打开图片
49     img_w, img_h = img.size #整个二维码的宽高
50     n = 4
51     size_w = int(img_w/n)   #size是二维码中间Logo图片的宽和高
52     size_h = int(img_w/n)
53 
54     icon_w, icon_h = icon.size  #获取原始图片的宽高
55     if icon_w > size_w:         #假如原始图片的宽度大于二维码中间Logo图片,则让原始图片宽度等于二维码中间Logo图片的宽度
56         icon_w = size_w
57     if icon_h > size_h:         #同上
58         icon_h = size_w
59     icon = icon.resize((icon_w, icon_h), Image.ANTIALIAS)   #重采样
60     w = int(img_w-icon_w)/2     #二维码区域的宽度
61     h = int(img_h-icon_h)/2     #二维码区域的高度
62     img.paste(icon, (w,h), icon)    #将图片粘贴到二维码中
63 
64     '''生成的二维码的路径保存位置,
65         必须事先在static文件夹下创建CardImg文件夹,否则会报错
66         '''
67     path = "static/CardImg/%s.png" % time.time()
68     img.save(path)              #保存二维码
69     return path
70 
71 class Index(object):
72     def GET(self):              #浏览器请求后,web服务输出index.html
73         return render.index()
74     def POST(self):             #输入完表单,点击生成二维码的请求
75         print web.input()
76         return code(web.input()) #返回图片地址
77 
78 if __name__ == '__main__':      #主函数,启动web服务
79     web.application(urls, globals()).run()

  注:1、web框架实现服务的启动:

    (1)import web

    (2)url('匹配路由', '视图类')

    (3)render = web.template.render('templates')   #绑定html模板所在的文件夹

    (4)class 视图类(object) :

        GET(self):

          return render.xxx()    #xxx是templates目录下的html文件

        POST(self):          #假如涉及到表单提交,就用POST方法

          pass

    (5)主函数运行

    if __name__ == '__main__':      #主函数,启动web服务
         web.application(urls, globals()).run()   #globals()返回包含当前范围的全局变量的字典。

    2、二维码名片格式:vcard
    参考:http://www.cnblogs.com/qqhfeng/p/3584739.html 写得挺详细的,赞一个

    以上就是对代码的详细解释,要是写得有什么不对的地方,欢迎大家轻轻地提出批评意见,在此谢谢大家!反正我也不会改( wo hui hao hao gai jin de )。
posted @ 2016-12-21 10:35  Dzreal93  阅读(798)  评论(0编辑  收藏  举报