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

python實(shí)現(xiàn)微信小程序用戶登錄、模板推送

 更新時(shí)間:2019年08月28日 16:58:40   作者:劉東靈  
這篇文章主要為大家詳細(xì)介紹了python實(shí)現(xiàn)微信小程序用戶登錄、模板推送,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下

Python 實(shí)現(xiàn)微信小程序的用戶登錄

小程序可以通過(guò)官方提供的登錄鄧麗來(lái)獲取用戶身份的標(biāo)示, 具體文檔可以參考 官方文檔, 通過(guò)流程時(shí)序可以看到, 對(duì)于需要和前端配合的服務(wù)端開(kāi)發(fā), 主要實(shí)現(xiàn)的就是通過(guò)小程序提供的 code 換取用戶的 openid 和 session_key, 并用換取到的 openid 和 secret_key 作為自定義的登錄態(tài). 分析后得知, 作為小程序后端的開(kāi)發(fā), 主要實(shí)現(xiàn)以下幾部分內(nèi)容:

  • 提供一個(gè) HTTP 接口, 供小程序方使用, 傳遞code;
  • 換取用戶身份標(biāo)識(shí);
  • 維護(hù)一個(gè)自定義的登錄態(tài);
  • 需要存儲(chǔ)用戶的 openid , 以備后續(xù)使用.

1.提供給小程序一個(gè) HTTP 接口, 接口而使用 Tornado 框架

簡(jiǎn)化闡述, 代碼沒(méi)有做異常處理

class LoginHandler(RequestHandler):
 def post(self):
 req_data = json.loads(self.request.body)
 js_code = req_data.get('js_code')
 
 # 開(kāi)始換取用戶的信息
 user_info = get_user_info(js_code=js_code)
 openid = user_info['openid']
 session_key = user_info['session_key']
 user_uuid = str(uuid.uuid4()) # 暴露給小程序端的用戶標(biāo)示
 
 # 用來(lái)維護(hù)用戶的登錄態(tài)
 User.save_user_session(
   user_uuid=user_uuid,
   openid=openid,
   session_key=session_key
 )
 
 # 微信小程序不能設(shè)置cookie, 把用戶信心存在了headers中
 self.set_header('Authorization', user_uuid)
 # 存儲(chǔ)用戶信息
 User.save_user_info(open_id=openid)
 self.set_status(204)

2.換取用戶身份標(biāo)示, 直接使用 Requests包 請(qǐng)求微信的相關(guān)接口, 獲取數(shù)據(jù)

def get_user_info(js_code):

 req_params = {
 "appid": 'app_id', # 小程序ID
 "secret": 'secret', # 小程序 secret
 "js_code": js_code,
 "grant_type": 'authorization_code'
 } 
 req_resutl = requests.get('https://api.weixin.qq.com/sns/jscode2session', params=req_params, timeout=3, verify=False)
 return req_result.json()

3.維護(hù)一個(gè)自定義的登錄態(tài), 使用 Redis

user_redis = StrictRedis.from_url('redis//localhost:6379')

class User(object):
 REDIS_EXPIRES = 7 * 24 * 60 * 60
 
 @classmethod
 def save_user_session(cls, user_uuid, openid, session_key):
 user_session_value = {
 'openid':openid,
 'session_key':session_key
 }
 user_session_key = 'US:' + user_uuid
 with user_redis.pipeline(transaction=False) as pipe:
 pipe.hmset(user_session_key, user_session_value)
 pipe.expire(user_session_key, cls.REDIS_EXPIRES)
 pipe.execute()

4.存儲(chǔ)用戶信息, 以備后用, ORM使用 SQLAlchemy

from sqlalchemy import create_engine
from sqlalchemy.ext.declarative import declarative_base

# mysql 相關(guān)設(shè)置
engine = create_engine('mysql://root:pwd@localhost/wechat')
conn = engine.connect()

Base = declarative_base()
Base.metadata.reflect(engine)
tables = Base.metadata.tables

class User(object):
 table = tables['user']

 @classmethod
 def save_user_info(cls, open_id):
 # 存儲(chǔ)用戶信心
 sql = cls.table.insert().values(open_id=open_id)
 conn.execute(sql)

SQL 語(yǔ)句

CREATE TABLE `user`(
 `id` int(20) unsigned NOT NULL AUTO_INCREMENT,
 `open_id` varchar(32) NOT NULL COMMENT '用戶 open_id',
 `created_at` timestamp NULL DEFAULT CURRENT_TIMESTAMP COMMENT '創(chuàng)建時(shí)間',
 `updated_at` timestamp NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新時(shí)間',
 PRIMARY KEY (`id`),
 KEY `idx_oid` (`open_id`)
) ENGINE=InnoDB default CHARSET=utf8mb4;

Template: 通過(guò)代碼發(fā)送微信模板消息

import json

