信阳市两学一做网站,基于node网站毕设代做,国际国内热点新闻事件,郑州英语网站建设教程#xff1a;在Django中实现微信授权登录
本教程将引导您如何在Django项目中实现微信授权登录。在本教程中#xff0c;我们将使用自定义的用户模型User#xff0c;并通过微信提供的API来进行用户认证。
在进行以下教程之前#xff0c;请确保你已经在微信开放平台添加了…教程在Django中实现微信授权登录
本教程将引导您如何在Django项目中实现微信授权登录。在本教程中我们将使用自定义的用户模型User并通过微信提供的API来进行用户认证。
在进行以下教程之前请确保你已经在微信开放平台添加了网站应用并获得了
1.WECHAT_APPID
2.WECHAT_SECRET
3.以及设置了回调域即认证的网址
WECHAT_REDIRECT_URI 比如我的回调域就是https://www.xxx.comDjango的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_length128, uniqueTrue, nullTrue, blankTrue)username models.CharField(max_length150, nullTrue, uniqueTrue)# 不需要再次声明password字段因为AbstractUser类已经包含了password字段# email字段已在AbstractUser中定义只需指定null和blank即可email models.EmailField(nullTrue, blankTrue)phone_number models.CharField(max_length15, nullTrue, blankTrue)real_name models.CharField(max_length128, nullTrue, blankTrue)creation_date models.DateTimeField(auto_now_addTrue)role_type models.CharField(max_length50, nullTrue, blankTrue)avatar models.URLField(nullTrue, blankTrue)gender models.CharField(max_length10, nullTrue, blankTrue)birthday models.DateField(nullTrue, blankTrue)address models.CharField(max_length255, nullTrue, blankTrue)# 新增加的微信字段nickname models.CharField(max_length64, nullTrue, blankTrue)sex models.PositiveSmallIntegerField(choices((0, 未知), (1, 男), (2, 女)), nullTrue, blankTrue)language models.CharField(max_length32, nullTrue, blankTrue)city models.CharField(max_length32, nullTrue, blankTrue)province models.CharField(max_length32, nullTrue, blankTrue)country models.CharField(max_length32, nullTrue, blankTrue)headimgurl models.URLField(nullTrue, blankTrue)privilege models.JSONField(defaultlist, blankTrue, nullTrue) # 使用可调用的默认值unionid models.CharField(max_length128, nullTrue, blankTrue)# 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(openidwechat_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 fhttps://open.weixin.qq.com/connect/qrconnect?appid{appid}redirect_uri{redirect_uri}response_typecodescopesnsapi_loginstateSTATE#wechat_redirectreturn 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 fhttps://api.weixin.qq.com/sns/oauth2/access_token?appid{appid}secret{secret}code{code}grant_typeauthorization_coderesponse requests.get(url)data response.json()access_token data.get(access_token)openid data.get(openid)url fhttps://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.AuthenticationBackenduser.backend backend # 设置用户实例的后端属性login(request, user, backendbackend) # 登录用户传入backend参数# 这里我随便写了一个url名称return redirect(bbworld)第4步配置URLs
在urls.py中将路径与视图关联起来
from django.urls import path
from . import viewsurlpatterns [path(login/, views.user_login, nameuser_login),path(logout/, views.logout_view, namelogout),path(wechat/callback/, views.wechat_login_callback, namewechat_callback),# 其他URLs...
]第5步使用login_required装饰器保护视图
在任何需要用户登录的视图前使用login_required装饰器
from django.shortcuts import render
from django.contrib.auth.decorators import login_requiredlogin_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中实现微信授权登录的基本步骤。
因为这个事情花了我很多时间我也希望你能通过我的教程快速完成业务如果有不清楚的欢迎留言咨询我会第一时间回复谢谢祝你也学习愉快