类别归档:django

Django is a high-level Python Web framework that encourages rapid development and clean, pragmatic design.

RSS feed of django

SAE Django配置共享型MySQL数据库路由

托管在SAE上的Django应用,如果使用共享型MySQL数据库服务,可以通过配置数据库路由,实现读写分离。利用SAE从库的价格优势,减少云豆开销。

SAE共享型MySQL数据库的计费策略:

新浪云SAE共享型数据库支持读写分离(Read/Write Splitting),即主数据库(Master)处理事务性增、改、删操作(INSERT、UPDATE、DELETE),而从数据库(Slave)处理SELECT查询操作。

并且从SAE共享型MySQL的使用价格上来看:

共享型MySQL(主库)
请求次数10000次    400云豆/百万次    4元/百万次
磁盘容量20MB    5云豆/GB/天    0.05元/GB/天

共享型MySQL(从库)
请求次数10000次    150云豆/百万次    1.5元/百万次

从库的每百万次请求价格仅为主库的37.5%,因此充分利用从库的价格优势,可以减少应用在数据库服务上的云豆开销。

不过需要注意的是:MySQL从库有时候会因为网络抖动或者用户SQL语句不够优化,导致从库数据同步会有些微延时(3-10秒)。如果用户有对数据实时性要求比较高的查询,建议在主库上进行操作。

参考SAE共享型MySQL说明文档:http://www.sinacloud.com/doc/sae/php/mysql.html

Django数据库路由配置:

参考Django多数据库配置文档:https://docs.djangoproject.com/en/1.8/topics/db/multi-db/

假设settings.py位于mysite目录下,在settings.py中添加如下配置:

if 'SERVER_SOFTWARE' in os.environ:
    from sae.const import (
        MYSQL_HOST, MYSQL_PORT, MYSQL_USER, MYSQL_PASS, MYSQL_DB, MYSQL_HOST_S
    )
else:
    # Make ...

继续阅读

SAE新浪微博Python SDK CERTIFICATE_VERIFY_FAILED解决方法

一个搭建在SAE上的Django应用,使用新浪微博提供的Python SDK已经稳定运行一年有余,但最近开始持续出现微博认证失败的状况。

摘录微博Python SDK的错误提示如下所示:

ERROR:django.request:Internal Server Error: /weibo/auth/
Traceback (most recent call last):
  File "/usr/local/sae/python/3rd/django-1.5/django/core/handlers/base.py", line 115, in get_response
    response = callback(request, *callback_args, **callback_kwargs)
  File "/data1/www/htdocs/838/app/1/mysite/views.py", line 42, in auth
    res = weibo_util.keep_user(code,api,redirect_uri)
  File "/data1/www/htdocs/838/app/1/util/weibo_util.py", line 86, in keep_user
    r ...

继续阅读

Django关联模型排序返回重复元素解决方法

在Django ORM中,使用order_by()方法对包含关联关系的模型进行排序时,返回结果中可能会出现重复元素。

假设有下面的两个模型Client和Interaction,Client为顾客,Interaction为交互。

Client类中包含顾客的姓名和联系方式,Interaction类中包含标题、时间、待办事项、截止日期。

class Client(models.Model):
    name = models.CharField(max_length=255, unique=True)
    contact = models.CharField(max_length=255, null=True, blank=True)

class Interaction(models.Model):
    client = models.ForeignKey(Client)
    title = models.TextField()
    when = models.DateTimeField()
    todo = models.TextField(null=True, blank=True)
    deadline = models.DateTimeField(null=True, blank=True)

现在想要查询按照交互的截止日期倒序排列的客户列表。

'clients' : Client.objects.all().order_by('-interaction__deadline'),

返回结果中包含重复元素。由于Client和Interaction为一对多的关系,因此对于每一个Interaction都返回了一个Client元素,而非仅仅是对结果进行排序。大家提到需要使用distinct(),但是distinct()对于这个特例并不适用,因为考虑到它们彼此之间存在的关联关系,结果返回值已经唯一的了。

通过Google,我发现了解决方法!相关博文链接:http://archlinux.me/dusty/2010/12/07/django-dont-use-distinct-and-order_by-across-relations/ ...

继续阅读

Django 302重定向实现动态图片显示

有时Django开发者可能会遇到这样的需求:用户访问同一个URL,根据具体的业务需求返回不同的图片。

例如:用户访问URL /user/avatar/时,根据Session中的用户ID返回该用户的头像。

一般来说,要实现此功能可以采用下列2种方法:

  1. 使用Python图片处理模块PIL/pillow动态生成图片后直接响应返回给浏览器
  2. 使用HTTP 302,临时重定向至指定的图片URL返回给浏览器

需要注意的是,虽然HTTP 301与HTTP 302都可以实现请求的重定向,但HTTP 301为Moved Permanently,意为永久转移,该响应会被Google Chrome和Firefox等浏览器所缓存,因此不适于实现图片的动态重定向。

因而在此只能选择HTTP 302 Found 告知浏览器该响应为临时重定向,避免浏览器对重定向的结果进行缓存。

下面的代码片段实现了从3张图片中通过HTTP 302重定向随机返回一张给浏览器的功能。

import random
from django.shortcuts import redirect
def dynamic_pic(request):
    url_list = ["http://bfsu.sinaapp.com/wp-content/themes/bfsu/i/homepix/home5.jpg", "http://bfsu.sinaapp.com/wp-content/themes/bfsu/i/homepix/home2.jpg", "http://http://bfsu.sinaapp.com/wp-content/themes/bfsu/i/homepix/home3.jpg"]
    return redirect(random.choice(url_list))

 

SAE Django如何syncdb到线上数据库

使用SAE部署Django应用时,如何将应用的数据库同步至线上?

在本地开发环境中,如下配置数据库,即可执行 python manage.py syncdb 直接syncdb到线上数据库。

# 线上数据库的配置
MYSQL_HOST = 'w.rdc.sae.sina.com.cn'
MYSQL_PORT = '3307'
MYSQL_USER = 'ACCESSKEY'
MYSQL_PASS = 'SECRETKEY'
MYSQL_DB   = 'app_APP_NAME'

from sae._restful_mysql import monkey
monkey.patch()

DATABASES = {
    'default': {
        'ENGINE':   'django.db.backends.mysql',
        'NAME':     MYSQL_DB,
        'USER':     MYSQL_USER,
        'PASSWORD': ...

继续阅读