實戰Django:Rango Part5

在講完註冊模塊以後,咱們來着手實現登陸和註銷模塊。html

21.添加登陸模塊 django


註冊功能作好了,接下來咱們來完成登陸模塊。小程序

如下是咱們要完成的工做:瀏覽器

  • 建立一個登陸視圖;
  • 建立登陸模板來顯示登陸表單;
  • 將登陸視圖映射到URL;
  • 在首頁上添加登陸連接;

咱們先來搞定登陸視圖。ide

編輯rango/views.py,添加如下內容:post

rango/views.pyui

def user_login(request):

    # 若是是HTTP POST請求,則嘗試取出相關的數據
    if request.method == 'POST':
        # 獲取用戶提供的用戶名和密碼,這些信息包含在登陸表單中
        username = request.POST['username']
        password = request.POST['password']

        # 驗證用戶名和密碼,驗證經過將返回一個user對象.
        user = authenticate(username=username, password=password)

        # 若驗證經過
        if user:
            # 檢查帳戶是否已激活(可能會被禁用).
            if user.is_active:
                # 若是用戶帳戶有效且已激活,可容許用戶登陸。
                # 咱們將引導用戶回到首頁.
                login(request, user)
                return HttpResponseRedirect('/rango/')
            else:
                # 用戶帳戶被禁用,則彈出警告信息!
                return HttpResponse("Your Rango account is disabled.")
        else:
            # 驗證不經過,則不容許用戶登陸
            print ("Invalid login details: {0}, {1}".format(username, password))
            return HttpResponse("Invalid login details supplied.")

    # 非 HTTP POST請求, 則顯示登陸表單.
    else:
        # 沒有要傳送到模板系統的變量,因此直接傳一個空的字典對象
        return render(request, 'rango/login.html', {})

最後,別忘了在文件頭部加入如下代碼:url

from django.contrib.auth import authenticate, login
from django.http import HttpResponseRedirect, HttpResponse

接下來建立登陸模板,建立templates/rango/login.html,加入以下內容:spa

templates/rango/login.html:rest

{% extends 'rango/base.html' %}

{% block body_block %}
<div class="hero-unit">
    <h1>登陸Rango</h1>

    <div class="container">
    <form class="form-signin span4" id="login_form" method="post" action="/rango/login/">
        <h2 class="form-signin-heading">請登陸</h2>
        {% csrf_token %}

        {% if bad_details %}
        <p><strong>您輸入的用戶名或密碼錯誤!</strong></p>
        {% elif disabled_account %}
        <p><strong>您的Rango帳戶已被禁用,暫不能登陸!</strong></p>
        {% endif %}

        用戶名: <input type="text" class="input-block-level" placeholder="用戶名" name="username" value="" size="50" />
        <br />
        密碼: <input type="password" class="input-block-level" placeholder="密碼" name="password" value="" size="50" />
        <br />
        <button class="btn btn-primary" type="submit">登陸</button>
    </form>

    </div>
    <!-- /container -->
</div>
{% endblock %}

視圖和模板都好了,接下來咱們來處理URL映射,把它們都連到一塊兒。編輯rango/urls.py,改爲下面這樣:

rango/urls.py:

from django.conf.urls import patterns, url 
from rango import views

urlpatterns = patterns('', 
    url(r'^$', views.index, name='index'), 
    url(r'^about/$', views.about, name='about'), 
    url(r'^category/(?P<category_name_slug>\w+)$', views.category, name='category'), 
    url(r'^add_category/$', views.add_category, name='add_category'), 
    url(r'^category/(?P<category_name_slug>\w+)/add_page/$', views.add_page, name='add_page'), 
    url(r'^register/$', views.register, name='register'), 
    url(r'^login/$', views.user_login, name='login'), 
    )

最後一步,咱們要在首頁模板(templates/rango/index.html)中添加一個「登陸」連接。請在</body>標籤前添加如下內容:

templates/rango/index.html:

<a href="/rango/login/">登陸</a><br />

搞完以上這些,趕腳還有些意猶未盡。我想讓Rango更人性化一些,在用戶登陸後來一句問候語。

繼續修改首頁模板,找到這句:

templates/rango/index.html:

<h1>歡迎來到Rango!</h1>

