以下内容为原创,转载请注明出处!
在项目中用到了多说评论系统,由于之前没有用到过,只有自己摸索了。项目网站是有自己的一套用户系统的,而我们要做的就是和多说网站用户系统建立关联:
它依赖jwt第三方库,安装:pip install pyjwt(刚开始傻不啦叽的装jwt,后来发现错了!请注意是PyJWT)
一:首先注册多说并且配置好项目(此处默认配置好了):
在【工具】-->>【获取代码】中可以拿到通用代码,放在html里面即可显示如下效果:
<div class="ds-thread" data-thread-key="{{product_info.id}}" data-title="{{product_info.name}}" data-url="/authzn/content/{{product_info.id}}.html"></div>
<!-- 多说评论框 end -->
<!-- 多说公共JS代码 start (一个网页只需插入一次) -->
<script type="text/javascript">
url = window.location.href
var duoshuoQuery = {
short_name:"****",//此处为配置的二级域名,不需要修改
sso: {
login: url,//替换为你自己的回调地址
logout: "http://180.186.38.154:9003/authzn/logout/"//替换为你自己的回调地址
}
};
(function() {
var ds = document.createElement('script');
ds.type = 'text/javascript';ds.async = true;
ds.src = 'http://static.duoshuo.com/embed.js';
ds.charset = 'UTF-8';
(document.getElementsByTagName('head')[0]
|| document.getElementsByTagName('body')[0]).appendChild(ds);
})();
</script>
<!-- 多说公共JS代码 end -->
</div>
此处ds.src有个坑,我发现用通用代码配置这个src的话就加载不了这个js,然后导致拿不到code,所以我直接写成上述这样
二:使用多说第三方登入时我们需要同时登入自己的网站,也就是说第三方登入的时候同时用该信息注册本网站并且登入:
将https://github.com/duoshuo/duoshuo-python-sdk 此代码下载,将duoshuo文件夹放在自己的项目中,
1:第三方登入的时候我们会获取到一个参数code,将code以POST的方式提交到多说API,交换token。
2:得到返回值:{u'access_token': u*****************************', u'user_id': u'***************', u'remind_in': 7775966, u'code': 0, u'expires_in': 7776000},我们就是靠user_id来建立连接。将信息保存到我们的数据库中,注:保存user_id是一定要用BigIntegerField类型
3:代码如下
models.py:
from django.contrib.auth.models import User
class UserZn(User):
phone = models.CharField(max_length = 20, verbose_name = u'手机号码', null = True, blank = True)
auth_pwd = models.CharField(max_length = 16, verbose_name=u"用户密码", null = True, blank = True)
duoshuoid = models.BigIntegerField(verbose_name=u'多说id', null=True, blank=True)
access_token = models.CharField(max_length = 128, verbose_name = u'多说token', null=True, blank=True)
views.py:
# 多说:将code以POST的方式提交到多说API,交换token.
duoshuo_code = request.GET.get('code','')
if duoshuo_code:
api = DuoshuoAPI(short_name='******', secret='******')
response = api.get_token(code=duoshuo_code)
# 判断是否存在相同user_id,存在直接登入
if UserZn.objects.filter(duoshuoid = response['user_id']).count() > 0:
userzn = UserZn.objects.get(duoshuoid=int(response['user_id']))
user = authenticate(username=userzn.username, password=userzn.auth_pwd)
user_login(request, user)
elif response.has_key('user_key'): #此多说账号在本站已经注册过了,直接登录
user = User.objects.get(pk=int(response['user_key']))
user_login(request, user)
else: #此多说账号在本站未注册,添加一个用户
response = api.users.profile(user_id=response['user_id'])['response']
username = response['name']
tmp_password = ''.join([random.choice('abcdefg&#%^*f') for i in range(8)]) #随机长度8字符做密码
new_user = UserZn.objects.create_user(username=username, email='user@example.com', password=tmp_password) #默认密码和邮箱,之后让用户修改
# new_user = UserZn.objects.get(user=new_user)
new_user.duoshuoid = response['user_id'] #把返回的多说ID存到profile
new_user.auth_pwd = tmp_password
new_user.save()
user = authenticate(username=username, password=tmp_password)
user_login(request, user)三:当自己网站有一套自己的用户系统的时候,我们希望也能在多说上面评论,此时需要用到jwt方式处理了:
一个已经有用户系统的网站使用多说评论框,可以通过cookie,告知多说用户在站点中的身份,让站点用户可以直接评论。对于之前已经登录过的多说用户,如果两个身份没有产生关联关系,也会优先显示站点中的身份。
1:将当前站点用户信息以JWT( JSON Web Token ) 的方式处理,生成token,把token设置成的cookies,评论框加载时会从cookies中获取token,得到当前站点用户信息。及把本站用户导入多说,注册的同时注册多说,请看代码:
api = DuoshuoAPI(short_name='***********', secret=‘*********’)
response = api.users.imports(data={
'users[0][user_key]' : user.id,
'users[0][name]': user.username,
})['response']
user.duoshuoid = int(response[str(user.id)])
user.save()通过实例化多说,然后api.users.imports即可得到返回信息,['response']里面的user_id:该用户在多说里面对应的duoshuo_id。保存在本地数据库。
2:设置cookie来获取当前用户信息,请看代码:
from django.template.response import TemplateResponse
response = ''
ctx = {}
duoshuo_jwt_token = None
if (request.user.id):
token = {
'short_name': '******',
'user_key': request.user.id,
'name': request.user.username,
}
ctx['profile'] = UserZn.objects.get(pk=request.user.id)
ctx['duoshuo_jwt_token'] = duoshuo_jwt_token = jwt.encode(token, DUOSHUO_SECRET)
ctx['product_info'] = Product.objects.get(pk = id)
response = TemplateResponse(request, 'content.html', ctx)
response.set_cookie('duoshuo_token', duoshuo_jwt_token)
return response效果如下:
四:当自己网站和移动端评论结合的时候,就需要吧移动端的评论同步到多说上去:
post_url = 'http://api.duoshuo.com/posts/import.json'
posts=[{}]
data = {
'short_name':settings.DUOSHUO_SHORT_NAME,
'secret':settings.DUOSHUO_SECRET,
'posts[0][post_key]':'124',
'posts[0][thread_key]':'subject_4',
'posts[0][message]':'测试负极评论',
'posts[0][parent_key]':'123'
}
info = requests.post(post_url, data = data)
print info.json(),22222222222222返回效果如下: