前一節我們實現了用戶管理,本節對用戶登錄和登出進行處理。由於我們已經引入了django.contrib.auth應用,用戶的登錄和登出處理變得非常簡單。
我們已經可以在view函數中判斷用戶是否已經登錄以及獲取用戶信息:
if request.user.is_authenticated(): #判斷用戶是否已登錄 user = request.user; #獲取已登錄的用戶 else: user = request.user; #非登錄用戶將返回AnonymousUser對象
Django的User對象提供了一系列的屬性和方法,其中password存儲的是加密后的密碼,is_staff記錄用戶是否有管理員權限,其他的屬性可以參考官方文檔。同時django.contrib.auth模塊中提供了authenticate()、login()、logout()等函數,分別實現認證、登錄、登出等功能。
Django還為我們提供了內置的處理login、logout的view函數,但是因為其提供的行為與我們這里要的不一樣,所以還需要自己實現view函數。
我們使用bootstrap模板設計的布局中,在菜單欄已經放入了登錄表單,如下圖:
如上一節所述,我們希望只有登錄后的用戶才可以管理產品,所以在右上角輸入用戶名和密碼並登錄后,該處顯示用戶名和”注銷“按鈕,而頁面重定向的產品管理的界面。
。而注銷后再恢復成登錄表單。
需求已經明確了,現在開始實現。對於url配置,由於login和logout功能應該屬於整個project,而不是特定的app,所以在depot/urls.py中配置:
from depotapp.views import login_view,logout_view urlpatterns = patterns('', ... ... (r'^accounts/login/$', login_view), (r'^accounts/logout/$', logout_view), )
而我們的設計的界面中沒有獨立的登錄、注銷界面,所以view函數還是在depotapp的views.py中實現:
from django.contrib.auth import authenticate,login,logout def login_view(request): user = authenticate(username=request.POST['username'], password=request.POST['password']) if user is not None: login(request, user) print request.user return list_product(request) else: #驗證失敗,暫時不做處理 return store_view(request) def logout_view(request): logout(request) return store_view(request)
所有的界面都在base.html模板中,將base.html的topbar中原來登錄表單的部分,改成如下的樣子:
{% if request.user.is_authenticated %} <div class="pull-right"> <a href=#>歡迎您:{{request.user}}</a> <a class="btn danger small" href="{% url depotapp.views.logout_view %}">注銷</a> </div> {% else %} <form action="{% url depotapp.views.login_view %}" method='post' class="pull-right"> {% csrf_token %} <input name='username' class="input-small" type="text" placeholder="用戶名"> <input name='password' class="input-small" type="password" placeholder="密碼"> <button class="btn" type="submit">登錄</button> </form> {% endif %}
所有的工作就完成了。