用django-allauth实现第三方登录的示例代码


Posted in Python onJune 24, 2019

现在我们已经拥有一个可以进行用户本地登录的博客系统了。如果有人欣赏你的文章,说不定就会注册成为本地用户,并和你好好交流一番。

但头疼的是,用户可能每天都在互联网上浏览很多非常棒的博客,如果每个博客都要去注册才能评论,对用户是个不小的负担。对个人博客这类草根网站,说不定用户就懒得去注册了,你也就损失了一个潜在的”粉丝“。

比较流行的解决方案是允许用户通过第三方登录,即可以通过GitHub、微博这类知名社区的授权,从而登录你的小站,免去了注册的麻烦。

本章会介绍一个强大的库:Django-allauth,它不仅包含一整套的本地注册、登录、管理的解决方案,还支持GitHub、Twitter、微博、微信甚至百度等几十种第三方登录方式,真的是当爹又当妈啊...

本地登录

先看看django-allauth的本地登录如何配置。

安装django-allauth

(env) > pip install django-allauth

修改配置文件:

my_blog/settings.py

...


TEMPLATES = [
  {
    ...
    'OPTIONS': {
      'context_processors': [
        # allauth 启动必须项
        'django.template.context_processors.request',
      ],
    },
  },
]


AUTHENTICATION_BACKENDS = (
  # Django 后台可独立于 allauth 登录
  'django.contrib.auth.backends.ModelBackend',

  # 配置 allauth 独有的认证方法,如 email 登录
  'allauth.account.auth_backends.AuthenticationBackend',
)


INSTALLED_APPS = [
  ...
  # allauth 启动必须项
  'django.contrib.auth',
  'django.contrib.messages',
  'django.contrib.sites',

  'allauth',
  'allauth.account',
  'allauth.socialaccount',
  
  # 可添加需要的第三方登录
  'allauth.socialaccount.providers.github',
  'allauth.socialaccount.providers.weibo',
  ...
]

# 设置站点
SITE_ID = 1

# 登录成功后重定向地址
LOGIN_REDIRECT_URL = '/article/article-list'

...

注意上面的配置中,有的内容是创建项目时本来就有的,检查一下你的项目中是否包含;有的内容是完全新增的,不要漏掉了。

django-allauth也是一个app,因此需要分配给它url

my_blog/urls.py

...

urlpatterns = [
  ...
  path('accounts/', include('allauth.urls')),
  ...
]

最后一步是迁移数据:

(env) > python manage.py migrate

这就完成了!

输入django-allauth的默认登录页面地址:

http://127.0.0.1:8000/accounts/login/

显示页面如下:

用django-allauth实现第三方登录的示例代码

设置网站首页

教程到现在,我们的博客都还没有分配首页地址。

博客网站的首页通常就是文章列表本身,因此把这个路由添加到my_blog/urls.py中:

my_blog/urls.py

...
from article.views import article_list

urlpatterns = [
  # home
  path('', article_list, name='home'),
  ...
]
...

再把登录成功后的重定向地址改过来:

my_blog/settings.py

...
# 重定向 url
#LOGIN_REDIRECT_URL = '/article/article-list'
LOGIN_REDIRECT_URL = '/'

这样就拥有地址为http://127.0.0.1:8000首页啦。

美化模板

django-allauth自带的模板是简陋的,需要覆写为自己网站的风格才能使用。

还记得我们一直在使用的虚拟环境吗?没错,所有项目运行所需的第三方库都是保存在虚拟环境的文件夹中的,在本教程中也就是env文件夹了。找到下面的路径:

env\Lib\site-packages\allauth\templates\account\login.html

这个login.html就是原始的登录模板文件了。虽然可以直接修改这个文件来优化页面,但是这样做是很蠢的,因为每当你升级库、或者换台电脑部署时,模板又恢复回去了。

正确的做法是复制这个login.html到你自己项目的templates文件夹中去。即你需要在项目中创建一个完全相同的路径:

templates\account\login.html

Django会优先在项目中寻找模板文件,因此只要相对路径相同,则可以达到覆写的目的。

接下来就可以愉快的定制风格了。

参考代码如下:

templates\account\login.html


{% extends "base.html" %}
{% load i18n %}
{% load account socialaccount %}
{% block title %}登录{% endblock %}

