1.微博开发平台
- 注册微博开放平台账号,并进行实名认证。
- 创建应用(application)
- 控制台 - 应用基本信息:App key、App secret
- 控制台 - 应用高级信息:授权回调地址(不能使用127.0.0.1,换成localhost)
- 查看API文档
- 获取授权码code的API文档
- 获取授权令牌access_token的API文档
api文档对于开发十分重要,好好利用api文档可以更好地完成代码逻辑。
2.项目代码逻辑
- 授权登录页:用户输入微博账号和密码或扫码
- 微博颁发授权码给到浏览器:code
http://localhost:7000/dadashop/templates/callback.html?code=授权码
- 后端(商家)利用code获取该用户的授权令牌:access_token
- 执行绑定注册的逻辑
- 200:微博用户和正式用户已做好绑定,直接跳转到主页(index.html)。
- 201:微博用户未和正式用户做绑定,执行注册用户并绑定的操作。
- access_token使用:查看api文档,可以在微博开放平台开放出来的权限接口,获取该用户的一些资源,结合具体业务逻辑实现一些商业化的行为。
3.微博登录流程图
4.相关视图逻辑代码
class OAuthWeiBoUrlView(View):
def get(self, request):
'''获取微博授权登录页的视图'''
oauth_url = f"https://api.weibo.com/oauth2/authorize?client_id={settings.CLIENT_ID}&redirect_uri={settings.REDIRECT_URI}&response_type=code"
return JsonResponse({"code": 200, 'oauth_url': oauth_url})
class OAuthWeiBoTokenView(View):
def get(self, request):
'''
获取access_token(接口文档:oauth2/access_token)
1.获取code:查询字符串
2.获取access_token(API文档)
'''
code = request.GET.get('code')
url = "https://api.weibo.com/oauth2/access_token"
data = {
"client_id": settings.CLIENT_ID,
"client_secret": settings.CLIENT_SECRET,
"grant_type": "authorization_code",
"code": code,
"redirect_uri": settings.REDIRECT_URI,
}
html = requests.post(url=url, data=data).json()
# print(html)
'''
{
"access_token": "ACCESS_TOKEN",
"expires_in": 1234,
"remind_in": "798114",
"uid": "12341234"
}'''
# 绑定注册
wuid = html.get("uid")
access_token = html.get("access_token")
try:
weibo_user = WeiBoProfile.objects.get(wuid=wuid)
except Exception as e:
# 第一次微博登录
WeiBoProfile.objects.create(wuid=wuid, access_token=access_token)
return JsonResponse({"code": 201, "uid": wuid})
# 判定是否和正式用户关联过
user = weibo_user.user_profile
if user:
username = user.username
token = make_token(username)
return JsonResponse({"code": 200, "token": token, "username": username})
else:
# 微博登录,但关闭了绑定注册页面
print("わたしは あなたが だいすき")
return JsonResponse({"code": 201, "uid": wuid})
def post(self, request):
'''
微博用户和正式用户绑定注册视图逻辑
1.获取请求体数据
2.存入用户表UserProfile
3.绑定两个用户:更新微博表外键
4.签发token,发送激活邮件
5.返回响应
'''
data = json.loads(request.body)
username = data.get("username")
password = data.get("password")
email = data.get("email")
phone = data.get("phone")
uid = data.get("uid")
# 用户名是否可用
user = UserProfile.objects.filter(username=username)
if user:
return JsonResponse({"code": 10112, "error": "用户名已存在~~~"})
# 创建正式用户并执行绑定关系
with transaction.atomic():
sid = transaction.savepoint()
try:
user_obj = UserProfile.objects.create(username=username,
password=md5_encrypt(password),
email=email,
phone=phone)
# 更新外键:一查二改三保存
weibo_user = WeiBoProfile.objects.get(wuid=uid)
weibo_user.user_profile = user_obj
weibo_user.save()
except Exception as e:
print("绑定正式用户失败")
transaction.savepoint_rollback(sid)
return JsonResponse({"code": 10113, "error": "数据库错误"})
transaction.savepoint_commit(sid)
# 发送激活邮件
verify_url = get_verify_url(username)
async_send_active_email.delay(email, verify_url)
# 签发token
token = make_token(username)
# 返回数据
return JsonResponse({"code": 200, "username": username, "token": token})
按照微博的API文档,代码很容易实现!!!