细节不再描述,教程网上多的是,列几个坑:

1、1.9后,zh-cn, zh-tw被弃用,改为zh-hans(简体),zh-hant(繁体).

2、在locale文件夹里,中线要换成下划线,zh_hans,zh_hant,也就是讲,在用makemessages命令时,应该是这样的:

python manage.py makemessages -l zh_hans

python manage.py makemessages -l zh_hant

说多了都是泪。。。

3、每次执行python manage.py compilemessages命令时,要重启web server,尤其是生产环境,若像我一样用gunicorn,要重新执行一下gunicorn命令。

4、补充:第2点在Mac上是没问题的,但在CentOS 7上,要改成zh_Hans和zh_Hant,不能全小写。

5、Javascript内翻译请参考:

使用一句类似

results = MoorolProduct.objects.extra(select={'day': 'date(update_time)'}).values('day').annotate( records=Count('update_time')).filter(update_time__gte=begin)

的语句来统计数据,结果发现数据不对,查Sql语句,把Created_Time也Group By进去了,因为MoorolProduct这个Model默认通过Created_Time排序的。

results = MoorolProduct.objects.extra(select={'day': 'date(update_time)'}).values('day').annotate( records=Count('update_time')).filter(update_time__gte=begin).order_by()

加一个没有参数的order_by(),搞定之。

Django的发邮件程序在本机和以前买的境内阿里云ECS都可以以简单的配置,通过端口25发送邮件。因为本身用程序也不是发什么垃圾和绝密邮件,所以也不太在意,哪想新买的一个ECS死活发不出去。

1、先检查是不是因为是境外服务器的原因,换linode,在linode上没问题,排除之。

2、继续检查是不是邮件服务商拒绝来自境外服务器的请求,把coremail换到qq邮件(QQ邮件在这个博客上可以),还是发不了,排除之。

3、最后查半天发现是ECS把端口25封掉了。。。一个下午过去了,千万头草泥马从心头跑过。

4、既然找到问题所在,就换465端口吧,发现CentOS7不是用iptables来管理端口,是一个叫什么鬼firewalld的东西,折腾一会儿,启用了465端口,结果,还是不行,按https://bbs.aliyun.com/read/302371.html?spm=5176.bbsr302357.0.0.L8JNPj 的做法测试了下,卧槽,可以了,注:文章没说明,用CentOS的话,若报『Missing "nss-config-dir" variable. 』错误,要在/etc/mail.rc里增加另外一个配置set nss-config-dir=/etc/pki/nssdb

5、悲催的是,用Django的send_mail还是不行,但确定了肯定是Django这边的问题,跟端口没关系了,因为第4步的方法可以发送成功,重读文档:https://docs.djangoproject.com/en/1.11/topics/email/ 原来还要配置EMAIL_SSL_KEYFILE和EMAIL_SSL_CERTFILE,另外提醒一下,若是EMAIL_USE_TLS=True,一般默认端口不一定是465,要看你的邮件服务商的设置,比如我的是587,所以我们这里把EMAIL_USE_SSL配置成True

Google又时断时续,一直找不到怎么配置EMAIL_SSL_KEYFILE和EMAIL_SSL_CERTFILE,F**K GFW和方校长10的10次方遍.后来想了想,从字面意思上来看,应该就是openssl的pem证书,

openssl genrsa -out ca.key

openssl req -new -key …

新买了一个阿里云服务器,一不小心选了新加坡机房,不能换,坑爹。

默认CentOS7,yum安装完mysql后一直连接不了,原来是出了一个分支mariadb

传送门:http://stackoverflow.com/questions/31067135/in-centos7-can-not-start-mysql

没空翻译,先放在这。

http://www.michelepasin.org/blog/2010/07/20/the-power-of-djangos-q-objects/

早年间做管理系统和ERP,因为厌烦甲方不停的需求变动,反正界面多数也无外乎是新增改查,于是常常有这样的表结构设计:

表一、定义字段

field_id field_name 1 name 2 code 3 company

表二、字段值

field_id field_value 1 张三 1 李四 2 ZHS 3 木楼科技

当时在不考虑性能、并发数以及界面多样性的时候,这种方式解决了不少问题,我经历过的两个公司都以这种方式来设计表结构,每次我碰到有看不明白的同事,就告诉他们『你就当是把数据表逆时针旋转90度来看』,但后来情况发生了一些变化,06、07年起从B/S管理系统转入互联网开发,数据表的字段往往不发生大的改变但是程序经常改变,有时候是界面,有时候是新的业务逻辑,有时候甚至是终端。。。比如后面的PC互联网转到移动互联网。

