当前位置

博客

Django REST framework serializer 跟 model 无关的只写(write_only) field 的处理

有时候想在 DRF 的 api 里塞一些跟 model 无关的,但又是必须要处理的数据,比如设密码时,为了保证输入无误第二次输入的 password,这种信息一般设为只写。
这个时候 serializers.py 里,把 validate 方法重载一下,在里面删掉 request.data 里实际上 model 不需要的数据就 ok 了。

  1. class AccountListSerializer(serializers.HyperlinkedModelSerializer):
  2.     password = serializers.CharField(write_only=True, style={'input_type': 'password'})
  3.     confirm_password = serializers.CharField(write_only=True, style={'input_type': 'password'})
  4.     def validate(self, data):
  5.         del data['confirm_password']
  6.         return data
  7.     class Meta:
  8.         model = Account
  9.         fields = ('password', 'confirm_password')

当然,在 views.py 里,需要校验一下 password 和 confirm_password 是否输入了,如果输入了,是否一致

  1. if not request.data.get('password') or not request.data.get('confirm_password'):
  2.     raise serializers.ValidationError("Please input password and confirm it!")
  3. if request.data.get('password') != request.data.get('confirm_password'):
  4.     raise serializers.ValidationError("Passwords do NOT match!")
Topic: 

Django REST framework serializer 跟 model 无关的只读(read_only)field 的处理

有时候想在 DRF 的 api 里塞一些跟 model 无关的信息,比如一些提示的信息,这种信息本身跟业务没有关系,设为只读。
这个时候 serializers.py 里:

  1. class FooSerializer(serializers.HyperlinkedModelSerializer):
  2.     foo = serializers.CharField(read_only=True)
  3.     tips = serializers.CharField(source='get_tips', read_only=True)
  4.     class Meta:
  5.         model = Foo
  6.         fields = ('foo', 'tips')

这个时候 models.py 里:

  1. class Foo(models.Model):
  2.     foo_id = models.AutoField(primary_key=True)
  3.     foo = models.CharField(max_length=128)
  4.     def get_tips(self):
  5.         return 'Please foo bar.’
  6.     class Meta:
  7.         db_table = 'foo'
Topic: 

dup2.com 上线邮件组功能

邮件组的可投递级别分为 4 个级别:
0 - 无限制(任何人都能往邮件组发信)
1 - 同一域名内的 email 地址和白名单中的 email 地址可以往邮件组发信
2 - 邮件组内 email 地址和白名单中的 email 地址可以往邮件组发信
3 - 仅白名单中的 email 地址可以往邮件组发信

Topic: 

obfuscated-openssh

ssh 对传输内容做了很好的加密;但是很容易被深度检测判断出通信正在走 ssh 协议;
有些公司或组织会阻碍对外的 ssh 连接,即使换了 22 端口,也可能会被深度检测判断出来阻断

总之最后有人给 openssh 增加了一层混淆的保护,以绕过深度检测的判断,这就是 obfuscated-openssh
Win32 客户端层面,Bitvise 也支持该协议;Putty 则有人搞了一个 Potty 的分支

最新的 OpenSSH patch 被收集在 https://github.com/zinglau/obfuscated-openssh-patches
维护者的说明在 https://zinglau.com/projects/ObfuscatedOpenSSHPatches.html
他也维护了一个 Ubuntu ppa 的源 https://launchpad.net/~zinglau/+archive/ubuntu/obfuscated-openssh

我注意到这个项目是因为最近自用的 ssh 也有些不正常,于是找到了这个方案;而且顺手把 7.0_7.1 的 patch 移植到了 7.2 上,不晓得 pull-request 是否会被接受

Update: 俺的补丁已经被作者合并,7.2 的握手协议部分比之前还有点点变化,稍微思考了一下才得到一个比较完美的patch

Topic: 

IMAP 服务器对 XAPPLEPUSHSERVICE 扩展的支持

翻去年邮件的时候,无意中看到 XAPPLEPUSHSERVICE 这个关键词,搜索一下加深知识记忆:

2011 年的时候 Apple OS X Server 的 dovecot 修改部分就开源了
http://www.opensource.apple.com/source/dovecot/dovecot-239.8/dovecot/src...

2012 年 dovecot 就讨论是否增加支持,但显然除了 IMAP 之外,还得有一个 APSd 的东东
http://www.dovecot.org/list/dovecot/2012-August/067682.html

...到了2014年,还在讨论
http://dovecot.org/pipermail/dovecot/2014-April/095653.html

但也就是在 2014 年,出现了两个项目让 dovecot 可以支持 Apple Push 了
https://github.com/st3fan/dovecot-xaps-plugin
https://github.com/st3fan/dovecot-xaps-daemon

2015 年,cyrus imapd 支持了这个扩展
https://git.cyrus.foundation/rIa4470bf0f79de49030b3d66d2b385a1345c1a040

订阅 RSS - 博客