py-graphic


Python Image Upload Service based on MongoDB and Nginx

``` 1. Introduction

Py-graphic是一个使用python,monggodb和nginx开发的简单的图片上传服务,支持头像缩图生成(缩略图的大

小可以配置),附件图片的上传和压缩(指定上传图片的最大宽度,当超过的时候自动等比例压缩存储)等。上传图片 使用post请求,请求的body中带有uid和avatar或者attach参数即可。 开发这个服务的目的是想简化新网站搭建的过程,将一些模块组件化,之前开发的敏感词过虑模块py-confilter也是 出于这个目的。

  1. Installation

    Py-graphic的安装分为三个部分:Mongodb,Py-graphic,Nginx,模块结构的详细介绍请参见: http://troycheng.blogcn.com/articles/py-graphic%EF%BC%9A%E5%9B%BE%E7%89%87%E5%AD%98%E5%82%A8%E6%9C%8D%E5%8A%A1.html 编译安装mongodb的步骤请参见blog: http://troycheng.blogcn.com/articles/mongodb%E6%BA%90%E7%A0%81%E7%BC%96%E8%AF%91.html 编译安装nginx的步骤请参见blog: http://troycheng.blogcn.com/articles/nginx%E7%BC%96%E8%AF%91%E5%AE%89%E8%A3%85%E6%AD%A5%E9%AA%A4.html 此外还有几个依赖需要安装:GraphicMagick和python客户端pgmagick,注意这里编译安装GraphickMagick的时候需要使其支持png和jpeg,另外pgmaick需要GraphicMagick开启--enable-shared选项,mongodb客户端pymongo 编译安装完上述模块之后,下载并解压缩Py-graphic,进入py-graphic/conf/,修改配置文件graphic.cfg,配置 文件实例如下:

    # The config file for graphic service
    # Author: TroyCheng
    # Email: frostmourn716@gmail.com
    
    # This section defined some basic attributes
    [info]
    host = 127.0.0.1
    port = 9020
    poolSize = 3000
    
    # This section define the attributes for mongodb
    [mongodb]
    mongodb_host = 127.0.0.1
    mongodb_port = 9010
    max_pool_size = 100
    
    # define avatar db name and the thumbnail size(px)
    avatar_db = avatar
    avatar_size = 100x100,150x150
    
    # define user upload images db and max width(px)
    attach_db = attach 
    attach_max_width = 400
    

    在info部分指定的是py-graphic服务所绑定的地址和端口号,以及连接池的大小。 在mongodb部分配置mondb的地址,端口号还有连接池大小,另外还有头像和附件图片所使用的数据库以及图片的 大小。例如avatar-db指定头像存储的db名称,avatar_size指定头像缩略图的大小,支持多个比例,用英文逗号分隔。 attach_max_width指定附件图片的最大宽度(单位px),超过这个宽度的将会被等比例压缩到这个大小进行存储。 接下来配置nginx,主要是配置一下反向代理。步骤如下:

    打开nginx/conf/nginx.conf文件,在locaton部分添加如下配置:
            location /image/avatar/ {
                gridfs avatar
                    field=_id
                    type=objectid;
                mongo 127.0.0.1:9010;
            }
    
            location /image/attach/ {
                gridfs attach 
                    field=_id
                    type=objectid;
                mongo 127.0.0.1:9010
            }
    

    location后面的路径是访问的路径,gridfs指定访问的数据库名称,field指定参数对应grdifs所存data中的哪个字 段,type指明这个字段的类型,mongo则是mongodb的地址。访问时使用的url格式如下: http://nginx_host:port/image/avatar/IMAGE_UUID,其中IMAGE_UUID为图片存储之后返回的id。 根据http://www.webguo.com/2011/01/24/python_high_performance_webserver.html这篇文章和自己的实 验,使用Nginx作反向代理的时候,处理请求的能力是有所下降的,所以这里nginx只用来访问图片,上传图片的请求 直接交给py-graphic。这样将读写请求分离开了。

3.Usage

上面三个模块都配置完之后,进入py-graphic/bin目录,执行sudo python grapyicd.pystart|stop|restart即可,

example目录下有测试的页面,可以进行图片的上传,使用的时候注意修改一下form表单中action的地址,为py- graphic绑定的地址。上传成功会以json格式返回图片的id,通过这个id进行图片的访问即可。

```

Project Information

The project was created on Jul 28, 2011.

Labels:
Service ImageUpload Python Web MongoDB Nginx