python3Django项目——微博第三方登录

适合于python3的微博第三方登录的相关代码:

sina.py

import json
import urllib
import re

class OAuth_Base(object):    #基类,将相同的方法写入到此类中
    def __init__(self,client_id,client_key,redirect_url):   #初始化,载入对应的应用id、秘钥和回调地址
        self.client_id = client_id
        self.client_key = client_key
        self.redirect_url = redirect_url

    def _get(self,url,data):      #get方法
        request_url = '%s?%s' % (url,urllib.parse.urlencode(data))
        response = urllib.request.urlopen(request_url)
        return response.read()

    def _post(self,url,data):    #post方法
        request = urllib.request.Request(url,data = urllib.parse.urlencode(data).encode(encoding='UTF8'))     #1
        response = urllib.request.urlopen(request)
        return response.read()


#微博类
class OAuth_WEIBO(OAuth_Base):
    def get_auth_url(self):
        params = {
            'client_id':self.client_id,
            # 'response_type':'code',
            'redirect_uri':self.redirect_url,
            # 'scope':'email',
            # 'state':1
        }
        url = 'https://api.weibo.com/oauth2/authorize?%s&state=/' % urllib.parse.urlencode(params)
        return url

    def get_access_token(self,code):
        params = {
            'grant_type':'authorization_code',
            'client_id':self.client_id,
            'client_secret':self.client_key,
            'code':code,
            'redirect_uri':self.redirect_url
        }
        response = self._post('https://api.weibo.com/oauth2/access_token',params)
        result = json.loads(response.decode('utf-8'))
        self.access_token = result["access_token"]
        # self.openid = result["uid"]
        return self.access_token

views.py

class OauthSinaloginView(APIView):
    """
        构建微博登录跳转链接
    """

    def get(self, request):
        # 1、创建微博对象
        sina = OAuth_WEIBO(client_id=settings.WEIBO_APP_ID, client_key=settings.WEIBO_KEY,
                     redirect_url=settings.WEIBO_CALLBACK_URL, )

        # 4、构建跳转连接
        login_url = sina.get_auth_url()

        # 5、返回跳转连接
        return Response({'login_url': login_url})


class OauthSinaView(APIView):
    def get(self, request):
        # 1、获取code值
        code = request.query_params.get('code', None)

        # 2、判断code是否传递过来
        if not code:
            return Response({'errors': '缺少code值'}, status=400)

        # 3、通过code值获取access_token值
        # 创建sina对象
        sina = OAuth_WEIBO(client_id=settings.WEIBO_APP_ID, client_key=settings.WEIBO_KEY,
                           redirect_url=settings.WEIBO_CALLBACK_URL, )

        access_token = sina.get_access_token(code)
        # return Response({'access_token':access_token})

        # 4、将access_token赋值给wb_openid
        wb_openid = access_token
        # 5、判断access_token是否绑定过用户
        try:
            sina_user = OAuthQQUser.objects.get(wb_openid=wb_openid)
        except:
            # 6、未绑定,进入到绑定页面完成绑定

            tjs = TJS(settings.SECRET_KEY, 300)

            wb_openid = tjs.dumps({'wb_openid': wb_openid}).decode()

            return Response({'access_token': wb_openid})

        else:
            # 7、绑定过,则登录成功
            # 生成JWT-token值
            user = sina_user.user
            jwt_payload_handler = api_settings.JWT_PAYLOAD_HANDLER
            jwt_encode_handler = api_settings.JWT_ENCODE_HANDLER

            payload = jwt_payload_handler(user)  # 生成载荷部分
            token = jwt_encode_handler(payload)  # 生成token

            response=Response(
                {
                    'token': token,
                    'username': user.username,
                    'user_id': user.id
                }
            )

            return response

    # def post(self,request):
    #
    #     # 绑定保存
    #     OAuthQQUser.objects.create(user=user,wb_openid=wb_openid)

    def post(self, request):
        # 1、获取前端数据
        data = request.data

        # 2、验证数据
        ser = OauthSinaSerializers(data=data)
        ser.is_valid()
        print(ser.errors)
        # 3、绑定保存数据
        ser.save()
        # 4、返回结果
        return Response(ser.data)

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值