《Django By Example》第四章 下 中文 翻译 (个人学习,渣翻)

全文链接

第一章 创建一个blog应用
第二章 使用高级特性来增强你的blog
第三章 扩展你的blog应用
第四章上 创建一个社交网站
第四章下 创建一个社交网站
第五章 在你的网站中分享内容
第六章 跟踪用户动作
第七章 建立一个在线商店
第八章 管理付款和订单
第九章上 扩展你的商店
第九章下 扩展你的商店
第十章上 创建一个在线学习平台
第十章下 创建一个在线学习平台
第十一章 缓存内容
第十二章 构建一个API

书籍出处:https://www.packtpub.com/web-development/django-example
原作者:Antonio Melé

2017年1月4日初稿发布

2017年5月5日第一次精校完成(感谢大牛 @kukoo 的精校!)

(译者注:祝大家新年快乐,这次带来《Django By Example》第四章的翻译,这章非常的实用,因为简书的文章内容有长度限制,所以本章分为上下两篇,本篇是第四章下篇,上篇地址http://www.jianshu.com/p/06670f9aa439

用户注册和用户profiles

现有的用户已经可以登录,登出,修改他们的密码,以及当他们忘记密码的时候重置他们的密码。现在,我们需要构建一个视图(view)允许访问者创建他们的账号。

用户注册

让我们创建一个简单的视图(view)允许用户在我们的网站中进行注册。首先,我们需要创建一个表单(form)让用户填写用户名,他们的真实姓名以及密码。编辑account应用新目录下的forms.py文件添加如下代码:

from django.contrib.auth.models import User
class UserRegistrationForm(forms.ModelForm):
    password = forms.CharField(label='Password',
                               widget=forms.PasswordInput)
    password2 = forms.CharField(label='Repeat password',
                                widget=forms.PasswordInput)
    class Meta:
        model = User
        fields = ('username', 'first_name', 'email')
    def clean_password2(self):
        cd = self.cleaned_data
        if cd['password'] != cd['password2']:
            raise forms.ValidationError('Passwords don\'t match.')
        return cd['password2']

我们为User模型(model)创建了一个model表单(form)。在我们的表单(form)中我们只包含了模型(model)中的username,first_name,email字段。这些字段会在它们对应的模型(model)字段上进行验证。例如:如果用户选择了一个已经存在的用户名,将会得到一个验证错误。我们还添加了两个额外的字段passwordpassword2给用户用来填写他们的新密码和确定密码。我们定义了一个clean_password2()方法去检查第二次输入的密码是否和第一次输入的保持一致,如果不一致这个表单将会是无效的。当我们通过调用is_valid()方法验证这个表单(form)时这个检查会被执行。你可以提供一个clean_<fieldname>()方法给任何一个你的表单(form)字段用来清理值或者抛出表单(from)指定的字段的验证错误。表单(forms)还包含了一个clean()方法用来验证表单(form)的所有内容,这对验证需要依赖其他字段的字段是非常有用的。

Django还提供一个UserCreationForm表单(form)给你使用,它位于django.contrib.auth.forms非常类似与我们刚才创建的表单(form)。

编辑account应用中的views.py文件,添加如下代码:

from .forms import LoginForm, UserRegistrationForm
def register(request):
    if request.method == 'POST':
        user_form = UserRegistrationForm(request.POST)
        if user_form.is_valid():
            # Create a new user object but avoid saving it yet
            new_user = user_form.save(commit=False)
            # Set the chosen password
            new_user.set_password(
                user_form.cleaned_data['password'])
            # Save the User object
            new_user.save()
            return render(request,
                         'account/register_done.html',
                         {'new_user': new_user})
    else:
        user_form = UserRegistrationForm()
    return render(request,
                 'account/register.html',
                 {'user_form': user_form})

这个创建用户账号的视图(view)非常简单。为了保护用户的隐私,我们使用User模型(model)的set_password()方法将用户的原密码进行加密后再进行保存操作。

现在,编辑account应用中的urls.py文件,添加如下URL模式:

url(r'^register/$', views.register, name='register'),

最后,创建一个新的模板(template)在account/模板(template)目录下,命名为register.html,为它添加如下代码:

{% extends "base.html" %}
{% block title %}Create an account{% endblock %}
{% block content %}
  <h1>Create an account</h1>
  <p>Please, sign up using the following form:</p>
  <form action="." method="post">
    {{ user_form.as_p }}
    {% csrf_token %}
    <p><input type="submit" value="Create my account"></p>
  </form>
{% endblock %}

在相同的目录中添加一个模板(template)文件命名为register_done.html,为它添加如下代码:

{% extends "base.html" %}
{% block title %}Welcome{% endblock %}
{% block content %}
  <h1>Welcome {{ new_user.first_name }}!</h1>
  <p>Your account has been successfully created. Now you can <a href="{% url "login" %}">log in</a>.</p>
{% endblock %}

现在,在浏览器中打开 http://127.0.0.1:8000/account/register/ 。你会看到你创建的注册页面:

填写用户信息然后点击Create my account按钮。如果所有的字段都验证都过,这个用户将会被创建然后会得到一条成功信息,如下所示:

点击log-in链接输入你的用户名和密码来验证账号是否成功创建。

现在,你还可以添加一个注册链接在你的登录模板(template)中。编辑registration/login.html模板(template)然后替换以下内容:

<p>Please, use the following form to log-in:</p>

为:

<p>Please, use the following form to log-in. If you don't have an account <a href="{% url "register" %}">register here</a></p>

如此,我们就可以从登录页面进入注册页面。

扩展User模型(model)

当你需要处理用户账号,你会发现Django认证(authentication)框架的User模型(model)只适应一般的案例。无论如何,User模型(model)只有一些最基本的字段。你可能希望扩展User模型包含额外的数据。最好的办法就是创建一个profile模型(model)包含所有额外的字段并且和Django的User模型(model)做一对一的关联。

编辑account应用中的model.py文件,添加如下代码:

from django.db import models
from django.conf import settings


class Profile(models.Model):
    user = models.OneToOneField(settings.AUTH_USER_MODEL)
    date_of_birth = models.DateField(blank=True, null=True)
    photo = models.ImageField(upload_to='users/%Y/%m/%d', blank=True)
    
    def __str__(self):
        return 'Profile for user {}'.format(self.user.username)

为了保持你的代码通用化,当需要定义模型(model)和用户模型的关系时,使用get_user_model()方法来取回用户模型(model)并使用AUTH_USER_MODEL设置来引用这个用户模型,替代直接引用auth的User模型(model)。

user一对一字段允许我们关联用户和profiles。photo字段是一个ImageField字段。你需要安装一个Python包来管理图片,使用PIL(Python Imaging Library)或者Pillow(PIL的分叉),在shell中运行一下命令来安装Pillow

pip install Pillow==2.9.0

为了Django能在开发服务中管理用户上传的多媒体文件,在项目setting.py文件中添加如下设置:

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

MEDIA_URL 是管理用户上传的多媒体文件的主URL,MEDIA_ROOT是这些文件在本地保存的路径。我们动态的构建这些路径相对我们的项目路径来确保我们的代码更通用化。

现在,编辑bookmarks项目中的主urls.py文件,修改代码如下所示:

from django.conf.urls import include, url
from django.contrib import admin
from django.conf import settings
from django.conf.urls.static import static


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

if settings.DEBUG:
    urlpatterns += static(settings.MEDIA_URL,
                        document_root=settings.MEDIA_ROOT)

在这种方法中,Django开发服务器将会在开发时改变对多媒体文件的服务。

static()帮助函数最适合在开发环境中使用而不是在生产环境使用。绝对不要在生产环境中使用Django来服务你的静态文件。

打开终端运行以下命令来为新的模型(model)创建数据库迁移:

python manage.py makemigrations

你会获得以下输出:

Migrations for 'account':
    0001_initial.py:
        - Create model Profile

接着,同步数据库通过以下命令:

python manage.py migrate

你会看到包含以下内容的输出:

Applying account.0001_initial... OK

编辑account应用中的admin.py文件,在管理站点注册Profiel模型(model),如下所示:

from django.contrib import admin
from .models import Profile
class ProfileAdmin(admin.ModelAdmin):
    list_display = ['user', 'date_of_birth', 'photo']
admin.site.register(Profile, ProfileAdmin)

使用python manage.py runnserver命令重新运行开发服务。现在,你可以看到Profile模型已经存在你项目中的管理站点中,如下所示:

现在,我们要让用户可以在网站编辑它们的profile。添加如下的模型(model)表单(forms)到account应用中的forms.py文件:

from .models import Profile

class UserEditForm(forms.ModelForm):
    class Meta:
        model = User
        fields = ('first_name', 'last_name', 'email')
        
class ProfileEditForm(forms.ModelForm):
    class Meta:
        model = Profile
        fields = ('date_of_birth', 'photo')

这两个表单(forms)的功能:

  • UserEditForm:允许用户编辑它们的first name,last name, e-mail 这些储存在User模型(model)中的内置字段。
  • ProfileEditForm:允许用户编辑我们存储在定制的Profile模型(model)中的额外数据。用户可以编辑他们的生日数据以及为他们的profile上传一张照片。

编辑account应用中的view.py文件,导入Profile模型(model),如下所示:

from .models import Profile

然后添加如下内容到register视图(view)中的new_user.save()下方:

# Create the user profile
profile = Profile.objects.create(user=new_user)

当用户在我们的站点中注册,我们会创建一个对应的空的profile给他们。你需要在管理站点中为之前创建的用户们一个个手动创建对应的Profile对象。

现在,我们要让用户能够编辑他们的pfofile。添加如下代码到相同文件中:

from .forms import LoginForm, UserRegistrationForm, \
UserEditForm, ProfileEditForm
@login_required
def edit(request):
    if request.method == 'POST':
        user_form = UserEditForm(instance=request.user,
                                data=request.POST)
        profile_form = ProfileEditForm(instance=request.user.profile,
                                        data=request.POST,
                                        files=request.FILES)
        if user_form.is_valid() and profile_form.is_valid():
            user_form.save()
            profile_form.save()
    else:
        user_form = UserEditForm(instance=request.user)
        profile_form = ProfileEditForm(instance=request.user.profile)
    return render(request,
                 'account/edit.html',
                 {'user_form': user_form,
                 'profile_form': profile_form})

我们使用login_required装饰器decorator是因为用户编辑他们的profile必须是认证通过的状态。在这个例子中,我们使用两个模型(model)表单(forms):UserEditForm用来存储数据到内置的User模型(model)中,ProfileEditForm用来存储额外的profile数据。为了验证提交的数据,通过is_valid()方法是否都返回True我们来检查每个表单(forms)。在这个例子中,我们保存两个表单(form)来更新数据库中对应的对象。

account应用中的urls.py文件中添加如下URL模式:

url(r'^edit/$', views.edit, name='edit'),

最后,在templates/account/中创建一个新的模板(template)命名为edit.html,为它添加如下内容:

{% extends "base.html" %}
{% block title %}Edit your account{% endblock %}
{% block content %}
    <h1>Edit your account</h1>
    <p>You can edit your account using the following form:</p>
    <form action="." method="post" enctype="multipart/form-data">
        {{ user_form.as_p }}
        {{ profile_form.as_p }}
        {% csrf_token %}
    <p><input type="submit" value="Save changes"></p>
    </form>
{% endblock %}

我们在表单(form)中包含enctype="multipart/form-data"用来支持文件上传。我们使用一个HTML表单来提交两个表单(forms): user_formprofile_form

注册一个新用户然后打开 http://127.0.0.1:8000/account/edit/。你会看到如下所示页面:

现在,你可以编辑dashboard页面包含编辑profile的页面链接和修改密码的页面链接。打开account/dashboard.html模板(model)替换如下代码:

<p>Welcome to your dashboard.</p>

为:

<p>Welcome to your dashboard. 
You can <a href="{% url "edit" %}">edit your profile</a> 
or <a href="{% url "password_change" %}">change your password</a>.</p>

用户现在可以从他们的dashboard访问编辑他们的profile的表单。

使用一个定制User模型(model)

Django还提供一个方法可以使用你自己定制的模型(model)来替代整个User模型(model)。你自己的用户类需要继承Django的AbstractUser类,这个类提供了一个抽象的模型(model)用来完整执行默认用户。你可访问 https://docs.djangoproject.com/en/1.8/topics/auth/customizing/#substituting-a-custom-user-model来获得这个方法的更多信息。

使用一个定制的用户模型(model)将会带给你很多的灵活性,但是它也可能给一些需要与User模型(model)交互的即插即用的应用集成带来一定的困难。

使用messages框架

当处理用户的操作时,你可能想要通知你的用户关于他们操作的结果。Django有一个内置的messages框架允许你给你的用户显示一次性的提示。messages框架位于django.contrib.messages,当你使用python manage.py startproject命令创建一个新项目的时候,messages框架就被默认包含在settings.py文件中的INSTALLED_APPS中。你会注意到你的设置文件中在MIDDLEWARE_CLASSES设置里包含了一个名为django.contrib.messages.middleware.MessageMiddleware的中间件。messages框架提供了一个简单的方法添加消息给用户。消息被存储在数据库中并且会在用户的下一次请求中展示。你可以在你的视图(views)中导入messages模块来使用消息messages框架,用简单的快捷方式添加新的messages,如下所示:

from django.contrib import messages
messages.error(request, 'Something went wrong')

你可以使用add_message()方法创建新的messages或用以下任意一个快捷方法:

  • success():当操作成功后显示成功的messages
  • info():展示messages
  • warning():某些还没有达到失败的程度但已经包含有失败的风险,警报用
  • error():操作没有成功或者某些事情失败
  • debug():在生产环境中这种messages会移除或者忽略

让我们显示messages给用户。因为messages框架是被项目全局应用,我们可以在主模板(template)给用户展示messages。打开base.html模板(template)在id为header<div>和id为content<div>之间添加如下内容:

{% if messages %}
 <ul class="messages">
   {% for message in messages %}
     <li class="{{ message.tags }}">
    {{ message|safe }}
        <a href="#" class="close"> </a>
     </li>
   {% endfor %}
 </ul>
{% endif %}

messages框架带有一个上下文环境(context)处理器用来添加一个messages变量给请求的上下文环境(context)。所以你可以在模板(template)中使用这个变量用来给用户显示当前的messages。

现在,让我们修改edit视图(view)来使用messages框架。编辑应用中的views.py文件,使edit视图(view)如下所示:

from django.contrib import messages
@login_required
def edit(request):
    if request.method == 'POST':
    # ...
        if user_form.is_valid() and profile_form.is_valid():
            user_form.save()
            profile_form.save()
            messages.success(request, 'Profile updated '\
                                     'successfully')
        else:
            messages.error(request, 'Error updating your profile')
    else:
        user_form = UserEditForm(instance=request.user)
        # ...    

当用户成功的更新他们的profile时我们就添加了一条成功的message,但如果某个表单(form)无效,我们就添加一个错误message。

在浏览器中打开 http://127.0.0.1:8000/account/edit/ 编辑你的profile。当profile更新成功,你会看到如下message:

当表单(form)是无效的,你会看到如下message:

创建一个定制的认证(authentication)后台

Django允许你通过不同的来源进行认证(authentication)。AUTHENTICATION_BACKENDS设置包含了所有的给你的项目的认证(authentication)后台。默认的,这个设置如下所示:

('django.contrib.auth.backends.ModelBackend',)

默认的ModelBackend通过数据库使用django.contrib.auth中的User模型(model)来认证(authentication)用户。这适用于你的大部分项目。当然,你还可以创建定制的后台通过其他的来源例如一个LDAP目录或者其他任何系统来认证你的用户。

你可以通过访问 https://docs.djangoproject.com/en/1.8/topics/auth/customizing/#other-authentication-sources 获得更多的信息关于自定义的认证(authentication)。

当你使用django.contrib.authauthenticate()函数,Django会通过每一个定义在AUTHENTICATION_BACKENDS中的后台一个接一个地尝试认证(authentication)用户,直到其中有一个后台成功的认证该用户才会停止进行认证。只有所有的后台都无法进行用户认证(authentication),他或她才不会在你的站点中通过认证(authentication)。

Django提供了一个简单的方法来定义你自己的认证(authentication)后台。一个认证(authentication)后台就是提供了如下两种方法的一个类:

  • authenticate():将用户信息当成参数,如果用户成功的认证(authentication)就需要返回True,反之,需要返回False
  • get_user():将用户的ID当成参数然后需要返回一个用户对象。

创建一个定制认证(authentication)后台非常容易,就是编写一个Python类实现上面两个方法。我们要创建一个认证(authentication)后台让用户在我们的站点中使用他们e-mail替代他们的用户名来进行认证(authentication)。

在你的account应用中创建一个新的文件命名为authentication.py,为它添加如下代码:

from django.contrib.auth.models import User

class EmailAuthBackend(object):
    """
    Authenticate using e-mail account.
    """
    def authenticate(self, username=None, password=None):
        try:
            user = User.objects.get(email=username)
            if user.check_password(password):
                return user
            return None
        except User.DoesNotExist:
            return None
    def get_user(self, user_id):
        try:
            return User.objects.get(pk=user_id)
        except User.DoesNotExist:
            return None

这是一个简单的认证(authentication)后台。authenticate()方法接收了usernamepassword两个可选参数。我们可以使用不同的参数,但是我们需要使用usernamepassword来确保我们的后台可以立马在认证(authentication)框架视图(views)中工作。以上代码完成了以下工作内容:

  • authenticate():我们尝试通过给予的e-mail地址获取一个用户和使用User模型(model)中内置的check_password()方法来检查密码。这个方法会对给予密码进行哈希化来和数据库中存储的加密密码进行匹配。
  • get_user():我们通过user_id参数获取一个用户。Django使用这个后台来认证用户之后取回User对象放置到持续的用户会话中。

编辑项目中的settings.py文件添加如下设置:

AUTHENTICATION_BACKENDS = (
   'django.contrib.auth.backends.ModelBackend',
   'account.authentication.EmailAuthBackend',
)

我们保留默认的ModelBacked用来保证用户仍然可以通过用户名和密码进行认证,接着我们包含进了我们自己的email-based认证(authentication)后台。现在,在浏览器中打开 http://127.0.0.1:8000/account/login/ 。请记住,Django会对每个后台都尝试进行用户认证(authentication),所以你可以使用用户名或者使用email来进行无缝登录。

AUTHENTICATION_BACKENDS设置中的后台排列顺序。如果相同的认证信息在多个后台都是有效的,Django会停止在第一个成功认证(authentication)通过的后台,不再继续进行认证(authentication)。

为你的站点添加社交认证(authentication)

你可以希望给你的站点添加一些社交认证(authentication)服务,例如 FacebookTwitter或者Google(国内就算了- -|||)。Python-social-auth是一个Python模块提供了简化的处理为你的网站添加社交认证(authentication)。通过使用这个模块,你可以让你的用户使用他们的其他服务的账号来登录你的网站。你可以访问 https://github.com/omab/python-social-auth 得到这个模块的代码。

这个模块自带很多认证(authentication)后台给不同的Python框架,其中就包含Django。

使用pip来安装这个包,打开终端运行如下命令:

pip install python-social-auth==0.2.12

pip install social-auth-app-django (防止出现No module named 'social_django'错误)

安装成功后,我们需要在项目settings.py文件中的INSTALLED_APPS设置中添加social.apps.django_app.default

INSTALLED_APPS = (
    #...
    'social.apps.django_app.default',
)

这个default应用会在Django项目中添加python-social-auth。现在,运行以下命令来同步python-social-auth模型(model)到你的数据库中:

python manage.py migrate

你会看到如下default应用的数据迁移输出:

Applying default.0001_initial... OK
Applying default.0002_add_related_name... OK
Applying default.0003_alter_email_max_length... OK

python-social-auth包含了很多服务的后台。你可以访问 https://python-social-auth.readthedocs.org/en/latest/backends/index.html#supported-backends 看到所有的后台支持。

我们要包含的认证(authentication)后台包括FacebookTwitterGoogle

你需要在你的项目中添加社交登录URL模型。打开bookmarks项目中的主urls.py文件,添加如下URL模型:

url('social-auth/',
    include('social.apps.django_app.urls', namespace='social')),

为了确保社交认证(authentication)可以工作,你还需要配置一个hostname,因为有些服务不允许重定向到127.0.0.1localhost。为了解决这个问题,在Linux或者Mac OSX下,编辑你的/etc/hosts文件添加如下内容:

127.0.0.1 mysite.com

这是用来告诉你的计算机指定mysite.com hostname指向你的本地机器。如果你使用Windows,你的hosts文件在 C:\Winwows\ System32\Drivers\etc\hosts

为了验证你的host重定向是否可用,在浏览器中打开 http://mysite.com:8000/account/login/ 。如果你看到你的应用的登录页面,host重定向已经可用。

使用Facebook认证(authentication)

(译者注:以下的几种社交认证操作步骤可能已经过时,请根据实际情况操作)
为了让你的用户能够使用他们的Facebook账号来登录你的网站,在项目settings.py文件中的AUTHENTICATION_BACKENDS设置中添加如下内容:

'social.backends.facebook.Facebook2OAuth2',

为了添加Facebook的社交认证(authentication),你需要一个Facebook开发者账号,然后你必须创建一个新的Facebook应用。在浏览器中打开 https://developers.facebook.com/apps/?action=create 点击Add new app按钮。点击Website平台然后为你的应用取名为Bookmarks,输入 http://mysite.com:8000/ 作为你的网站URL。跟随快速开始步骤然后点击Create App ID

回到网站的Dashboard。你会看到类似下图所示的:

拷贝App IDApp Secret关键值,将它们添加在项目中的settings.py*文件中,如下所示:

SOCIAL_AUTH_FACEBOOK_KEY = 'XXX' # Facebook App ID
SOCIAL_AUTH_FACEBOOK_SECRET = 'XXX' # Facebook App Secret

此外,你还可以定义一个SOCIAL_AUTH_FACEBOOK_SCOPE设置如果你想要访问Facebook用户的额外权限,例如:

SOCIAL_AUTH_FACEBOOK_SCOPE = ['email']

最后,打开registration/login.html模板(template)然后添加如下代码到content block中:

<div class="social">
  <ul>
    <li class="facebook"><a href="{% url "social:begin" "facebook" %}">Sign in with Facebook</a></li>
  </ul> 
</div>

在浏览器中打开 http://mysite.com:8000/account/login/ 。现在你的登录页面会如下图所示:

点击Login with Facebook按钮。你会被重定向到Facebook,然后你会看到一个对话询问你的权限是否让Bookmarks*应用访问你的公共Facebook profile:

点击Okay按钮。Python-social-auth会对认证(authentication)进行操作。如果每一步都没有出错,你会登录成功然后被重定向到你的网站的dashboard页面。请记住,我们已经使用过这个URL在LOGIN_REDIRECT_URL设置中。就像你所看到的,在你的网站中添加社交认证(authentication)是非常简单的。

使用Twitter认证(authentication)

为了使用Twitter进行认证(authentication),在项目settings.py中的AUTHENTICATION_BACKENDS设置中添加如下内容:

'social.backends.twitter.TwitterOAuth',

你需要在你的Twitter账户中创建一个新的应用。在浏览器中打开 https://apps.twitter.com/app/new 然后输入你应用信息,包含以下设置:

确保你勾选了复选款Allow this application to be used to Sign in with Twitter。之后点击Keys and Access Tokens。你会看到如下所示信息:

拷贝Consumer KeyConsumer Secret关键值,将它们添加到项目settings.py的设置中,如下所示:

SOCIAL_AUTH_TWITTER_KEY = 'XXX' # Twitter Consumer Key
SOCIAL_AUTH_TWITTER_SECRET = 'XXX' # Twitter Consumer Secret

现在,编辑login.html模板(template),在<ul>元素中添加如下代码:

<li class="twitter"><a href="{% url "social:begin" "twitter" %}">Login with Twitter</a></li>

在浏览器中打开 http://mysite.com:8000/account/login/ 然后点击Login with Twitter链接。你会被重定向到Twitter然后它会询问你授权给应用,如下所示:

点击Authorize app按钮。你会登录成功并且重定向到你的网站dashboard页面。

使用Google认证(authentication)

Google提供OAuth2认证(authentication)。你可以访问 https://developers.google.com/accounts/docs/OAuth2 获得关于Google OAuth2的信息。

首先,你徐闯创建一个API key在你的Google开发者控制台。在浏览器中打开 https://console.developers.google.com/project 然后点击Create project按钮。输入一个名字然后点击Create按钮,如下所示:

在项目创建之后,点击在左侧菜单的APIs & auth链接,然后点击Credentials部分。点击Add credentials按钮,然后选择OAuth2.0 client ID,如下所示:

Google首先会询问你配置同意信息页面。这个页面将会展示给用户告知他们是否同意使用他们的Google账号来登录访问你的网站。点击Configure consent screen按钮。选择你的e-mail地址,填写BookmarksProduct name,然后点击Save按钮。这个给你的项目使用的同意信息页面将会配置完成然后你会被重定向去完成创建你的Client ID。

在表单(form)中填写以下内容:

这表单(form)将会如下所示:

点击Create按钮。你将会获得Client IDClient Secret关键值。在你的settings.py中添加它们,如下所示:

SOCIAL_AUTH_GOOGLE_OAUTH2_KEY = '' # Google Consumer Key
SOCIAL_AUTH_GOOGLE_OAUTH2_SECRET = '' # Google Consumer Secret

在Google开发者控制台的左方菜单,APIs & auth部分的下方,点击APIs链接。你会看到包含所有Google Apis的列表。点击 Google+ API然后点击Enable API按钮在以下页面中:

编辑login.html模板(template)在<ul>元素中添加如下代码:

<li class="google"><a href="{% url "social:begin" "google" %}">Login with Google</a></li>

在浏览器中打开 http://mysite.com:8000/account/login/ 。登录页面将会看上去如下图所示:

点击Login with Google按钮。你将会被重定向到Google并且被询问权限通过我们之前配置的同意信息页面:

点击Accept按钮。你会登录成功并重定向到你的网站的dashboard页面。

我们已经添加了社交认证(authentication)到我们的项目中。python-social-auth模块还包含更多其他非常热门的在线服务。

总结

在本章中,你学习了如何创建一个认证(authentication)系统到你的网站并且创建了定制的用户profile。你还为你的网站添加了社交认证(authentication)。

在下一章中,你会学习如何创建一个图片收藏系统(image bookmarking system),生成图片缩微图,创建AJAX视图(views)。

译者总结

终于写到了这里,呼出一口气,第四章的页数是前几章的两倍,在翻译之前还有点担心会不会坚持不下去,不过看样子我还是坚持了下来,而且发现一旦翻译起来就不想停止(- -|||莫非心中真的有翻译之魂!?)。这一章还是比较基础,主要介绍了集成用户的认证系统到网站中,比较有用的是通过第三方的平台账户登录,可惜3个平台Facbook,Twitter,Google国内都不好访问,大家练习的时候还是用国内的QQ,微信,新浪等平台来练习吧。第五章的翻译不清楚什么时候能完成,也许过年前也可能过年后,反正不管如何,这本书我一定要翻译到最后!

最后,请保佑我公司年会让我抽到特大奖,集各位祈祷之力,哈哈哈哈!

推荐阅读更多精彩内容