重构www.luckylight.cn的时候,又发现了这种表结构设计。。。也难怪,这是7、8年前的网站。

这里面是不是隐藏着这么两种不同的架构哲学?

1、程序不变,表结构经常变(ERP购买或外包给开发团队开发完之后,要改软件程序相对要麻烦)。

这几年关注重心在移动互联网和智能硬件上,一直没时间来关注前端,转回头来看好像万紫千红的样子,正好要重新开发集团官网luckylight.cn和重构公司网站moorol.com,于是打算把前端整理一下。

以前一直用jquery,并且引入js脚本都是用古老的script标签方式,js文件多了确实相当的乱。

对比了requirejs和sea.js,最后决定使用requirejs,主要原因是文档比后者全,并且在英文世界里可以找到很多资料,这里简单说一下思路,并不提具体实现。

原来旧的js文件组织方式大约如下:

static css img js a.js plugins plug.js

用了requirejs之后,只有一个script标签导入,html页面看起来是干净了很多,但是这样还不够,事实上浏览器还是通过requirejs一个http请求也不少,要解决这个问题,就要打包了,网上讲了很多怎么打包,怎么编码。但是很少有讲在django里应该怎么样组织目录结构,经过考虑,我使用了如下简单结构,src放开发代码,dist里放r.js打包之后的文件:

static src dist

打包在dist目录里,生产环境上只有dist目录,在settings.py里修改静态文件配置方便开发:

if DEBUG: STATIC_URL = '/static/src/' STATICFILES_DIRS = ( os.path.join(BASE_DIR, 'static/src'), ) …

执行如下命令即可:

cd /usr/local/lib rm libcurl.so.4 ln -s /usr/lib64/libcurl.so.4.1.1 libcurl.so.4 ldd /usr/lib64/python2.6/site-packages/pycurl.so

参考:http://kb.sau.net.au/article/fatal-python-error-pycurl-libcurl-link-time-version-is-older-than-compile-time-version-325.html

用django-rest-framework-jwt来验证微信调用,情况很复杂,先过api应用,再从api服务器调用数据中心rest api,不细说。

取得token之后验证一直报:{“detail”:”Error decoding signature.”}

原来是看范例上

curl -H "Authorization: JWT <your_token>" http://localhost:8000/protected-url/ 没去掉尖括号一直,一直报如上错误,去掉之后就好了。。。这好比当年写文档千强调万强调『去掉中括号』,结果老都老了还犯错。

为了用Facebook能登录公司网站,安装python-social-auth,但在生产环境上migrate时报如下错:

 

django.db.utils.OperationalError: (1071, 'Specified key was too long; max key length is 1000 bytes')

试了python-social-auth内的设置:

 

SOCIAL_AUTH_UID_LENGTH = 222 SOCIAL_AUTH_NONCE_SERVER_URL_LENGTH = 200 SOCIAL_AUTH_ASSOCIATION_SERVER_URL_LENGTH = 135 SOCIAL_AUTH_ASSOCIATION_HANDLE_LENGTH = …

在服务器上安装scrapy,几年不玩这个框架,报ImportError: No module named _sqlite3,按网上重装来重装去的方法,未果。

另外有些资料甚至要重新源码编译python,想想太麻烦,又没做python虚拟环境。

有位仁兄提出一个暴力方法,可能不太优雅,但简单搞定之,

查找_sqlite3.so文件:

[root@localhost ~]# find / -name _sqlite3.so /usr/lib/python2.6/lib-dynload/_sqlite3.so

查找python位置:

[root@localhost ~]# whereis python python: /usr/bin/python /usr/bin/python2.6 /usr/bin/python2.6-config /usr/lib/python2.6 /usr/local/bin/python /usr/local/bin/python2.7 …

哥铎新书要出版,帮他建一个独立博客(www.gaoduo.name),用我自己用Django写的,他觉得不习惯,没办法,给他弄了个WordPress,今天一早发来抠抠说发布不了文章云云。

果不其然,编辑器用不了。

先更新最新版本,不行。

后试了中文互联网上的那个修改wp-config.php最后一行的方法,也不行。

用Chrome的代码审查发现/wp-admin/post-new.php页面一直报 ERR_INCOMPLETE_CHUNKED_ENCODING,再查看nginx 日志如下:

 

open() "/var/lib/nginx/tmp/fastcgi/3/00/0000000003" failed (13: Permission denied) while reading upstream

 

