Django-allauth进行第三方登录

首先

注意我的django是2.2版本,所以其他版本可能会在某些地方报错。

开始

创建项目,创建app,修改settings。
修改

LANGUAGE_CODE = 'zh-Hans'

TIME_ZONE = 'Asia/Shanghai'

增加静态文件和媒体的处理

STATIC_ROOT = os.path.join(BASE_DIR, 'static')
MEDIA_URL = '/media/'
MEDIA_ROOT = os.path.join(BASE_DIR,'media/')

STATICFILES_DIRS可要可不要
修改数据库为mysql

DATABASES = {
    'default': {
    'ENGINE': 'django.db.backends.mysql',
    'NAME': 'database',
    'USER': 'username',
    'PASSWORD': 'password',
    'HOST': 'localhost',
    'PORT': '3306',
    }
}

用户登录注册认证系统

这里推荐一个django-allauth,直接pip安装即可,是一个app,集成了用户的登录,注册,第三方登录等等的功能,官方文档,事实上官方文档写的很清楚,可以自己去查看。
安装如下:
settings中添加

#allauth
AUTHENTICATION_BACKENDS = (
    'django.contrib.auth.backends.ModelBackend',
    'allauth.account.auth_backends.AuthenticationBackend',
)

app安装如下:

INSTALLED_APPS = [
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
    #allauth
    'django.contrib.sites',
    'allauth',
    'allauth.account',
    'allauth.socialaccount',
    'allauth.socialaccount.providers.github',
]
SITE_ID = 2

site_id是之后在后台添加站点的id,它默认会有一个example.com,具体我忘记是1还是2了,你可以查看自己的数据库查看localhost的id。
然后再添加

ACCOUNT_AUTHENTICATION_METHOD (="username" | "email" | "username_email"):指定要使用的登录方法(用户名、电子邮件地址或两者之一)

ACCOUNT_EMAIL_CONFIRMATION_EXPIRE_DAYS (=3):邮件确认邮件的截止日期(天数)

ACCOUNT_EMAIL_VERIFICATION (="optional"):注册中邮件验证方法:“强制(mandatory)”,“可选(optional)”或“否(none)”之一

ACCOUNT_EMAIL_CONFIRMATION_COOLDOWN (=180):邮件发送后的冷却时间(以秒为单位)

ACCOUNT_LOGIN_ATTEMPTS_LIMIT (=5):登录尝试失败的次数

ACCOUNT_LOGIN_ATTEMPTS_TIMEOUT (=300):从上次失败的登录尝试,用户被禁止尝试登录的持续时间

ACCOUNT_LOGIN_ON_EMAIL_CONFIRMATION (=False):更改为True,用户一旦确认他们的电子邮件地址,就会自动登录

ACCOUNT_LOGOUT_ON_PASSWORD_CHANGE (=False):更改或设置密码后是否自动退出

ACCOUNT_LOGIN_ON_PASSWORD_RESET (=False):更改为True,用户将在重置密码后自动登录

ACCOUNT_SESSION_REMEMBER (=None):控制会话的生命周期,可选项还有:False,True

ACCOUNT_SIGNUP_EMAIL_ENTER_TWICE (=False):用户注册时是否需要输入邮箱两遍

ACCOUNT_SIGNUP_PASSWORD_ENTER_TWICE (=True): 用户注册时是否需要用户输入两遍密码

ACCOUNT_USERNAME_BLACKLIST (=[]):用户不能使用的用户名列表

ACCOUNT_UNIQUE_EMAIL (=True): 加强电子邮件地址的唯一性

ACCOUNT_USERNAME_MIN_LENGTH (=1):用户名允许的最小长度的整数

SOCIALACCOUNT_AUTO_SIGNUP (=True):使用从社会帐户提供者检索的字段(如用户名、邮件)来绕过注册表单

LOGIN_REDIRECT_URL (="/") 设置登录后跳转链接

ACCOUNT_LOGOUT_REDIRECT_URL (="/") 设置退出登录后跳转链接

我按需求添加了这些:

LOGIN_REDIRECT_URL = '/'
ACCOUNT_AUTHENTICATION_METHOD = 'username_email'
ACCOUNT_EMAIL_REQUIRED = True
ACCOUNT_EMAIL_CONFIRMATION_COOLDOWN=180
ACCOUNT_LOGIN_ATTEMPTS_LIMIT=5
ACCOUNT_LOGIN_ATTEMPTS_TIMEOUT=300
ACCOUNT_EMAIL_VERIFICATION="mandatory"
ACCOUNT_UNIQUE_EMAIL=True
ACCOUNT_SESSION_REMEMBER=True

然后是注册功能时的邮箱发送,可以选用我们的QQ邮箱,163等等的邮箱,这里仅给出QQ邮箱的demo。

#邮箱
EMAIL_HOST = 'smtp.qq.com'
EMAIL_PORT = 25
EMAIL_HOST_USER = 'xxxx@qq.com' # 你的 QQ 账号和授权码
EMAIL_HOST_PASSWORD = 'xxxxx'#注意这里并不是你的qq密码,而是QQ邮箱里面的一个POP3/IMAP开启后系统发送给你的一串东西,具体怎么用就去网上搜吧
EMAIL_USE_TLS = True    #这里必须是 True,否则发送不成功
EMAIL_FROM = 'xxxx@qq.com' # 你的 QQ 账号
DEFAULT_FROM_EMAIL = 'xxxx@qq.com'

从中选择性添加即可,这一份我不知道来源了,但是摘抄自某篇文章中的,文档中也有纯英版的。
这里第三方登录我选择了github,因为其他如微信百度等也差不多类似的做法,去他们对应的开发者平台获取key即可。
项目的urls添加这一项:

from django.contrib import admin
from django.urls import path,include
from django.conf.urls.static import static
from django.conf import settings
from django.conf.urls import url
urlpatterns = [
    ...
    path('accounts/', include('allauth.urls')),
    ...
]
urlpatterns += static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT)

万事俱备,就差migrate了,migrate完成后,可以查看数据库会发现多了好多个表,这里介绍一下allauth注册之后的账号都是在我们django默认的user表内的,也就是说django提供的关于user的方法我们都可以使用。之后就是创建超级用户,然后python manage.py runserver
到这里可能进入后台会报错,需要修改
venv\lib\site-packages\django\views\debug.py文件下第332行
改为:
with Path(CURRENT_DIR, 'templates', 'technical_500.html').open(encoding="utf-8") as fh
具体为什么报错我找不出原因,但若换用最新版本2.2.3好像又不会了。
进入后台后在站点项添加本地local host或你将来的域名,然后把settings的id就可以改为2了。
https://github.com/settings/applications/new进入GitHub获取,注意callback在文档中有标注:
http://127.0.0.1:8000/accounts/twitter/login/callback/,把twitter换成你所需即可。
填写social application 之后保存然后把我们的账号在后台管理中注销掉,输入http://127.0.0.1:8000/accounts/login访问登录界面,尝试github登录即可,第三方登录还需要进行注册账号,此时账号会与第三方账号绑定,之后只需要通过第三方即可登陆,读者可自行尝试其他provider的登陆,微信方面好像挺麻烦的。反正大概就是到其开发者平台获取key,然后填写callback,然后到我们的后台添加application即可。
若是觉得它提供的登陆界面太丑,你可以在自己的app下创建一个template,然后创建account,创建login.html,然后自己动手吧!!
欢迎访问我的博客www.redmango.top

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容