You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
77 lines
2.7 KiB
77 lines
2.7 KiB
from rest_framework.views import APIView |
|
from rest_framework.response import Response |
|
from django.contrib.auth.models import User |
|
from rest_framework_simplejwt.tokens import RefreshToken |
|
from rest_framework.permissions import IsAuthenticated |
|
import requests |
|
import json |
|
|
|
|
|
# 获取用户数据 |
|
class UserData(APIView): |
|
# 鉴权方式 |
|
permission_classes = [IsAuthenticated] |
|
|
|
def get(self, request, format=None): |
|
"""将当前用户的清单数据items返回""" |
|
print('Get data: ',request.user.profile.items) |
|
return Response({ |
|
'code': 'Get ok', |
|
'items': request.user.profile.items['items'] |
|
}) |
|
|
|
def post(self, request, format=None): |
|
"""将用户上传的数据更新到数据库""" |
|
user = request.user |
|
user.profile.items = request.data |
|
user.save() |
|
print('Post data: ', user.profile.items) |
|
return Response({'code': 'Post ok'}) |
|
|
|
|
|
class WeixinLogin(APIView): |
|
def post(self, request, format=None): |
|
"""提供post请求""" |
|
# 从请求中获取code |
|
code = json.loads(request.body).get('code') |
|
print("code: " + code); |
|
# 填写测试号的AppID和AppSecret |
|
appid = 'wxe35222de7aa53383' |
|
appsecret = '424c7145423396a00c987ca0e5ea8ae9' |
|
# 微信接口服务地址 |
|
base_url = 'https://api.weixin.qq.com/sns/jscode2session' |
|
# 拼接参数形成完整url |
|
url = base_url + '?appid=' + appid + '&secret=' + appsecret + '&js_code=' + code + '&grant_type=authorization_code' |
|
response = requests.get(url) |
|
|
|
# 获取openid和session_key |
|
try: |
|
openid = response.json()['openid'] |
|
session_key = response.json()['session_key'] # session_key是对用户数据进行了加密签名的密钥,不要泄露 |
|
except KeyError: |
|
return Response({'code': 'failed'}) |
|
else: |
|
# 打印到后端命令行 |
|
print("openid: " + openid) |
|
print("session_key: " + session_key) |
|
# 根据openid确定用户的本地身份 |
|
try: |
|
user = User.objects.get(username=openid) |
|
except User.DoesNotExist: |
|
user = None |
|
|
|
if user: |
|
user = User.objects.get(username=openid) |
|
# 如果用户不存在,则创建openid用户 |
|
else: |
|
user = User.objects.create( |
|
username=openid, |
|
password=openid, |
|
) |
|
# 用于给用户提供临时token |
|
refresh = RefreshToken.for_user(user) |
|
return Response({ |
|
'code': 'success', |
|
'refresh': str(refresh), |
|
'access': str(refresh.access_token), |
|
})
|
|
|