{% block content %}
<div class="container">
  <div class="row">
    <div class="col-12">
      <br>
      {% get_providers as socialaccount_providers %}
      {% if socialaccount_providers %}
      <p>
        {% blocktrans with site.name as site_name %}请登录已有本地账号或<a href="{{ signup_url }}">注册</a>新账号。
        也可以通过第三方登录:{% endblocktrans %}
      </p>

      <div class="socialaccount_ballot">
        <h5 class="mb-2 mt-4">第三方登录:</h5>
        <ul class="socialaccount_providers">
         {% include "socialaccount/snippets/provider_list.html" with process="login" %}
        </ul>
        <h5 class="mb-2 mt-4">本地登录:</h5>
      </div>

      {% include "socialaccount/snippets/login_extra.html" %}

      {% else %}
      <p>{% blocktrans %}If you have not created an account yet, then please
      <a href="{{ signup_url }}">sign up</a> first.{% endblocktrans %}</p>
      {% endif %}
      <div class="col-6">
        <form class="login" id="login_form" method="POST" action="{% url 'account_login' %}">
          {% csrf_token %}
          <div class="form-group">
            <label for="id_login">账号: </label>
            <input type="text" name="login" placeholder="请输入用户名或Email" autofocus="autofocus" required
              id="id_login" class="form-control" />
            <small class="form-text text-muted ml-1">
              还没有账号?
              <a href="{% url 'account_signup' %}" style="color: cornflowerblue; ">
                注册新账号
              </a>
            </small>
          </div>
          <div class="form-group mb-1">
            <label for="id_password">
              密码:
            </label>
            <input type="password" name="password" placeholder="请输入密码" required id="id_password"
              class="form-control" />
            <small class="form-text text-muted ml-1">
              <a class="secondaryAction layui-text" href="{% url 'account_reset_password' %}">
                忘记密码?
              </a>
            </small>
          </div>
          <div class="custom-control custom-checkbox mb-2">
            <input type="checkbox" name="remember" id="id_remember" checked class="custom-control-input" />
            <label for="id_remember" class="custom-control-label">
              保持登录
            </label>
          </div>
          <button class="primaryAction btn btn-primary" type="submit" hidden id="submit_login">确认</button>
          <button class="primaryAction btn btn-primary" type="button" id="on_submit_login">确认</button>
        </form>
      </div>
    </div>
  </div>
</div>
{% endblock %}

实际效果如下:

用django-allauth实现第三方登录的示例代码

除了登录页面以外,其他的所有页面,如注册、邮箱认证页面及邮件、第三方登录页面等都可以用这种方法进行覆写。教程中就不再赘述,读者请自行尝试。

注册

接下来看看注册页面。

点击注册按钮,则看到如下页面:

用django-allauth实现第三方登录的示例代码

需要注意的是邮箱这一项如果你填了,那么站点会自动向填写的邮箱发送认证邮件。因此前面章节中讲过的关于邮箱的配置一定要正确,否则就会得到一个ConnectionRefusedError的错误。相关的配置项如下:

my_blog/settings.py

# SMTP服务器
EMAIL_HOST = 'your smtp'
# 邮箱名
EMAIL_HOST_USER = 'your email'
# 邮箱密码
EMAIL_HOST_PASSWORD = 'your password'
# 发送邮件的端口
EMAIL_PORT = 25
# 是否使用 TLS
EMAIL_USE_TLS = True
# 默认的发件人
DEFAULT_FROM_EMAIL = 'your email'

记得修改为你自己的邮箱配置。

另外需要注意的是django-allauth所注册的账号与django内置的本地账号是通用的,也就是说通过内置User创建的账号,是可以通过django-allauth登录的。

有了django-allauth,之前教程中写的用户登录、注册以及密码重置模块统统都可以不要了。那既然如此,博主绕了这么大个弯不是坑人吗?这个嘛,学习就是要变着法折腾..

GitHub登录

搞定了本地登录,接下来的第三方登录才是重点。

由于GitHub的第三方登录是最容易的,因此作为例子来讲解。

作为合格的程序员,怎么能没有GitHub账号!

GitHub注册OAuth

创建第三方登录的第一步,是需要在GitHub网站上创建OAuth应用。登录GitHub账号,然后进入地址:

https://github.com/settings/applications/new

不排除以后这个地址会变,如果不对就麻烦读者在个人主页的settings里找一找OAuth的设置了。

进入页面后,填写一下内容:

用django-allauth实现第三方登录的示例代码

填写的是本地IP,以后部署在线上再修改成实际的域名。

注意callback URL填写的内容。点击确定后,就得到了应用的信息:

用django-allauth实现第三方登录的示例代码

其中的Client IDClient Secret就是要用到的凭证。

Django后台配置

然后对Django后台进行设置。

进入后台,你会发现多了几个栏目:

用django-allauth实现第三方登录的示例代码

打开Sites,将example.com修改为博客域名。开发时则修改为本地IP:

用django-allauth实现第三方登录的示例代码

然后进入Social applications,添加一条applications如下:

用django-allauth实现第三方登录的示例代码

注意最下面的Sites栏一定要把刚才添加的站点选择到右边去。

回到django-allauth的登录页面,点击github登录:

用django-allauth实现第三方登录的示例代码

实现了GitHub登录。

allauth配置项

挑几个比较重要的讲一下。

ACCOUNT_EMAIL_VERIFICATION = 'optional' / 'mandatory' / 'none':当其为mandatory时,本地注册的用户必须先验证邮箱才可以登录。optionalnone都不要求验证邮箱,区别是optional仍然会发送验证邮件,而none连认证邮件都不会发送。

SOCIALACCOUNT_EMAIL_VERIFICATION = 'optional' / 'mandatory' / 'none':同理,但是作用于第三方账号的注册。

