最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

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

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

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

具體流程

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

django的用戶權(quán)限認(rè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)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

  • python常用時間庫time、datetime與時間格式之間的轉(zhuǎn)換教程

    python常用時間庫time、datetime與時間格式之間的轉(zhuǎn)換教程

    Python項目中很多時候會需要將時間在Datetime格式和TimeStamp格式之間轉(zhuǎn)化,下面這篇文章主要給大家介紹了關(guān)于python常用時間庫time、datetime與時間格式之間轉(zhuǎn)換的相關(guān)資料,需要的朋友可以參考下
    2023-02-02
  • Python3.13?+Pycharm?開發(fā)環(huán)境配置

    Python3.13?+Pycharm?開發(fā)環(huán)境配置

    本文全面解釋了如何配置Python3.13和PyCharm的開發(fā)環(huán)境,適合初學(xué)者,詳細(xì)介紹了Python安裝步驟、選擇解釋器、常用快捷鍵和推薦插件,強調(diào)了虛擬環(huán)境的重要性,以及如何使用PyCharm進行高效開發(fā),感興趣的可以了解一下
    2024-11-11
  • python pexpect ssh 遠(yuǎn)程登錄服務(wù)器的方法

    python pexpect ssh 遠(yuǎn)程登錄服務(wù)器的方法

    今天小編就為大家分享一篇python pexpect ssh 遠(yuǎn)程登錄服務(wù)器的方法,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2019-02-02
  • selenium+python 對輸入框的輸入處理方法

    selenium+python 對輸入框的輸入處理方法

    今天小編就為大家分享一篇selenium+python 對輸入框的輸入處理方法,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2018-10-10
  • Python正則表達式re.sub()用法詳解

    Python正則表達式re.sub()用法詳解

    re.sub用于替換字符串中的匹配項,下面這篇文章主要給大家介紹了關(guān)于Python正則表達式re.sub()用法的相關(guān)資料,文中通過實例代碼以及圖文介紹的非常詳細(xì),需要的朋友可以參考下
    2022-09-09
  • Python過濾函數(shù)filter()使用自定義函數(shù)過濾序列實例

    Python過濾函數(shù)filter()使用自定義函數(shù)過濾序列實例

    這篇文章主要介紹了Python過濾函數(shù)filter()使用自定義函數(shù)過濾序列實例,配合自定義函數(shù)可以實現(xiàn)許多強大的功能,需要的朋友可以參考下
    2014-08-08
  • django1.8使用表單上傳文件的實現(xiàn)方法

    django1.8使用表單上傳文件的實現(xiàn)方法

    Django是一個開放源代碼的Web應(yīng)用框架,由Python寫成。這篇文章主要介紹了django1.8使用表單上傳文件的相關(guān)資料,非常不錯具有參考借鑒價值,感興趣的朋友一起看看吧
    2016-11-11
  • Python設(shè)計模式結(jié)構(gòu)型享元模式

    Python設(shè)計模式結(jié)構(gòu)型享元模式

    這篇文章主要介紹了Python享元模式,享元模式即Flyweight Pattern,指運用共享技術(shù)有效地支持大量細(xì)粒度的對象,下面和小編一起進入文章了解更多詳細(xì)內(nèi)容吧
    2022-02-02
  • Python3.5編程實現(xiàn)修改IIS WEB.CONFIG的方法示例

    Python3.5編程實現(xiàn)修改IIS WEB.CONFIG的方法示例

    這篇文章主要介紹了Python3.5編程實現(xiàn)修改IIS WEB.CONFIG的方法,涉及Python針對xml格式文件的讀寫以及節(jié)點操作相關(guān)技巧,需要的朋友可以參考下
    2017-08-08
  • Python中__del__方法的使用方法詳細(xì)解析

    Python中__del__方法的使用方法詳細(xì)解析

    __del__()稱為“析構(gòu)方法”,用于實現(xiàn)對象被銷毀時所需的操作,下面這篇文章主要給大家介紹了關(guān)于Python中__del__方法的使用方法,文中通過代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2024-02-02

最新評論

慈利县| 塔河县| 乐昌市| 石泉县| 鄄城县| 平乡县| 保康县| 两当县| 五华县| 右玉县| 民权县| 策勒县| 鄂托克前旗| 临夏县| 榆社县| 张家港市| 平罗县| 安平县| 上高县| 宜宾县| 工布江达县| 青田县| 泉州市| 揭东县| 延边| 滦南县| 红桥区| 秦皇岛市| 扎赉特旗| 信阳市| 老河口市| 晴隆县| 永州市| 通许县| 玉山县| 长葛市| 栾川县| 郎溪县| 永平县| 德州市| 项城市|