django实现登录注册(django与小程序实现登录验证功能的示例代码)
类别:脚本大全 浏览量:2282
时间:2022-01-28 01:31:12 django实现登录注册
django与小程序实现登录验证功能的示例代码之前用小程序做项目,因为后台使用的java开发,一切顺利,但切换成django做RESTful API接口时,在登陆注册时一直出现问题,网上搜索,借助一个网友的回答,找到了一种可行的解决方案,现记录如下。
具体流程
- 用户点击小程序页面上的登录授权认证
- 通过微信自带的认证获取code
- 调取登录接口,将code传入后台
- 后台拿到code调用微信接口获取openid等用户信息
- 后台将openid作为用户名,若存在则去校验用户信息,否则以此用户名创建新用户,密码随机生成
- 将校验结果或者创建信息返回给微信小程序端
- 根据返回的信息完成用户登录校验
django的用户权限认证
django有一套自己的完善用户模型,由于Django Auth自带的User模型字段有限,我们需要对其进行拓展(直接使用也可以)
|
nickname = models.CharField(verbose_name = u '昵称' ,max_length = 50 , blank = True ) user_avatar = models.ImageField(verbose_name = u '用户头像' , upload_to = 'image/%Y/%m/%d' , default = u 'image/default.png' , max_length = 500 ) user_email = models.EmailField(verbose_name = u '用户邮箱' ,max_length = 254 ) user_phone = models.BigIntegerField(verbose_name = u '手机号' , null = True ,blank = True ) user_birthday = models.DateField(verbose_name = u '出生日期' , default = timezone.now) user_sex = models.CharField(verbose_name = u '性别' ,max_length = 6 ,choices = (( 'male' , '男' ),( 'female' , '女' )),default = 'male' ) user_address = models.CharField(verbose_name = u '地址' ,max_length = 550 , blank = True ,null = True ) signature = models.CharField(verbose_name = u '个性签名' ,max_length = 550 , blank = True ,null = True ) |
用户接口序列化
|
from rest_framework import serializers class UserSerializer(serializers.ModelSerializer): class Meta: model = User fields = "__all__" |
登陆接口设计
|
class UserLogin(APIView): def post( self ,request): params = request.data userName = get_openid(params.get( 'code' )) userInfo = params.get( 'userinfo' ) try : user = User.objects.get(username = userName) except Exception as e: user = None if user: # 更新用户信息 user = User.objects.get(username = userName) else : #注册新用户 user = User.objects.create_user(username = userName,password = random_str( 10 )) #手动生成JWT # 手动生成token验证 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) ret = { 'code' : '00000' , 'msg' : None , 'data' :{}} ret[ 'msg' ] = '授权成功' ret[ 'data' ] = { 'token' : token, 'user_id' : user. id , 'nickname' : user.nickname } return JsonResponse(ret) |
解析code获取openid
|
class OpenidUtils( object ): def __init__( self , jscode): self .url = "https://api.weixin.qq.com/sns/jscode2session" self .appid = APPID self .secret = SECRET self .jscode = jscode # 前端传回的动态jscode def get_openid( self ): url = self .url + "?appid=" + self .appid + "&secret=" + self .secret + "&js_code=" + self .jscode + "&grant_type=authorization_code" r = requests.get(url) openid = r.json()[ 'openid' ] return openid |
小程序的登陆验证
具体登录流程可以查阅官方文档。
|
function getWXUserInfo() { const login = promisify(wx.login); const getUserInfo = promisify(wx.getUserInfo); return new Promise( function (resolve, reject) { _wxLogin(); function _wxLogin() { login().then( function (res) { getUserInfo().then( function (r) { let userInfo = r; userInfo.code = res.code; try { wx.setStorageSync( 'userInfo' , userInfo); } catch (e) { console.log(e) } if (userInfo && userInfo.code && userInfo.iv) { resolve(userInfo); } else { reject( 'wx login fail' ); } }). catch ( function (error) { reject(error); }); }). catch ( function (error) { reject(error); }); } }); } //登录接口验证 getWXUserInfo().then( function (data) { var result = { code: 0, data: {} }; var params = { 'code' :data.code, 'userinfo' :data.userInfo } wx.request({ url: '/api/login' , data: params, dataType: 'json' , method: 'POST' , success: function (response) { // 返回成功 if (response.data && response.data.code == '00000' ) { try { var resData = { custNo: data.user_id, nickname: data.nickname }; result.code = 0; result.data = resData; resolve(result); } catch (e) { console.warn(result) // 登录失败 result.code = 2; resolve(result); } } else { // 获取 customNum 失败 console.warn(result) result.code = 1; result.data = 'get customNum fail' ; resolve(result); } } }) } |
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持开心学习网。
原文链接:https://juejin.im/post/5c6b64bde51d457fa31e6a30
您可能感兴趣
- 微信小程序简易计算器制作(微信小程序实现简单计算器功能)
- 小程序canvas不显示(小程序canvas中文字设置居中锚点)
- 微信小程序获取时间(微信小程序wxs日期时间处理的实现示例)
- 微信小程序抽签如何抽中(JavaScript实现班级抽签小程序)
- 小程序数字化怎么布局(用position:sticky完美解决小程序吸顶问题的实现方法)
- 微信小程序左右翻页效果(微信小程序实现九宫格效果)
- 微信小程序静态页面详情(微信小程序基础教程之echart的使用)
- python简易翻译器的运行(Python3.6实现带有简单界面的有道翻译小程序)
- php开发微信小程序后台步骤流程(基于PHP实现微信小程序客服消息功能)
- python编写的小程序(几个适合python初学者的简单小程序,看完受益匪浅!推荐)
- 微信小程序swiper大小调整(微信小程序swiper-dot中的点如何改成滑块详解)
- 能自动点赞的小程序(python实现QQ空间自动点赞功能)
- html5按钮点击跳转(HTML5页面嵌入小程序没有返回按钮及返回页面空白的问题)
- 小程序可滑动弧形进度条(小程序实现文字循环滚动动画)
- wx小程序请求封装(小程序wx.getUserProfile接口的具体使用)
- 微信小程序开发如何实现自动保存(微信小程序开发实用技巧之数据传递和存储)
- 苏志燮赵恩静结婚,韩国四大公共财产变三人,这么快就有替补了(苏志燮赵恩静结婚)
- 《内在美》后,一大波新韩剧来袭,李钟硕朴信惠宋慧乔玄彬回归(一大波新韩剧来袭)
- 给孩子选购保温杯,注意这4个步骤,比颜值更重要(给孩子选购保温杯)
- 保温好 容量大 颜值高 保温杯你给娃娃买对了吗(保温好容量大颜值高)
- 《道德经》 人生避开骄狂,才能免去祸患(道德经人生避开骄狂)
- 郭麒麟(郭麒麟)
热门推荐
- 使用TLS加密通讯远程连接Docker的示例详解(使用TLS加密通讯远程连接Docker的示例详解)
- 阿里云ecs怎么进去(阿里云ECS服务器centos系统第一次登录提示Login Incorrect的解决方法)
- canvas时钟代码(canvas实现烟花的示例代码)
- Cookie常用属性
- js的遍历数组方法(JS中数组常用的循环遍历你会几种)
- javascript变量值做函数名(JavaScript中变量提升和函数提升实例详解)
- 用docker搭建在线开发环境(Docker环境搭建的简单方法)
- SQL SERVER中@@TRANCOUNT
- 安装mysql中要注意什么问题(安装Mysql时可能会遇到的一些疑难杂症)
- css在ie中怎么显示不正常(IE6和IE7中行内元素后的浮动元素被折行的问题解决)
排行榜
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9