django

awesome系列

https://github.com/rosarior/awesome-django

引入静态文件

django 1.6项目新建后static配置不需要更改

文档arrow-up-right

url.py

from django.conf.urls import patterns, include, url
from django.conf import settings
from django.conf.urls.static import static

from django.contrib import admin
admin.autodiscover()

urlpatterns = patterns('',
    # Examples:
    # url(r'^$', 'tech_dict.views.home', name='home'),
    # url(r'^blog/', include('blog.urls')),

    url(r'^admin/', include(admin.site.urls)),
    url(r'^o/', include('oauth2_provider.urls', namespace='oauth2_provider')),
) + static(settings.STATIC_URL, document_root=settings.STATIC_ROOT)

south

curl测试api

django加速单元测试

django rest

QuerySet

Q和F

判断某字段是否为null

QuerySet !=

QuerySet 判断一个model两个字段是否相等

django group_by

django group by取最后一条

django admin使用自己的用户系统

两部即可

  1. 首先实现自己的User class, 继承AbstractBaseUser, 和BaseUserManager

  2. settings中添加 AUTH_USER_MODEL = 'myauth.User'

ps: 可以关注下这个项目 https://github.com/yueyoum/django-siteuser

发送邮件

django celery

简单blogarrow-up-right

安装依赖

ubuntu下直接用包管理器安装 erlang rabbitmq-server

rabbitmq 配置

django celery使用

  1. python manage.py celeryd # 启动celeryd服务

  2. python manage.py celerybeat # 查看心跳

django celery配置(settings文件下方)

具体的模块tasks编写

例如有个模块为paper_edu,新建tasks.py

用django admin管理tasks

在django admin会有Djcelery模块 从上倒下有Crontabs、Intervals、Periodic tasks、Tasks、Workers

首先讲Workers, 点进去会看到有几个worker

只有celeryd && celerybeat都启动了而且还活着的时候才会显示online

Crontabs|Intervals

执行周期 Crontabs 就是类似linux中Crontab的配置方式 Intervals 比较人性化,每多少小时,天等等

Periodic tasks就是日常新建任务,由django管理的一个任务列表

点击右上角的新建,进入新建任务的表单

最后的建议

由于celery启用的守护进程比较多,建议使用supervisor来管理 supervisor的使用方式可以见 python_tools.issue.md中查看

简单的将log重定向到某文件

django i18n

django会从文件中提出_()这种需要翻译的东西丢到po文件中,然后翻译后可以讲po编译为mo. 以中文为例

需要手动在项目根目录下建立locale文件夹

建立po文件,注意源码中一定要有from django.utils.translation import ugettext as _的需要翻译的东西,否则会报错

当没有任何po时 ./manage.py makemessages -l zh_CN,建立中文po

更新已有po ./manage.py makemessages -a

根据翻译后的po生成./manage.py compilemessages

Beautiful Code in Django

  • Fat Models, Utility Modules, Thin Views, Stupid Templates

  • 变量balance_sheet_decrease 而不是bsd或者bal_s_d

  • import 按照 1.标准库 2.django库 3.三方库 4.本地app模块的顺序导入

class里面method怎么打装饰器

一个正常的装饰器是需要用method_decorator才能打在class上的 from django.utils.decorators import method_decorator

django单测让request过middleware

django1.8的bug

django 1.8.8有个严重的bug 当你第一次migrate的时候,由于没有user表其他有user外键的表先跑会抛异常

需要先跑auth的migrate

python manage.py migrate auth python manage.py migrate

更新上面说的话,其实并不是,需要全部先makemigration一次就好了

继承抽象类后修改某个字段

south migrate的默认值问题

当你添加一列并且设置default的时候,如果多台机器上线会出问题,因为django 处理default是用python的方式做的,而不是数据表上有这个default

例如, 下面是south migration一个脚本的一行,他是添加了floor_number并且设置默认值为0

执行后发现mysql的列里面floor_number并没有默认值,多台机器上线时未上线机器用到这张表存记录的 时候会报错。

解决方案 keep_default=True,会给数据库设置默认值

django date字段 跟python字段相减

TypeError: can't subtract offset-naive and offset-aware datetimes

django 请求多个同名 key 的问题

QueryDict 由于是用 MultiValueDict 实现的,当同名 param 传递多次时,使用 getlist 可以取出来

手写 django migration

文档arrow-up-right

demoarrow-up-right

django orm使用 in 的顺序排序 order by with in

https://chriskief.com/2015/01/13/sort-django-query-order-by-using-values-within-in/

上面的方法在单测时可能比较麻烦,提供内存排序的方法

def get_result_in_query_order(query_set, query_ids, query_key='id'): mapper = {getattr(each, query_key):each for each in query_set} result = [] for _id in query_ids: if _id in mapper: result.append(mapper[_id]) return result

单表支持emoji

utf8mb4

https://exana.io/community/a-helping-hand/2016/08/23/django-utf8mb4-selected-columns.html

django shell python tab出现一些奇怪的log

Last updated