使用django-allauth进行登录功能的实现

以下是上一次的延续。
http://qiita.com/yukidallas/items/9cd0ca5cda7f459533c3

django-allauth –> Django的全套认证

这个库可在Django应用程序中轻松实现社交登录。请访问https://github.com/pennersr/django-allauth查看。

目前似乎支持以下的社交媒体登录方式。

    • Amazon (OAuth2)

 

    • AngelList (OAuth2)

 

    • Bitly (OAuth2)

 

    • Dropbox (OAuth)

 

    • Facebook (both OAuth2 and JS SDK)

 

    • Feedly (OAuth2)

 

    • Github (OAuth2)

 

    • Google (OAuth2)

 

    • Instagram (OAuth2)

 

    • LinkedIn (OAuth, OAuth2)

 

    • OpenId

 

    • Paypal (OAuth2)

 

    • Persona

 

    • SoundCloud (OAuth2)

 

    • Stack Exchange (OAuth2)

 

    • Twitch (OAuth2)

 

    • Twitter (OAuth)

 

    • Vimeo (OAuth)

 

    • VK (OAuth2)

 

    Weibo (OAuth2)

安装

在requirements.txt文件中添加django-allauth,并执行pip install命令。

django==1.11
django-allauth==0.31.0 # 追加
django-extensions==1.7.8
mysqlclient==1.3.10

pip install -r requirements.txt -t libs

通过电子邮件地址进行注册/登录

在 INSTALLED_APPS 中添加了 django admin 和 allauth。

INSTALLED_APPS = [
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.messages',
    'django.contrib.sessions',
    'django.contrib.staticfiles',
    'django.contrib.sites',
    'django_extensions',

    'allauth',
    'allauth.account'
]

AUTHENTICATION_BACKENDS = [
   'allauth.account.auth_backends.AuthenticationBackend'
]

我将创建用于注册/登录视图的View类。

from allauth.account import views


class SigninView(views.LoginView):
    template_name = 'signin/index.html'

    def dispatch(self, request, *args, **kwargs):
        response = super(SigninView, self).dispatch(request, *args, **kwargs)
        return response

    def form_valid(self, form):
      return super(SigninView, self).form_valid(form)

signin_view = SigninView.as_view()


class SignupView(views.SignupView):
    template_name = 'signup/index.html'

    def get_context_data(self, **kwargs):
        context = super(SignupView, self).get_context_data(**kwargs)
        return context

signup_view = SignupView.as_view()

我会创建一个对应的模板。
allauth中也有默认模板,但大多数情况下都需要自定义,因此我另外准备了一个模板。
我复制了allauth库中的代码。

{% block content %}
<form method="post" action="{% url 'account_login' %}">
{% csrf_token %}
{{form.as_p}}
<button type="submit">Sign In</button>
</form>
{% endblock %}

{% block content %}
<form method="post" action="{% url 'account_signup' %}">
  {% csrf_token %}
  {{ form.as_p }}
  {% if redirect_field_value %}
  <input type="hidden" name="{{ redirect_field_name }}" value="{{ redirect_field_value }}" />
  {% endif %}
  <button type="submit">Signup</button>
</form>
{% endblock %}

添加路由。

urlpatterns = [
  url(r'^$', views.home_view),
  url(r'^auth/', include('allauth.urls')),
  url(r'^signin/?$', views.signin_view),
  url(r'^signup/?$', views.signup_view),
]

通过访问 http://localhost:8000/signup 进行用户注册,然后可以通过访问 http://localhost:8000/signin 进行登录。

因此,我們需要添加”View”和路由以進行登出。

from django.shortcuts import redirect


class SignoutView(views.LogoutView):

    def get(self, *args, **kwargs):
        return self.post(*args, **kwargs)

    def post(self, *args, **kwargs):
        if self.request.user.is_authenticated():
            self.logout()
        return redirect('/')

signout_view = SignoutView.as_view()
urlpatterns = [
  # {...}
  url(r'^signout/?$', views.signout_view)
]

可以通过 http://localhost:8000/signout 来实现退出登录的功能。

通过Twitter账号在社交媒体上进行登录

这次我们将实现在Twitter上的社交登录。请事先在Twitter开发者平台上创建一个应用程序。似乎必须要先绑定手机号才能进行操作。
https://apps.twitter.com

创建新的应用程序 → 输入应用程序详细信息。
请将以下内容设置为回调URL的值。

http://localhost:8000/auth/twitter/login/callback/

我們將在Django端逐步添加關於allauth的設定。

INSTALLED_APPS = [
    # {...}
    'allauth.socialaccount',
    'allauth.socialaccount.providers.twitter'
]

添加用于访问Django管理界面的路由。

# {...}
from django.contrib import admin
admin.autodiscover()

urlpatterns = [
  # {...}
  url(r'^admin/', include(admin.site.urls))
]

创建一个用于登录管理界面的账户。

$ python manage.py createsuperuser

访问 http://localhost:8000/admin,并进行登录。

访问社交应用程序并进行各种设置。

    • Providor → Twitter

 

    • Name → Twitter

 

    • Client id → {Your Consumer Key (API Key)}

 

    • Secret key → {Your Consumer Secret (API Secret)}

 

    Sites → Chosen sitesにexample.comを追加

保存后,您可以从管理页面注销,并访问http://localhost:8000/auth/twitter/login/,然后跳转到Twitter联合登录页面,以进行SNS登录(注册)。

如果想在画面上添加链接,请按照以下方式进行。

<a href="/auth/twitter/login/">Twitterでログイン</a>
<!-- または -->
<a href="{% url 'twitter_login' %}">Twitterでログイン</a>

如果你想确认路由相关信息,就像 Rails routes 那样,你可以使用以下命令。(django-extensions)

$ python manage.py show_urls

# 省略
/auth/twitter/login/    allauth.socialaccount.providers.oauth.views.view    twitter_login   
/auth/twitter/login/callback/   allauth.socialaccount.providers.oauth.views.view    twitter_callback

要根据登录与否进行条件判断,可以按照以下方式操作。

{% if user.is_authenticated %}
<p>こんにちは {{ user.username }}さん</p>
{% else %}
<p>ログインしてください</p>
{% endif %}

额外赠品

您可以自由地定制用于登录的模型。

$ cd ./django-sample/django-sample
$ python ../manage.py startapp accounts
INSTALLED_APPS = [
     # {...}
    'django-sample.accounts'
]
from django.db import models
from django.contrib.auth.models import AbstractUser, UserManager


class User(AbstractUser):
    objects = UserManager()

    class Meta(object):
        app_label = 'accounts'
AUTH_USER_MODEL = 'accounts.User'

进行数据库迁移。
如果使用迁移命令失败,可能需要先删除数据库然后重新开始。

$ python manage.py makemigrations
$ python manage.py migrate

最后

我在GitHub上放了源代码(已更新上一次的内容)。
https://github.com/yukidallas/django-sample

bannerAds