譯者夜夜月,已獲作者授權轉載。

原文連結:

http://www。

jianshu。com/p/fd9a66891

24d

書籍出處:

https://www。

packtpub。com/web-develo

pment/django-example

原作者:Antonio Melé

2017年1月4日初稿釋出

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

(譯者注:祝大家新年快樂,這次帶來《Django By Example》第四章的翻譯,這章非常的實用,因為簡書的文章內容有長度限制,所以本章分為上下兩篇,本篇是第四章下篇,上篇地址《Django By Example》第四章 上 中文 翻譯 (個人學習,渣翻) )

使用者註冊和使用者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)欄位上進行驗證。例如:如果使用者選擇了一個已經存在的使用者名稱,將會得到一個驗證錯誤。我們還添加了兩個額外的欄位

password

password2

給使用者用來填寫他們的新密碼和確定密碼。我們定義了一個clean_password2()方法去檢查第二次輸入的密碼是否和第一次輸入的保持一致,如果不一致這個表單將會是無效的。當我們透過呼叫is_valid()方法驗證這個表單(form)時這個檢查會被執行。你可以提供一個clean_()方法給任何一個你的表單(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 %}

Create an account

Please, sign up using the following form:

{{ user_form。as_p }}

{% csrf_token %}

{% endblock %}

在相同的目錄中新增一個模板(template)檔案命名為

register_done。html

,為它新增如下程式碼:

{% extends “base。html” %}

{% block title %}Welcome{% endblock %}

{% block content %}

Welcome {{ new_user。first_name }}!

Your account has been successfully created。 Now you can log in

{% endblock %}

現在,在瀏覽器中開啟

http://

127。0。0。1:8000/account/

register/

。你會看到你建立的註冊頁面:

填寫使用者資訊然後點選Create my account按鈕。如果所有的欄位都驗證都過,這個使用者將會被建立然後會得到一條成功資訊,如下所示:

點選log-in連結輸入你的使用者名稱和密碼來驗證賬號是否成功建立。

現在,你還可以新增一個註冊連結在你的登入模板(template)中。編輯

registration/login。html

模板(template)然後替換以下內容:

Please, use the following form to log-in:

為:

Please, use the following form to log-in。 If you don’t have an account register here

如此,我們就可以從登入頁面進入註冊頁面。

擴充套件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 %}

Edit your account

You can edit your account using the following form:

{{ user_form。as_p }}

{{ profile_form。as_p }}

{% csrf_token %}

{% endblock %}

我們在表單(form)中包含enctype=“multipart/form-data”用來支援檔案上傳。我們使用一個HTML表單來提交兩個表單(forms):

user_form

profile_form

註冊一個新使用者然後開啟 http://127。0。0。1:8000/account/edit/。你會看到如下所示頁面:

現在,你可以編輯dashboard頁面包含編輯

profile

的頁面連結和修改密碼的頁面連結。開啟

account/dashboard。html

模板(model)替換如下程式碼:

Welcome to your dashboard。

為:

Welcome to your dashboard。

You can edit your profile

or change your password

使用者現在可以從他們的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

和id為

content

之間新增如下內容:

{% if messages %}

    {% for message in messages %}

  • {{ message|safe }}

  • {% endfor %}

{% 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

目錄或者其他任何系統來認證你的使用者。

你可以透過訪問 Customizing authentication in Django 獲得更多的資訊關於自定義的認證(authentication)。

當你使用

django。contrib。auth

authenticate()

函式,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()方法接收了

username

password

兩個可選引數。我們可以使用不同的引數,但是我們需要使用

username

password

來確保我們的後臺可以立馬在認證(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)服務,例如

Facebook

Twitter

或者

Google

(國內就算了- -|||)。

Python-social-auth

是一個Python模組提供了簡化的處理為你的網站新增社交認證(authentication)。透過使用這個模組,你可以讓你的使用者使用他們的其他服務的賬號來登入你的網站。你可以訪問 omab/python-social-auth 得到這個模組的程式碼。

這個模組自帶很多認證(authentication)後臺給不同的Python框架,其中就包含Django。

使用pip來安裝這個包,開啟終端執行如下命令:

pip install python-social-auth==0。2。12

安裝成功後,我們需要在專案

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

包含了很多服務的後臺。你可以訪問 Python Social Auth documentation 看到所有的後臺支援。

我們要包含的認證(authentication)後臺包括

Facebook

Twitter

Google

你需要在你的專案中新增社交登入URL模型。開啟

bookmarks

專案中的主

urls。py

檔案,新增如下URL模型:

url(‘social-auth/’,

include(‘social。apps。django_app。urls’, namespace=‘social’)),

為了確保社交認證(authentication)可以工作,你還需要配置一個

hostname

,因為有些服務不允許重定向到

127。0。0。1

localhost

。為了解決這個問題,在

Linux

或者

Mac OSX

下,編輯你的

/etc/hosts

檔案新增如下內容:

127。0。0。1 mysite。com

這是用來告訴你的計算機指定

http://

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 ID和App 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中:

在瀏覽器中開啟

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/ne

w

然後輸入你應用資訊,包含以下設定:

Website:

http://

mysite。com:8000/

Callback URL:

http://

mysite。com:8000/social-

auth/complete/twitter/

確保你勾選了複選款Allow this application to be used to Sign in with Twitter。之後點選Keys and Access Tokens。你會看到如下所示資訊:

複製Consumer Key和Consumer Secret關鍵值,將它們新增到專案

settings。py

的設定中,如下所示:

SOCIAL_AUTH_TWITTER_KEY = ‘XXX’ # Twitter Consumer Key

SOCIAL_AUTH_TWITTER_SECRET = ‘XXX’ # Twitter Consumer Secret

現在,編輯

login。html

模板(template),在

    元素中新增如下程式碼:

  • Login with Twitter
  • 在瀏覽器中開啟

    http://

    mysite。com:8000/account

    /login/

    然後點選Login with Twitter連結。你會被重定向到Twitter然後它會詢問你授權給應用,如下所示:

    點選Authorize app按鈕。你會登入成功並且重定向到你的網站dashboard頁面。

    使用Google認證(authentication)

    Google提供

    OAuth2

    認證(authentication)。你可以訪問

    https://

    developers。google。com/a

    ccounts/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地址,填寫

    Bookmarks

    為Product name,然後點選Save按鈕。這個給你的專案使用的同意資訊頁面將會配置完成然後你會被重定向去完成建立你的Client ID。

    在表單(form)中填寫以下內容:

    Application type: 選擇Web application

    Name: 輸入

    Bookmarks

    Authorized redirect URLs:輸入

    http://

    mysite。com:8000/social-

    auth/complete/google-oauth2/

    這表單(form)將會如下所示:

    點選Create按鈕。你將會獲得Client ID和Client 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)在

      元素中新增如下程式碼:

    • Login with Google
    • 在瀏覽器中開啟

      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,微信,新浪等平臺來練習吧。第五章的翻譯不清楚什麼時候能完成,也許過年前也可能過年後,反正不管如何,這本書我一定要翻譯到最後!

      最後,請保佑我公司年會讓我抽到特大獎,集各位祈禱之力,哈哈哈哈!