改成:

templates/rango/index.html:

{% if user.is_authenticated %}
<h1> ` user`.`username `,歡迎來到Rango!</h1>
{% else %}
<h1>歡迎來到Rango!</h1>
{% endif %}

 

咱們來看檢查一下工做成果,在瀏覽器中輸入:http://127.0.0.1:8000/rango/,而後點擊「登陸」連接,輸入用戶名和密碼以後(用管理員帳號「admin」便可),你會看到下面這樣的頁面:

4_thumb

22.添加訪問限制

有些內容,咱們只但願給已登陸的用戶看到。這在Django中如何實現呢?

咱們來簡單演示一下。

編輯rango/views.py,添加如下內容:

rango/views.py

@login_required
def restricted(request):
    return HttpResponse("你只有在登陸後才能看到這段文本!")

別忘了在文件頭部加入如下代碼:

from django.contrib.auth.decorators import login_required

這個「@login_required」叫作「裝飾器」,咱們能夠理解成一段內置的小程序,程序在執行「restricted」這段代碼前先執行」login_required「,檢查用戶有無登陸,只有在用戶已登陸的狀況下,纔會顯示」restricted「中的內容。

咱們一樣要給「restricted」加上URL映射。編輯rango/urls.py,改爲下面這樣:

rango/urls.py:

urlpatterns = patterns('',
    url(r'^$', views.index, name='index'),
    url(r'^about/$', views.about, name='about'), 
    url(r'^category/(?P<category_name_slug>\w+)', views.category, name='category'),
    url(r'^add_category/$', views.add_category, name='add_category'),
 url(r'^category/(?P<category_name_slug>\w+)/add_page/$', views.add_page, name='add_page'), 
url(r'^register/$', views.register, name='register'), url(r'^login/$', views.user_login, name='login'), url(r'^restricted/', views.restricted, name='restricted'), )

爲了讓」login_required「將未登陸的用戶引導到登陸頁面,咱們在設置文件(rangoproject/settings.py)中要加入這樣一句代碼:

rangoproject/settings.py:

LOGIN_URL = '/rango/login/

 

23.添加註銷模塊


既然有登陸,那天然要提供一個註銷模塊,才顯得更爲合理。

在Django中加入一個註銷模塊是件很是簡單的事情。編輯rango/views.py 文件,讓它變成下面這個樣子:

rango/views.py(注意將第一行放到文件頭部)

from django.contrib.auth import logout

# 使用login_required()裝飾器來確保只有已登陸的用戶才能夠訪問這個視圖
@login_required
def user_logout(request):
    # 咱們只能對已登陸的用戶使用註銷功能
    logout(request)

    # 將用戶從新引導回首頁.
    return HttpResponseRedirect('/rango/')

加入URL映射。編輯rango/urls.py,改爲下面這樣:

rango/urls.py:

urlpatterns = patterns('',
    url(r'^$', views.index, name='index'),
    url(r'^about/$', views.about, name='about'),
    url(r'^category/(?P<category_name_slug>\w+)$', views.category, name='category'),
    url(r'^add_category/$', views.add_category, name='add_category'),
    url(r'^category/(?P<category_name_slug>\w+)/add_page/$', views.add_page, name='add_page'),
    url(r'^register/$', views.register, name='register'),
    url(r'^login/$', views.user_login, name='login'),
    url(r'^restricted/', views.restricted, name='restricted'),
    url(r'^logout/$', views.user_logout, name='logout'),
    )

咱們在模板中也要作相應的修改。只讓已登陸的用戶才能看到」註銷「連接。

修改首頁模板(templates/rango/index.html),把「註冊」和」登陸「的兩行代碼刪掉,加入以下內容:

templates/rango/index.html:

{% if user.is_authenticated %}
<a href="/rango/restricted/">限制頁面</a><br />
<a href="/rango/logout/">註銷</a><br />
{% else %}
    <a href="/rango/register/">註冊</a><br />
    <a href="/rango/login/">登陸</a><br />
{% endif %}

 

【未完待續】

本文版權歸捨得學苑全部,歡迎轉載,轉載請註明做者和出處。謝謝!
做者:捨得
首發:捨得學苑@博客園

相關文章
相關標籤/搜索