1、主键ID问题
对接freeradius时,需要用django ORM模型操作freeradius原生数据表,其中radusergroup表由于没有设置主键和ID列,导致使用ORM会报错
解决方法是采用ORM的原始sql查询。示例如下
# sql 命令,采用连接的方式,根据行号生成id;
# 参考链接:https://blog.csdn.net/HaHa_Sir/article/details/90770397
# select @rownum := @rownum+1 as id, username, gourpname from radusergroup,(select @rownum :=0)b;
# 条件查询示例
# select @rownum := @rownum+1 as id, username, gourpname from radusergroup,(select @rownum :=0)b where username="user";
from .models import Radusergroup
for p in Radusergroup.objects.raw("select @rownum := @rownum+1 as id, username, gourpname from radusergroup,(select @rownum :=0)b"):
print(p.username)
2、 子进程问题
django创建运行时创建了一个子进程,对接uwsgi后,uwsgi退出时并不会杀死django创建的子进程,需要在主程序退出,向子进程传递退出信号,使子进程不成为孤儿进程。
参考链接:
https://www.cnblogs.com/Tour/p/5180801.html
在主进程中创建子进程时,主进程与其创建的子进程隶属于同一个分组里,这个分组的概念在linux中成为进程组,它是一个或多个进程的组成的集合,同一个进程组中的进程,它们的进程组ID是一致的。利用python标准库中os.getpgid方法,通过进程的ID来获取进程对应的组ID,接着调用os.killpg方法,向进程的组ID发送信号,从而结束子进程。
def fun(x):
print 'current pid is %s, group id is %s' % (os.getpid(), os.getpgrp())
while True:
print 'args is %s ' % x
time.sleep(1)
def term(sig_num, addtion):
print 'current pid is %s, group id is %s' % (os.getpid(), os.getpgrp())
os.killpg(os.getpgid(os.getpid()), signal.SIGKILL)
if __name__ == '__main__':
signal.signal(signal.SIGTERM, term)
print 'current pid is %s' % os.getpid()
for i in range(3):
t = Process(target=fun, args=(str(i),))
t.daemon = True
t.start()
processes.append(t)
try:
for p in processes:
p.join()
except Exception as e:
print str(e)
3、python使用json序列化时注意事项
- Python dict中的非字符串key被转换成JSON字符串时都会被转换为小写字符串;
- Python中的tuple,在序列化时会被转换为array,但是反序列化时,array会被转化为list;
- 由以上两点可知,当Python对象中包含tuple数据或者包含dict,且dict中存在非字符串的key时,反序列化后得到的结果与原来的Python对象是不一致的;
- 对于Python内置的数据类型(如:str, unicode, int, float, bool, None, list, tuple, dict)json模块可以直接进行序列化/反序列化处理;对于自定义类的对象进行序列化和反序列化时,需要我们自己定义一个方法来完成定义object和dict之间进行转化。
4、 GenericIPAddressField
GenericIPAddressField是一个以字符串格式存储IPv4 或 IPv6 地址的字段(例如 192.0.2.30 或 2a02:42fe::4)。此字段的默认表单小部件是TextInput。IPv6 地址规范化遵循RFC 4291#section-2.2的第 2.2 节,包括使用该节第 3 段中建议的 IPv4 格式,例如::ffff:192.0.2.0
. 例如2001:0::0:01
将归一化为2001::1
和。所有字符都转换为小写。::ffff:0a0a:0a0a::ffff:10.10.10.10
用法:
field_name = models.GenericIPAddressField(**options)
GenericIPAddressField 接受以下参数
GenericIPAddressField.protocol
将有效输入限制为指定协议。接受的值为“ both ”(默认)、“ IPv4 ”或“ IPv6 ”。匹配不区分大小写。
GenericIPAddressField.unpack_ipv4
解包 IPv4 映射地址,例如::ffff:192.0.2.1。如果启用此选项,该地址将被解压缩到192.0.2.1。默认为禁用。只能在协议设置为“两者”时使用。