Django 使用小记 && Hymmnos Picture Generator

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快速写了一下。

所以我觉得这两者各有优势吧,灵活选择,灵活选择……

哦,对了,颜色、字号啥的自定义接下来几个更新会做,先凑合用吧……

发表评论