用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 socket.error: [Errno 98] Address already in use的原因和解决方法
Aug 25 Python
Python爬虫番外篇之Cookie和Session详解
Dec 27 Python
浅谈Scrapy框架普通反爬虫机制的应对策略
Dec 28 Python
PyQt5实现无边框窗口的标题拖动和窗口缩放
Apr 19 Python
Python实现正则表达式匹配任意的邮箱方法
Dec 20 Python
从0开始的Python学习016异常
Apr 08 Python
python set内置函数的具体使用
Jul 02 Python
Python之数据序列化(json、pickle、shelve)详解
Aug 30 Python
python3操作注册表的方法(Url protocol)
Feb 05 Python
Numpy(Pandas)删除全为零的列的方法
Sep 11 Python
Python threading模块condition原理及运行流程详解
Oct 05 Python
Pandas数据结构之Series的使用
Mar 31 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
生成缩略图
2006/10/09 PHP
laravel 5异常错误:FatalErrorException in Handler.php line 38的解决
2017/10/12 PHP
PHP生成随机码的思路与方法实例探索
2019/04/11 PHP
JS event使用方法详解
2008/04/28 Javascript
json简单介绍
2008/06/10 Javascript
flash 得到自身url参数的代码
2009/11/15 Javascript
动态加载js、css等文件跨iframe实现
2014/02/24 Javascript
JavaScript提高网站性能优化的建议(二)
2016/07/24 Javascript
js下拉菜单生成器dropMenu使用方法详解
2017/08/01 Javascript
移动前端图片压缩上传的实例
2017/12/06 Javascript
如何将百度地图包装成Vue的组件的方法步骤
2019/02/12 Javascript
微信小程序中网络请求缓存的解决方法
2019/12/29 Javascript
基于canvas实现手写签名(vue)
2020/05/21 Javascript
element中Steps步骤条和Tabs标签页关联的解决
2020/12/08 Javascript
Python排序搜索基本算法之选择排序实例分析
2017/12/09 Python
Python编程二分法实现冒泡算法+快速排序代码示例
2018/01/15 Python
TensorFLow用Saver保存和恢复变量
2018/03/10 Python
图解Python变量与赋值
2018/04/03 Python
python Pandas 读取txt表格的实例
2018/04/29 Python
Python3读取Excel数据存入MySQL的方法
2018/05/04 Python
Pytorch 计算误判率,计算准确率,计算召回率的例子
2020/01/18 Python
python使用turtle库绘制奥运五环
2020/02/24 Python
Python+Appium实现自动化测试的使用步骤
2020/03/24 Python
python简单实现插入排序实例代码
2020/12/16 Python
struct和class的区别
2015/11/20 面试题
公司业务主管岗位职责
2013/12/07 职场文书
校园招聘策划书
2014/01/09 职场文书
父母对孩子的寄语
2014/04/09 职场文书
中专生自荐信
2014/06/25 职场文书
人事代理委托书
2014/09/27 职场文书
个人作风建设总结
2014/10/23 职场文书
初中家长评语大全
2014/12/26 职场文书
银行资信证明
2015/06/17 职场文书
分享15个Webpack实用的插件!!!
2021/03/31 Javascript
python三子棋游戏
2022/05/04 Python
全网非常详细的pytest配置文件
2022/07/15 Python