parent
7d27d891f1
commit
d1a3070aab
9 changed files with 294 additions and 33 deletions
Binary file not shown.
@ -1,3 +1,5 @@ |
||||
from django.contrib import admin |
||||
|
||||
from weixin.models import Profile |
||||
# Register your models here. |
||||
|
||||
admin.site.register(Profile) |
||||
|
@ -0,0 +1,26 @@ |
||||
# Generated by Django 4.1.1 on 2022-10-06 16:48 |
||||
|
||||
from django.conf import settings |
||||
from django.db import migrations, models |
||||
import django.db.models.deletion |
||||
import weixin.models |
||||
|
||||
|
||||
class Migration(migrations.Migration): |
||||
|
||||
initial = True |
||||
|
||||
dependencies = [ |
||||
migrations.swappable_dependency(settings.AUTH_USER_MODEL), |
||||
] |
||||
|
||||
operations = [ |
||||
migrations.CreateModel( |
||||
name='Profile', |
||||
fields=[ |
||||
('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), |
||||
('items', models.JSONField(default=weixin.models.empty_items)), |
||||
('user', models.OneToOneField(on_delete=django.db.models.deletion.CASCADE, to=settings.AUTH_USER_MODEL)), |
||||
], |
||||
), |
||||
] |
@ -1,3 +1,29 @@ |
||||
from django.db import models |
||||
from django.contrib.auth.models import User |
||||
from django.db.models.signals import post_save |
||||
from django.dispatch import receiver |
||||
|
||||
# Create your models here. |
||||
|
||||
# 默认items为空 |
||||
def empty_items(): |
||||
return {'items': []} |
||||
|
||||
|
||||
class Profile(models.Model): |
||||
# 与User外键链接 |
||||
user = models.OneToOneField(User, on_delete=models.CASCADE) |
||||
# 待办事项的json字段 |
||||
items = models.JSONField(default=empty_items) |
||||
|
||||
|
||||
# 每当User创建或者保存时通知对应的@receiver装饰的函数 |
||||
# 创建或保存对应的Profile模型 |
||||
@receiver(post_save, sender=User) |
||||
def create_user_profile(sender, instance, created, **kwargs): |
||||
if created: |
||||
Profile.objects.create(user=instance) |
||||
|
||||
|
||||
@receiver(post_save, sender=User) |
||||
def save_user_profile(sender, instance, **kwargs): |
||||
instance.profile.save() |
||||
|
@ -1,7 +1,8 @@ |
||||
from django.urls import path |
||||
from weixin.views import WeixinLogin |
||||
from weixin.views import WeixinLogin, UserData |
||||
|
||||
app_name = 'weixin' |
||||
urlpatterns = [ |
||||
path('login/', WeixinLogin.as_view(), name='login') |
||||
path('login/', WeixinLogin.as_view(), name='login'), |
||||
path('data/', UserData.as_view(), name='data'), |
||||
] |
@ -1,10 +1,77 @@ |
||||
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 WeixinLogin(APIView): |
||||
# 获取用户数据 |
||||
class UserData(APIView): |
||||
# 鉴权方式 |
||||
permission_classes = [IsAuthenticated] |
||||
|
||||
def get(self, request, format=None): |
||||
""" |
||||
提供get请求 |
||||
""" |
||||
return Response({"data": "Hello World!"}) |
||||
"""将当前用户的清单数据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), |
||||
}) |
||||
|
Loading…
Reference in new issue