教程:在Django中实现微信授权登录
教程:在Django中实现微信授权登录
本教程将引导您如何在Django项目中实现微信授权登录。在本教程中,我们将使用自定义的用户模型User,并通过微信提供的API来进行用户认证。
在进行以下教程之前,请确保你已经在微信开放平台添加了网站应用,并获得了:
1.WECHAT_APPID
2.WECHAT_SECRET
3.以及设置了回调域(即认证的网址)
WECHAT_REDIRECT_URI 比如,我的回调域就是:https://www.xxx.com,Django的url中我则写成/wechat/callback/,视图中就可以进行回调使用了,这个没有绝对,重要的是设置自己的网址为回调域
第1步:创建自定义用户模型
首先,在您的Django应用中创建一个自定义的用户模型。在models.py文件中定义模型:
from django.db import models# 这里一定要继承AbstractUser才行
from django.contrib.auth.models import AbstractUserclass User(AbstractUser):# 不需要显式添加id字段,Django会自动创建openid = models.CharField(max_length=128, unique=True, null=True, blank=True)username = models.CharField(max_length=150, null=True, unique=True)# 不需要再次声明password字段,因为AbstractUser类已经包含了password字段# email字段已在AbstractUser中定义,只需指定null和blank即可email = models.EmailField(null=True, blank=True)phone_number = models.CharField(max_length=15, null=True, blank=True)real_name = models.CharField(max_length=128, null=True, blank=True)creation_date = models.DateTimeField(auto_now_add=True)role_type = models.CharField(max_length=50, null=True, blank=True)avatar = models.URLField(null=True, blank=True)gender = models.CharField(max_length=10, null=True, blank=True)birthday = models.DateField(null=True, blank=True)address = models.CharField(max_length=255, null=True, blank=True)# 新增加的微信字段nickname = models.CharField(max_length=64, null=True, blank=True)sex = models.PositiveSmallIntegerField(choices=((0, '未知'), (1, '男'), (2, '女')), null=True, blank=True)language = models.CharField(max_length=32, null=True, blank=True)city = models.CharField(max_length=32, null=True, blank=True)province = models.CharField(max_length=32, null=True, blank=True)country = models.CharField(max_length=32, null=True, blank=True)headimgurl = models.URLField(null=True, blank=True)privilege = models.JSONField(default=list, blank=True, null=True) # 使用可调用的默认值unionid = models.CharField(max_length=128, null=True, blank=True)# last_login字段已经在AbstractBaseUser中,不需要重复声明# 如果你没有特别需要覆盖save()方法,也可以省略这个方法# def save(self, *args, **kwargs):# super(User, self).save(*args, **kwargs)@classmethoddef create_or_update_from_wechat(cls, wechat_data):user, created = cls.objects.update_or_create(openid=wechat_data['openid'],defaults={'nickname': wechat_data.get('nickname', ''),'sex': wechat_data.get('sex', 0),'language': wechat_data.get('language', ''),'city': wechat_data.get('city', ''),'province': wechat_data.get('province', ''),'country': wechat_data.get('country', ''),'headimgurl': wechat_data.get('headimgurl', ''),'privilege': wechat_data.get('privilege', []),'unionid': wechat_data.get('unionid', ''),})return user
第2步:配置settings.py
在settings.py文件中进行以下配置:
# 登录认证系统后端,二者任选其一即可
AUTHENTICATION_BACKENDS = ['django.contrib.auth.backends.ModelBackend','allauth.account.auth_backends.AuthenticationBackend',
]# index 是应用的名字,User 是你的自定义用户模型的类名
AUTH_USER_MODEL = 'index.User'# 用户登录的url名称
LOGIN_URL = "user_login"# 登录成功调回地址的url名称
LOGIN_REDIRECT_URL = "index"
第3步:实现登录视图
在views.py中创建登录视图和微信回调视图:
from django.shortcuts import redirect
from django.conf import settings
import requests
from urllib.parse import quote
from django.http import HttpResponseRedirect
from django.contrib.auth import logout
from django.http import JsonResponse
from .models import User
from django.contrib.auth import login
from django.utils import timezonedef user_login(request):appid = settings.WECHAT_APPIDredirect_uri = quote(settings.WECHAT_REDIRECT_URI)url = f"https://open.weixin.qq.com/connect/qrconnect?appid={appid}&redirect_uri={redirect_uri}&response_type=code&scope=snsapi_login&state=STATE#wechat_redirect"return HttpResponseRedirect(url)def logout_view(request):logout(request)# 重定向到登录页面或者主页return redirect('index')def wechat_login_callback(request):code = request.GET.get('code')# 利用code获取access_tokenappid = settings.WECHAT_APPIDsecret = settings.WECHAT_SECRETurl = f'https://api.weixin.qq.com/sns/oauth2/access_token?appid={appid}&secret={secret}&code={code}&grant_type=authorization_code'response = requests.get(url)data = response.json()access_token = data.get('access_token')openid = data.get('openid')url = f'https://api.weixin.qq.com/sns/userinfo?access_token={access_token}&openid={openid}'response = requests.get(url)user_info = response.json()# 创建或者更新用户信息user = User.create_or_update_from_wechat(user_info)# 更新 last_login 字段user.last_login = timezone.now()user.save(update_fields=['last_login'])# 选择要登录的后端认证系统,这里可以选择Django自带的,也可以选择微信的backend = 'django.contrib.auth.backends.ModelBackend'# backend = 'allauth.account.auth_backends.AuthenticationBackend'user.backend = backend # 设置用户实例的后端属性login(request, user, backend=backend) # 登录用户,传入backend参数# 这里我随便写了一个url名称return redirect("bbworld")
第4步:配置URLs
在urls.py中将路径与视图关联起来:
from django.urls import path
from . import viewsurlpatterns = [path('login/', views.user_login, name='user_login'),path('logout/', views.logout_view, name='logout'),path('wechat/callback/', views.wechat_login_callback, name='wechat_callback'),# 其他URLs...
]
第5步:使用@login_required装饰器保护视图
在任何需要用户登录的视图前使用@login_required装饰器:
from django.shortcuts import render
from django.contrib.auth.decorators import login_required@login_required
def bbworld(request):return render(request, 'bbworld.html')
第6步:处理未登录的重定向
当用户尝试访问受@login_required保护的页面时,他们将被重定向到在settings.py中定义的LOGIN_URL,然后授权登录成功后反调回LOGIN_REDIRECT_URL = “index”。
在Django中,当您对模型进行了更改之后,例如添加了新的字段或修改了字段的类型,您需要创建一个新的数据库迁移以便将这些更改应用到数据库中。以下是如何进行数据迁移的步骤:
第7步:数据迁移到数据库
这一步也可以建好模型的时候就进行操作,另外,确保setting里面已经设置好了数据库,无论是sqlite还是mysql
python manage.py makemigrations
python manage.py migrate
第8步:运行和测试
运行您的Django项目并测试登录流程。确保所有URLs正确配置,并且重定向和回调都按预期工作。
python manage.py runserver
访问登录URL,并通过微信扫码登录来测试整个流程。
以上就是在Django中实现微信授权登录的基本步骤。
因为这个事情,花了我很多时间,我也希望你能通过我的教程,快速完成业务,如果有不清楚的,欢迎留言咨询,我会第一时间回复,谢谢,祝你也学习愉快!
相关文章:
教程:在Django中实现微信授权登录
教程:在Django中实现微信授权登录 本教程将引导您如何在Django项目中实现微信授权登录。在本教程中,我们将使用自定义的用户模型User,并通过微信提供的API来进行用户认证。 在进行以下教程之前,请确保你已经在微信开放平台添加了…...
YOLOv5改进 | 主干篇 | 12月份最新成果TransNeXt特征提取网络(全网首发)
一、本文介绍 本文给大家带来的改进机制是TransNeXt特征提取网络,其发表于2023年的12月份是一个最新最前沿的网络模型,将其应用在我们的特征提取网络来提取特征,同时本文给大家解决其自带的一个报错,通过结合聚合的像素聚焦注意力和卷积GLU&…...
【java八股文】之计算机网络系列篇
1、TCP/IP和UDP模型 TCP/IP分层(4层):应用层,传输层,网络层,数据链路层 网络的七层架构 (7层):应用层,表示层,会话层,传输层ÿ…...
SpringAMQP的使用
1. 简介: SpringAMQP是基于RabbitMQ封装的一套模板,并且还利用SpringBoot对其实现了自动装配,使用起来非常方便。 SpringAmqp的官方地址:https://spring.io/projects/spring-amqp SpringAMQP提供了三个功能: 自动声…...
MATLAB - 使用运动学 DH 参数构建机械臂
系列文章目录 前言 一、 使用 Puma560 机械手机器人的 Denavit-Hartenberg (DH) 参数,逐步建立刚体树形机器人模型。在连接每个关节时,指定其相对 DH 参数。可视化机器人坐标系,并与最终模型进行交互。 DH 参数定义了每个刚体通过关节与其父…...
2024年腾讯云新用户优惠云服务器价格多少?
腾讯云服务器租用价格表:轻量应用服务器2核2G3M价格62元一年、2核2G4M价格118元一年,540元三年、2核4G5M带宽218元一年,2核4G5M带宽756元三年、轻量4核8G12M服务器446元一年、646元15个月,云服务器CVM S5实例2核2G配置280.8元一年…...
如何在原型中实现继承和多态
在JavaScript中,我们可以通过原型链来实现继承。以下是如何在原型中实现继承的例子: // 定义一个动物原型 var Animal function() {}; Animal.prototype.move function() { console.log(‘This animal can move.’); }; // 定义一个狗的原型…...
MySQL/Oracle 的 字符串拼接
目录 MySQL、Oracle 的 字符串拼接1、MySQL 的字符串拼接1.1 CONCAT(str1,str2,...) : 可以拼接多个字符串1.2 CONCAT_WS(separator,str1,str2,...) : 指定分隔符拼接多个字符串1.3 GROUP_CONCAT(expr) : 聚合函数,用于将多行的值连接成一个字符串。 2、Oracle 的字…...
【Java SE语法篇】10.String类
📚博客主页:爱敲代码的小杨. ✨专栏:《Java SE语法》 ❤️感谢大家点赞👍🏻收藏⭐评论✍🏻,您的三连就是我持续更新的动力❤️ 文章目录 前言1. String类1.1 字符串的构造1.2 String对象的比…...
【Python】数据可视化--基于TMDB_5000_Movie数据集
一、数据准备 tmdb_5000_movie数据集下载 二、数据预处理 观察数据集合情况 import pandas as pd import ast import warnings warnings.filterwarnings(ignore) # 加载数据集 df pd.read_csv(tmdb_5000_movies.csv) # 查看数据集信息 print(df.info()) 由于原数据集包含的…...
学习Vue的插槽总结
今天学习了Vue的插槽,在这之前学习使用组件的使用还没有试过在父组件中给子组件插入html结构,今天学习的插槽正是拿来实现这一功能的,这也是一种组件中通信的方式,首先插槽分为三类:默认插槽、具名插槽、作用域插槽。接…...
第九篇 API设计原则与最佳实践
深入浅出HTTP请求前后端交互系列专题 第一章 引言-HTTP协议基础概念和前后端分离架构请求交互概述 第二章 HTTP请求方法、状态码详解与缓存机制解析 第三章 前端发起HTTP请求 第四章 前后端数据交换格式详解 第五章 跨域资源共享(CORS):现代W…...
新版AndroidStudio配置maven阿里云镜像
project下的build.gradle: // Top-level build file where you can add configuration options common to all sub-projects/modules. // 注意jdk版本需要17以上,因为8.1.3的gradle需要jdk17以上 //plugins { // id com.android.application version…...
【OSG案例详细分析与讲解】之十一:【多效果的3D动画】
目录 一、【多效果的3D动画】前言 二、【多效果的3D动画】实现效果...
一道使用LinkedList和Stack解决的算法题
一、无法吃午餐的学生数量 学校的自助午餐提供圆形和方形的三明治,分别用数字 0 和 1 表示。所有学生站在一个队列里,每个学生要么喜欢圆形的要么喜欢方形的。 餐厅里三明治的数量与学生的数量相同。所有三明治都放在一个 栈 里,每一轮&#…...
通用外设-W25Q64
前言 一、SPI通信 二、W25Q64基初时序 1.各种命令代码 2.代码 1.写使能指令 2.读取芯片是否忙碌状态并等待 3.写入数据 4.擦除函数操作 5.读取代码 三.验证 四.擦除说明 总结 前言 在单片机中一般32K FLASH就够用了,但是当我们使用图片或其他大量数据时…...
Spring MVC MVC介绍和入门案例
1.SpringMVC概述 1.1.MVC介绍 MVC是一种设计模式,将软件按照模型、视图、控制器来划分: M:Model,模型层,指工程中的JavaBean,作用是处理数据 JavaBean分为两类: 一类称为数据承载Bean…...
android使用ndk开发
ndk ndk sdk要单独下载和android sdk不同 https://developer.android.google.cn/ndk/downloads?hl=zh-cn 解压后添加ndk路径到path即可 gradle gradle下载太慢使用国内镜像 distributionUrl=https://mirrors.cloud.tencent.com/gradle/gradle-6.7.1-all.zip 执行gradlew.ba…...
行为型设计模式——模板方法模式
学习难度:⭐ ,比较常用 模板方法模式 在面向对象程序设计过程中,程序员常常会遇到这种情况:设计一个系统时知道了算法所需的关键步骤,而且确定了这些步骤的执行顺序,但某些步骤的具体实现还未知࿰…...
曲面上偏移命令的查找
今天学习老王的SW绘图时,遇到一个命令找不到,查询了一会终于找到了这个命令,防止自己忘记,特此记录一下,这个命令就是“曲面上偏移”,网上好多的教程都是错误的,实际上这个命令没有在曲面里面&a…...
2026年丝路新程 Python编程(小学组4-6年级)模拟卷(三)以及答案
2026年丝路新程 Python编程(小学组4-6年级)模拟卷(三) 考试时间:60分钟 总分:100 及格分:60 一、单选题 (共15题,每题5分) 1、丝绸之路商队用列表s记录物资,执行以下代码后,列表s的值是什么? for i in range(2): s=[水囊,干粮,茶叶] s.append(药品) A…...
芯祥联MQTT BROKER 各服务器平台部署方法培训-1
BROKER部署方法_哔哩哔哩_bilibili 培训视频请进入B站,谢谢。...
高质量测试 Skill 编写手册 -- 渐进式披露
什么是渐进式披露渐进式披露是高质量 Skill 中最基础也最重要的技巧之一。 用一句话表达就是:不要把所有的规则和知识都一股脑的写在提示词中交给大模型,而是只在必要的时候,加载对应的知识。为什么需要渐进式披露在大模型领域有一句话叫上下…...
170家具身智能公司名单
点击下方卡片,关注“CVer”公众号AI/CV重磅干货,第一时间送达具身智能:人工智能的下一个浪潮!今年再次被写入《政府工作报告》中,已经成为国家未来重点培育产业。市场方面,具身智能近一年融资更是爆火&…...
TVA视觉智能体专栏(四):工业视觉最大痛点:换产必重训、环境必调参?TVA彻底根治
摘要:传统视觉项目换产、改工艺、环境变化后,必须工程师驻场调参、补充样本、重新训练,维护成本极高。本文详解TVA环境自适应能力,无需人工干预,自动适配光影、角度、物料差异,大幅降低产线运维成本。一、工…...
m4s-converter技术解析:跨平台B站缓存视频无损转换方案
m4s-converter技术解析:跨平台B站缓存视频无损转换方案 【免费下载链接】m4s-converter 一个跨平台小工具,将bilibili缓存的m4s格式音视频文件合并成mp4 项目地址: https://gitcode.com/gh_mirrors/m4/m4s-converter m4s-converter是一个专业的开…...
《元创力》纪实录·桥段静默纪元:当叙事成为被审计的风险资产
X54先生叙事前的话:叙事模式:X54先生提供参考角度(可以不选)审查机构事先不对事实审查给了拍摄权和公映权,舆论压力出现,又要倒查,是从一个错误走向另一个错误,这会导致文艺创作者因…...
跟着 MDN 学CSS day_14:(尺寸调整技能测试与实战解析)
在掌握了 CSS 元素尺寸调整的理论知识之后,实际动手练习是检验理解程度的最佳方式。MDN 的"Test your skills: Sizing"这一节提供了三个精心设计的任务,分别覆盖了最小高度与固定高度的区别、百分比宽度与内边距在 border-box 模型下的计算、以…...
5分钟掌握DLSS Swapper:免费开源游戏性能优化神器
5分钟掌握DLSS Swapper:免费开源游戏性能优化神器 【免费下载链接】dlss-swapper 项目地址: https://gitcode.com/GitHub_Trending/dl/dlss-swapper DLSS Swapper是一款专为PC游戏玩家设计的免费开源工具,能够智能管理、下载和替换游戏中的DLSS、…...
实测Taotoken聚合接口在高峰时段的延迟与稳定性表现
🚀 告别海外账号与网络限制!稳定直连全球优质大模型,限时半价接入中。 👉 点击领取海量免费额度 实测Taotoken聚合接口在高峰时段的延迟与稳定性表现 作为开发者,在将大模型能力集成到生产环境时,服务的稳…...
