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 django.contrib import admin |
||||||
|
from weixin.models import Profile |
||||||
# Register your models here. |
# 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.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 django.urls import path |
||||||
from weixin.views import WeixinLogin |
from weixin.views import WeixinLogin, UserData |
||||||
|
|
||||||
app_name = 'weixin' |
app_name = 'weixin' |
||||||
urlpatterns = [ |
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.views import APIView |
||||||
from rest_framework.response import Response |
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): |
def get(self, request, format=None): |
||||||
""" |
"""将当前用户的清单数据items返回""" |
||||||
提供get请求 |
print('Get data: ',request.user.profile.items) |
||||||
""" |
return Response({ |
||||||
return Response({"data": "Hello World!"}) |
'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