跑到nginx配置去一看,以前建了一个用户给某小兄弟玩微信API,他早就不用了,改回user = nobody,搞定。

1、在urls.py里,不要直接用字符串来描述方法、要用引用来配置(越来越向OOP看齐?),比如,再这么配置的话,

url(r'^$', 'portal.views.index', {'template_name': 'index.html'}, name='index'),

会得到一个警告:

RemovedInDjango110Warning: Support for string view arguments to url() is deprecated and will be removed in Django 1.10 (got portal.views.index). Pass the callable …

从写C#的年代开始,我经常在面试程序员的时候问这个一个简单得不能再简单的问题:Java(or C#)中,接口是干什么用的?

很可惜的是,非常多简历上写着“精通java开发”的童鞋们都答不上来。最近改一个Android程序,在Activity和View之间用全局Handler把消息传来传去,颇有古时候用go to语句搞noodle program的架势。

无奈重构,用Listener回调来传递消息,上代码,先定义Listener,然后在自定义View里插入回调,Activity里重写回调方法:

MyViewListener

package com.net.laonan.plum.views; /** * Created by Alan on 15/12/16. */ public interface MyViewListener { void onLaonanShow(boolean naked); }

MyView

package …

利用百度地图sdk开发Android app时,要先得到一AK码配置进去,如果你的sha1正确,但死活一直有一个错误如下:

baidumapsdk: Authentication Error errorcode: 230 uid: -1 appid -1 msg: APP Scode码校验失败

极有可能配置时你的包名出问题了,检查以下各个位置,看包名是否一致: 1、manifests。 2、build.gradle。 我就是第2个文件里跟包的名字不一样,死活不出地图的。

?OS X升级到El Capitan之后,MySQLdb不能用了,一直报:unsafe use of relative rpath libmysqlclient.18.dylib in /Users/XXX/.python-eggs/MySQL_python-1.2.3-py2.7-macosx-10.7-intel.egg-tmp/_mysql.so with restricted binary

TNND个凶,查半天stackoverflow没搞定,后来在一台湾博客上找到解决方法,原来是EI Capitan增加了个什么鬼System Integrity Protection,关闭即可。

Step 1. 重启电脑,按Command+R进入Recovery Mode,打开终端,输入csrutil disable。

Step 2. 再重启,Done.

若要打开SIP,重复上述步骤,但csrutil …

利用wc工具,以Android代码为例,到工程目录输入如下命令,回车:

wc -l `find . -name '*.java' -or -name '*.xml'`

申请软件著作权时用得着。。。

使用datetime直接构造时间的时候,设置时区是没有北京时间的,一般来说习惯了linux的同志都会默认用上海时间来代替,这里却有一个问题,如果要进行时区转换,上海时间比北京时间差6分钟。。。

比如:

tz = pytz.timezone('Asia/Shanghai') t = datetime.datetime(2015, 9, 5, 9, 0, 0, 0, tzinfo=tz)

这样打印出来得到的时间是: 2015-09-07 09:00:00+08:06

在django框架中,貌似from django.utils.timezone import localtime的这个localtime会修正那6分钟,这问题就来了,要自己在程序里构造时间,并且跟用这个localtime转化的时间对比的时候巨麻烦。

解决方法:

tz = pytz.timezone('Asia/Shanghai') t …
/media/upic/2015/07/15/django-rest-framework-logo.png

舍不得Django的Admin界面,最近用Django Rest framework(官网)重构公司之前用Flask写的REST API服务端。

然后打算用JWT做认证,找到一个简洁的框架Django Rest framework JWT(官网),按文档配置完成,执行:

$ curl -X POST -d "username=admin&password=abc123" http://localhost:8000/api-token-auth/

时,一直报

Authentication credentials were not provided.

重做权限配置之类这的那的折腾了两天,最后发现Django Rest framework默认的登录界面消失,检查urls.py发现url(r'^', xf_views.api_root),少了一个截至符$,加上,改为url(r'^$', …

/media/upic/2015/07/04/linux_logo.png

关于uwsgi:

#查看uwsgi进程

ps -ef|grep uwsgi|grep -v grep

#停止uwsgi

killall -9 uwsgi

或通过查看的那条命令找到PID,如果是2222,

kill -9 2222

#uwsgi 启动

uwsgi -x /websitedir/laonan.net/heather/uwsgi.xml --daemonize /var/log/uwsgi.log

scp下载文件

scp root@192.168.120.204:/opt/soft/nginx-0.5.38.tar.gz /opt/soft/

scp上传文件

scp /opt/soft/nginx-0.5.38.tar.gz …