Django安装配置Memcached缓存优化性能

2010-04-26 14:55:24 by sand, 1656 visits, Tags: 性能优化, Python, Django,

操作系统:Linux Cent OS 5 / Max OS X 10.6 snow leopard

环境:Python2.6.4 Django1.1

安装版本:Memcached 1.4.5

django的缓存机制可以实在的提高程序的性能,其中最快速最直接的就要数内存缓存memcached了

下面介绍一下安装配置及使用方式

  1. 下载:
    官方 http://memcached.org
    直接下载   http://memcached.googlecode.com/files/memcached-1.4.5.tar.gz
     
  2. 解压:
    tar zxvf memcached*
     
  3. 进入解压目录运行命令安装
    1)./configure
    2)make
    3)make install
     
  4. 安装完成可以测试一下:
    memcached -help
     
  5. 加入开机启动,编辑/etc/rc.local加入
    /usr/local/bin/memcached -d -m 16 -u root -l 127.0.0.1 -p 13031 -c 1024 -P /tmp/memcached.pid

    -d选项是启动一个守护进程
    -m是分配给Memcache使用的内存数量,单位是MB,我这里是16MB
    -u是运行Memcache的用户,我这里是root
    -l是监听的服务器IP地址
    -p是设置Memcache监听的端口,最好是1024以上的端口
    -c选项是最大运行的并发连接数,默认是1024,按照你服务器的负载量来设定
    -P是设置保存Memcache的pid文件
     
  6. django中的配置
    setting.py里配置CACHE_BACKEND = 'memcached://127.0.0.1:13031'
     
  7. 安装python与memcached绑定模块

    1)安装libmemcache
    下载:http://people.freebsd.org/~seanc/libmemcache/libmemcache-1.4.0.rc2.tar.bz2
    安装:
    ./configure
    make
    make install
    2)安装cmemcache
    下载:http://gijsbert.org/downloads/cmemcache/cmemcache-0.95.tar.bz2
    安装:
    python setup.py install
     
  8. 使用:
    from django.core.cache import cache
    cache.set('MyKey','myvalue',3600)
    #参数分别为key,value,超时时间
    cache.get('MyKey')
    cache.delete('MyKey')
     

错误及解决:

  1. 错误:configure: error: libevent is required.
    解决:
    安装libevent
    1)下载http://www.monkey.org/~provos/libevent-2.0.4-alpha.tar.gz
    2)解压:
    tar zxvf libevent*
    3)运行命令安装:
    ./configure
    make
    make install
     
  2. 错误:error while loading shared libraries: libevent.so.3: cannot open shared object file: No such file or directory
    解决:ln -s /usr/local/lib/libevent.so.3 /usr/lib/

评论 (2)        

Django admin实现图片文件上传

2010-04-24 22:52:18 by sand, 1375 visits, Tags: admin, Python, Django,

一般大家都知道django有个很好用的管理后台admin,普通应用这里就不说了,介绍一下他里面的内置实现的文件上传功能

  1. 首先在model里定义属性:
    pic = models.ImageField('图片',upload_to='uploadImages')
     
  2. 修改setting.py
    MEDIA_ROOT = 'media1001/'
    MEDIA_URL = '/webhost_media/'
     
  3. 数据库对应实体的表中添加pic字段,属性为文本,这个只是用来保存文件路径的
     
  4. 上面配置代表的意思大概是:
    上传图片到:web程序目录/media1001/uploadInages/
    访问路径为:http://hostname/webhost_media/uploadImages/filename.jpg
     
  5. 基本就是这样,大家可以试一下,很方便,页面调用为modelobjname.pic.url

     

错误及解决:
 

  1. framework.product: "pic": To use ImageFields, you need to install the Python Imaging Library. Get it at http://www.pythonware.com/products/pil/ .

    解决:安装Python Imaging Library (PIL)
    1)下载:
    官方:http://www.pythonware.com/products/pil/
    直接下载:http://effbot.org/downloads/Imaging-1.1.7.tar.gz
    2)运行命令安装:
    sudo python setup.py install
     
  2. ImageField causing error when rendering with "The Image" attribute has no file associated with it.

    解决:调用pic.url时要先判断pic不为空

有问题请留言或联系我,一定尽力解答,Good Luck!

评论 (2)        

Apache httpd服务下Django全局变量

2010-04-23 14:34:23 by sand, 758 visits, Tags: Python, Apache, Django,

最近开发中碰到的一个问题,关于django中的全局变量

在本地开发环境中django是可以用全局变量的,声明在类和方法外面,大家可以共用这个变量

但是部署到服务器上的apache就发现一个问题,apache是多进程模式运行的,每个请求在不同的进程,导致进程间数据不能共享,全局变量也就失去了意义

网上查了一些,但还没确定哪种方法最好,备忘一下,以后有时间专门研究下,或者谁有好方法请分享下,谢谢。

评论 (4)        

Django admin一对多及多对多内容过滤

2010-04-17 23:11:24 by sand, 788 visits, Tags: admin, Python, Django,

Django中admin是内置集成的管理后台,其中多对多及多对一关联有一个参数 limit_choices_to用来限制表单中的对应选项

目前可用的值只能是静态的例如:

limit_choices_to={'type':0}

代表限制只显示type=0的内容

假如碰到高级的过滤,例如我想只显示type和本对象type相等的,就没办法实现了,例如:

limit_choices_to={'type':self.type}是不可行的,因为这个代码是在类定义里,是没有self定义的
报错为:NameError: name 'self' is not defined

也许有人会想到用'self'.type,就类似自关联那种models.ForeignKey('self'),实际上这也是不行的
报错为:AttributeError: 'str' object has no attribute 'type',python把'self'当成普通字符串对象处理了

下面介绍一种可以达到你想要效果的办法,自定义表单:

代码大概的意思就是定义了Menu对象,并和自己关联,代表菜单可以有自己的上级菜单,但是在form里做了限制,在admin管理编辑页面中选择上级时将看不到自己,因为自己不能作为自己的上级
过滤目标对象id不等于当前对象id

class Menu(models.Model): title = models.CharField('title', max_length=50, unique=True)
    parentMenu = models.ForeignKey('self', verbose_name='parent menu',blank=True, null=True)

class MenuForm(forms.ModelForm): def __init__(self, *args, **kwargs):
        super(MenuForm, self).__init__(*args, **kwargs) if'instance'in kwargs:
            self.fields['parentMenu'].queryset = Menu.objects.exclude(id=kwargs['instance'].id)
class MenuAdmin(admin.ModelAdmin):
    model = Menu
     form=MenuForm
 

基本就是这样,描述的有点乱,不过真正碰到类似问题的人,应该可以看明白。

有问题请留言一定尽力解答。

 

评论 (2)        

Older Posts »