使用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