欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

django與小程序?qū)崿F(xiàn)登錄驗證功能的示例代碼

 更新時間:2019年02月19日 15:02:46   作者:葉袖清風  
這篇文章主要介紹了django與小程序?qū)崿F(xiàn)登錄驗證功能的示例代碼,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧

之前用小程序做項目,因為后臺使用的java開發(fā),一切順利,但切換成django做RESTful API接口時,在登陸注冊時一直出現(xiàn)問題,網(wǎng)上搜索,借助一個網(wǎng)友的回答,找到了一種可行的解決方案,現(xiàn)記錄如下。

具體流程

  • 用戶點擊小程序頁面上的登錄授權(quán)認證
  • 通過微信自帶的認證獲取code
  • 調(diào)取登錄接口,將code傳入后臺
  • 后臺拿到code調(diào)用微信接口獲取openid等用戶信息
  • 后臺將openid作為用戶名,若存在則去校驗用戶信息,否則以此用戶名創(chuàng)建新用戶,密碼隨機生成
  • 將校驗結(jié)果或者創(chuàng)建信息返回給微信小程序端
  • 根據(jù)返回的信息完成用戶登錄校驗

django的用戶權(quán)限認證

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__"

登陸接口設(shè)計

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'] = '授權(quán)成功'
    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  # 前端傳回的動態(tài)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);
      }
    }
  })
}

以上就是本文的全部內(nèi)容,希望對大家的學習有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

  • 原理解析為什么pydantic可變對象沒有隨著修改而變化

    原理解析為什么pydantic可變對象沒有隨著修改而變化

    這篇文章主要介紹了為什么pydantic可變對象沒有隨著修改而變化的原因解析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2023-05-05
  • Python中Numpy與TensorFlow版本兼容問題完美解決辦法

    Python中Numpy與TensorFlow版本兼容問題完美解決辦法

    這篇文章主要給大家介紹了關(guān)于Python中Numpy與TensorFlow版本兼容問題的完美解決辦法,確保Python版本與TensorFlow版本兼容是首要任務(wù),因為不兼容的組合可能導(dǎo)致導(dǎo)入錯誤或其他運行時問題,需要的朋友可以參考下
    2024-07-07
  • Pyecharts?繪制3種常用的圖形

    Pyecharts?繪制3種常用的圖形

    這篇文章主要介紹了Pyecharts?繪制3種常用的圖形,上下組合圖、左右組合圖、一軸多圖,下文繪制過程幾介紹,需要的小伙伴可以參考一下
    2022-02-02
  • Python制作數(shù)據(jù)預(yù)測集成工具(值得收藏)

    Python制作數(shù)據(jù)預(yù)測集成工具(值得收藏)

    這篇文章主要介紹了Python如何制作數(shù)據(jù)預(yù)測集成工具,幫助大家進行大數(shù)據(jù)預(yù)測,感興趣的朋友可以了解下
    2020-08-08
  • 詳解Python的整數(shù)是如何實現(xiàn)的

    詳解Python的整數(shù)是如何實現(xiàn)的

    本文我們來聊一聊Python的整數(shù),我們知道Python的整數(shù)是不會溢出的,換句話說,它可以計算無窮大的數(shù),只要你的內(nèi)存足夠,它就能計算。但問題是,Python底層又是C實現(xiàn)的,那么它是怎么做到整數(shù)不溢出的呢?本文就來詳細說說
    2022-11-11
  • Python列表list排列組合操作示例

    Python列表list排列組合操作示例

    這篇文章主要介紹了Python列表list排列組合操作,涉及Python排列組合數(shù)值運算相關(guān)操作技巧,需要的朋友可以參考下
    2018-12-12
  • python中l(wèi)ogging庫的使用總結(jié)

    python中l(wèi)ogging庫的使用總結(jié)

    Python的logging模塊提供了通用的日志系統(tǒng),可以方便第三方模塊或者是應(yīng)用使用,下面這篇文章主要給大家介紹了關(guān)于python中l(wèi)ogging庫使用的一些知識總結(jié),文中給出了詳細的示例代碼,需要的朋友可以參考借鑒,下面來一起看看吧。
    2017-10-10
  • 一文帶你了解Python中的注釋及變量

    一文帶你了解Python中的注釋及變量

    這篇文章主要給大家介紹了關(guān)于Python中注釋及變量的相關(guān)資料,Python是一門動態(tài)類型的語言,因此無須提前聲明變量類型,文中通過實例代碼介紹的非常詳細,需要的朋友可以參考下
    2023-07-07
  • Python實現(xiàn)語音識別Whisper的使用示例

    Python實現(xiàn)語音識別Whisper的使用示例

    Whisper是由OpenAI基于Python開發(fā)的能夠識別多國語言的語音識別模型,本文主要介紹了Python實現(xiàn)語音識別Whisper的使用示例,具有一定的參考價值,感興趣的可以了解一下
    2023-12-12
  • 基于python解線性矩陣方程(numpy中的matrix類)

    基于python解線性矩陣方程(numpy中的matrix類)

    這篇文章主要介紹了基于python解線性矩陣方程(numpy中的matrix類),文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下
    2019-10-10

最新評論