ACCOUNT_AUTHENTICATION_METHOD = 'username_email' / 'user' / 'email':指定登录方法,即通过用户名、邮箱进行登录,或者两者均可。

ACCOUNT_EMAIL_REQUIRED = True / False:注册本地用户时,是否必须填写邮箱。

除此之外还有很多配置项,详细了解请查阅官方文档。

总结

本章学习了通过django-allauth实现本地及GitHub登录的功能。微博、微信的登录方式大致都遵循这个流程;本章虽然加载了微博的接口,但是限于篇幅并没有配置,请读者查阅官方文档去实现。需要注意的是国内的第三方登录多半需要一两天时间去申请、审核,要更加麻烦一些。

另外还剩下写入口、删除旧功能等收尾工作,就交给读者自己去完成了。

提示一下,登录的逆向解析地址为{% url 'account_login' %},注册为{% url 'account_signup' %}。这些在原始模板文件或官方网站都能查到。

项目完整代码:Django_blog_tutorial

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Python 相关文章推荐
python实现的jpg格式图片修复代码
Apr 21 Python
Python查找两个有序列表中位数的方法【基于归并算法】
Apr 20 Python
python数字图像处理之高级形态学处理
Apr 27 Python
利用python开发app实战的方法
Jul 09 Python
python3.6+selenium实现操作Frame中的页面元素
Jul 16 Python
Flask框架单例模式实现方法详解
Jul 31 Python
基于Keras中Conv1D和Conv2D的区别说明
Jun 19 Python
keras的load_model实现加载含有参数的自定义模型
Jun 22 Python
python操作微信自动发消息的实现(微信聊天机器人)
Jul 14 Python
Python如何解除一个装饰器
Aug 07 Python
Django项目如何获得SSL证书与配置HTTPS
Apr 30 Python
Python+OpenCV实现图片中的圆形检测
Apr 07 Python
python导入pandas具体步骤方法
Jun 23 #Python
python数据挖掘需要学的内容
Jun 23 #Python
python中字符串数组逆序排列方法总结
Jun 23 #Python
一篇文章弄懂Python中所有数组数据类型
Jun 23 #Python
python程序快速缩进多行代码方法总结
Jun 23 #Python
python函数与方法的区别总结
Jun 23 #Python
python中的单引号双引号区别知识点总结
Jun 23 #Python
You might like
百事可乐也出咖啡了 双倍咖啡因双倍快乐
2021/03/03 咖啡文化
thinkphp实现多语言功能(语言包)
2014/03/04 PHP
codeigniter上传图片不能正确识别图片类型问题解决方法
2014/07/25 PHP
php简单判断文本编码的方法
2015/07/30 PHP
thinkPHP实现将excel导入到数据库中的方法
2016/04/22 PHP
jquery $(document).ready() 与window.onload的区别
2009/12/28 Javascript
javascript 密码强度验证规则、打分、验证(给出前端代码,后端代码可根据强度规则翻译)
2010/05/18 Javascript
js新闻滚动 js如何实现新闻滚动效果
2013/01/07 Javascript
导航跟随滚动条置顶移动示例代码
2013/09/11 Javascript
toggle()隐藏问题的解决方法
2014/02/17 Javascript
Firefox下无法正常显示年份的解决方法
2014/09/04 Javascript
js计算德州扑克牌面值的方法
2015/03/04 Javascript
jQuery标签编辑插件Tagit使用指南
2015/04/21 Javascript
2016年最热门的15 款代码语法高亮工具,美化你的代码
2016/01/06 Javascript
javascript之IE版本检测超简单方法
2016/08/20 Javascript
微信小程序中使用自定义图标(阿里icon)的方法
2018/08/20 Javascript
实例分析Array.from(arr)与[...arr]到底有何不同
2019/04/09 Javascript
7个好用的JavaScript技巧分享(译)
2019/05/07 Javascript
layer父页获取弹出层输入框里面的值方法
2019/09/02 Javascript
layui富文本编辑器前端无法取值的解决方法
2019/09/18 Javascript
Python检测网站链接是否已存在
2016/04/07 Python
Python使用sftp实现上传和下载功能(实例代码)
2017/03/14 Python
Python基于jieba库进行简单分词及词云功能实现方法
2018/06/16 Python
Python 16进制与中文相互转换的实现方法
2018/07/09 Python
Python后台开发Django会话控制的实现
2019/04/15 Python
python绘制无向图度分布曲线示例
2019/11/22 Python
Pandas时间序列:重采样及频率转换方式
2019/12/26 Python
pyx文件 生成pyd 文件用于 cython调用的实现
2021/03/04 Python
RealTek面试题
2016/06/28 面试题
幼儿园长自我鉴定
2013/10/17 职场文书
人力资源经理自我评价
2014/01/04 职场文书
新闻传播专业求职信
2014/07/22 职场文书
万能检讨书开头与结尾怎么写
2015/02/17 职场文书
2015年销售助理工作总结
2015/05/11 职场文书
采购部年度工作总结
2015/08/13 职场文书
zabbix监控mysql的实例方法
2021/06/02 MySQL