Django是一个非常流行的基于Python的Web后端框架,大致跟PHP的作用相似,即在服务器端执行某些代码然后将数据返回给浏览器。
相比于PHP,Django更接近于“后台”,因为它可以方便的执行后台代码,而PHP需要后台代码具有CGI接口或直接起调一个新的进程(尽管有时候这样更快)。
这次要做的是一个小的Web应用,目的是为了解决网络中塔语显示不便的问题,项目现在放在https://github.com/sjx95/Hymmnos-Picture-Generator。该程序从URL中GET一段(目前是句)塔语,然后渲染成图片并返回。这样需要在OO空间之类的地方只需要插入一张URL为类似 http://hymmnos.himmel.tech/pic.png?text=Hymmnos 的图片就可以了。效果如下:
思路整理
- 处理URL路由规则,将请求交给相应的代码来处理
- 编写一个简单的引导页面
- 获取请求图片时传递进来的GET参数
- 使用PIL(Pillow)的ImageFont功能将文字画在图片上
- 将图片进行PNG编码并写入临时文件
- 从临时文件中读取数据并返回给浏览器
相应软件和包
- PyCharm (使用学生许可)
- Python2.7
- Django
- Pillow
流程
完成页面显示的功能,大致上可以参考 http://www.cnblogs.com/feixuelove1009/p/5823135.html 这篇文章,只不过这里面关于静态文件的做法不太合适,最好参照Django官方的说明,直接在myapp文件夹下新建static文件夹即可,不需要修改setting.py。
然后是具体的处理逻辑,不废话了直接贴代码,先是URL路由:
# urls.py urlpatterns = [ # url(r'^admin/', admin.site.urls), url(r'^pic.html$', hymmnos2picture.views.index), url(r'^pic.png', hymmnos2picture.views.pic), ]
可以看到,”/pic.html”这个页面被丢给了index函数处理,然后”/pic.png*”这个页面被丢给了pic函数处理。下面我们看看这两个函数:
# views.py # -*- coding: utf-8 -*- from __future__ import unicode_literals from django.shortcuts import render from django.shortcuts import HttpResponse from PIL import Image, ImageDraw, ImageFont from tempfile import TemporaryFile def index(request): return render(None, 'hymmnos2picture_welcome.html') def pic(request): if request.method == "GET": if request.GET.has_key("text"): text = request.GET.get("text", None) size = 48 # 生成图片 font = ImageFont.truetype("hymmnos2picture/static/hymmnos.ttf", size) image = Image.new('1', font.getsize(text)) draw = ImageDraw.Draw(image) draw.text((0,0), text, font=font, fill='#66ccff') # 写入临时文件 tmp_file = TemporaryFile() image.save(tmp_file, 'png') tmp_file.seek(0); image_data = tmp_file.read() # 把图片文件返回给浏览器 return HttpResponse(image_data, content_type="image/png") # 注意旧版的资料使用mimetype,现在已经改为content_type return HttpResponse("Illegal Parameter")
index函数直接返回了一个静态的HTML页面(用render是为了方便之后可能的扩展),pic函数,额我觉得这个代码应该挺好懂的,就不多做解释了。不过要记得临时文件写完之后要把文件指针“归零”,否则后面读不出来的。
然后 python manage.py runserver localhost:8000 就可以在本地测试啦,至于部署,我还没研究,就直接用这种调试方式部署在服务器上了……反正效率差点就差点了,又没有几个人用(滑稽)。
总结
可以看到,相比于PHP麻烦的C/C++调用,Python在做一些后台处理的时候就方便很多。不过由于MySQL-Python的坑似乎比较多,上次写一个数据展示页面,遇到了某库大小写等一系列问题,最终放弃了Django,使用PHP快速写了一下。
所以我觉得这两者各有优势吧,灵活选择,灵活选择……
哦,对了,颜色、字号啥的自定义接下来几个更新会做,先凑合用吧……