《Django By Example》第四章 下 中文翻譯
譯者夜夜月,已獲作者授權轉載。
原文鏈接:http://www.jianshu.com/p/fd9a6689124d
書籍出處:https://www.packtpub.com/web-development/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 Userclass 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 match.) return cd[password2]
我們為User模型(model)創建了一個model表單(form)。在我們的表單(form)中我們只包含了模型(model)中的username,first_name,email欄位。這些欄位會在它們對應的模型(model)欄位上進行驗證。例如:如果用戶選擇了一個已經存在的用戶名,將會得到一個驗證錯誤。我們還添加了兩個額外的欄位password和password2給用戶用來填寫他們的新密碼和確定密碼。我們定義了一個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, UserRegistrationFormdef 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 dont 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 modelsfrom django.conf import settingsclass 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, urlfrom django.contrib import adminfrom django.conf import settingsfrom django.conf.urls.static import staticurlpatterns = [ 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 adminfrom .models import Profileclass 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 Profileclass 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 profileprofile = Profile.objects.create(user=new_user)
當用戶在我們的站點中註冊,我們會創建一個對應的空的profile給他們。你需要在管理站點中為之前創建的用戶們一個個手動創建對應的Profile對象。
現在,我們要讓用戶能夠編輯他們的pfofile。添加如下代碼到相同文件中:
from .forms import LoginForm, UserRegistrationForm, UserEditForm, ProfileEditForm@login_requireddef 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_form和profile_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 messagesmessages.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_requireddef 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 Userclass 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... OKApplying default.0002_add_related_name... OKApplying 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 System32Driversetchosts。
為了驗證你的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 IDSOCIAL_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 然後輸入你應用信息,包含以下設置:
- 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 KeySOCIAL_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地址,填寫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 KeySOCIAL_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,微信,新浪等平台來練習吧。第五章的翻譯不清楚什麼時候能完成,也許過年前也可能過年後,反正不管如何,這本書我一定要翻譯到最後!
最後,請保佑我公司年會讓我抽到特大獎,集各位祈禱之力,哈哈哈哈!
推薦閱讀:
※如何高效自學編程()?
※python楊輝三角代碼過程看不懂?
※python 中如何實現一行輸入多個值 ?
※用 Python 寫爬蟲時應該注意哪些坑?