import requests
from redis import StrictRedis
from tornado.web import RequestHandler

redis = StrictRedis.from_url('redis//localhost:6379')

def get_access_token():
 payload = {
 'grant_type': 'client_credential',
 'appid': 'appid',
 'secret': 'secret'
 }
req = requests.get('https://api.weixin.qq.com/cgi-bin/token', params=payload, timeout=3, verify=False)
access_token = req.json().get('access_token')
redis.set('ACCESS_TOKEN', access_token)

class FormHandler(RequestHandler):
 def post(self):
 req_data = self.request.body
 req_data = json.loads(req_data)
 form_id = req_data.get('from_id')
 remplate_push(form_id) # 使用消息進(jìn)行模板推送
 
def template_push(form_id):
 data = {
 "touser": 'open_id',
 "template_id": 'template_id',
 "page": 'pages/index/index',
 "form_id": form_id,
 "data":{
 "keyword1":{
 "value": "value"
 }
 }
 "emphasis_keyword": ''
 }
 access_token = redis.get('ACCESS_TOKEN')
 push_url = 'https://api.weixin.qq.com/cgi-bin/message/wxopen/template/send?access_token={}'.format(access_token)
 requests.post(push_url, json=data, timeout=3, verify=False)

以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

  • Python實(shí)現(xiàn)JSON反序列化類對(duì)象的示例

    Python實(shí)現(xiàn)JSON反序列化類對(duì)象的示例

    本篇文章主要介紹了Python實(shí)現(xiàn)JSON反序列化類對(duì)象的示例,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2018-01-01
  • appium測(cè)試之APP元素定位及基本工具介紹

    appium測(cè)試之APP元素定位及基本工具介紹

    看了我文章了相信都了解了web端的元素定位了,沒(méi)看的,既然進(jìn)來(lái)了那么肯定多多少少知道些,本文主要來(lái)介紹APP的元素定位有哪些定位方式,我們又怎么去連接APP,然后通過(guò)工具去獲取元素
    2021-09-09
  • 對(duì)pycharm代碼整體左移和右移縮進(jìn)快捷鍵的介紹

    對(duì)pycharm代碼整體左移和右移縮進(jìn)快捷鍵的介紹

    今天小編就為大家分享一篇對(duì)pycharm代碼整體左移和右移縮進(jìn)快捷鍵的介紹,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2018-07-07
  • 詳解Django的MVT設(shè)計(jì)模式

    詳解Django的MVT設(shè)計(jì)模式

    本章我們將介紹下經(jīng)典的軟件開(kāi)發(fā)所遵循的MVC (Model-View-Controller, 模型-視圖-控制器) 設(shè)計(jì)模式以及Django的MVT設(shè)計(jì)模式(Model-View-Template)是如何遵循這種設(shè)計(jì)理念的。
    2021-04-04
  • drf-router和authenticate認(rèn)證源碼分析

    drf-router和authenticate認(rèn)證源碼分析

    在 Rest Framework 中提供了兩個(gè) router , 可以幫助我們快速的實(shí)現(xiàn)路由的自動(dòng)生成,本文通過(guò)實(shí)例代碼給大家介紹drf-router和authenticate認(rèn)證源碼分析,感興趣的朋友跟隨小編一起看看吧
    2021-07-07
  • Python數(shù)據(jù)分析的八種處理缺失值方法詳解

    Python數(shù)據(jù)分析的八種處理缺失值方法詳解

    缺失值可能是數(shù)據(jù)科學(xué)中最不受歡迎的值,然而,它們總是在身邊。忽略缺失值也是不合理的,因此我們需要找到有效且適當(dāng)?shù)靥幚硭鼈兊姆椒?/div> 2021-11-11
  • Python實(shí)現(xiàn)快速大文件比較代碼解析

    Python實(shí)現(xiàn)快速大文件比較代碼解析

    這篇文章主要介紹了Python實(shí)現(xiàn)快速大文件比較代碼解析,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-09-09
  • Python爬蟲學(xué)習(xí)之獲取指定網(wǎng)頁(yè)源碼

    Python爬蟲學(xué)習(xí)之獲取指定網(wǎng)頁(yè)源碼

    這篇文章主要為大家詳細(xì)介紹了Python爬蟲學(xué)習(xí)之獲取指定網(wǎng)頁(yè)源碼,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2019-07-07
  • Python編寫單元測(cè)試代碼實(shí)例

    Python編寫單元測(cè)試代碼實(shí)例

    這篇文章主要介紹了Python編寫單元測(cè)試代碼實(shí)例,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-09-09
  • 用uWSGI和Nginx部署Flask項(xiàng)目的方法示例

    用uWSGI和Nginx部署Flask項(xiàng)目的方法示例

    這篇文章主要介紹了用uWSGI和Nginx部署Flask項(xiàng)目的方法示例,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2019-05-05

最新評(píng)論