1. 程式人生 > >django 註冊、登入及第三方介面程式(1):基礎知識

django 註冊、登入及第三方介面程式(1):基礎知識

一、概述

django有一套成型的註冊登入模組,auth 系統包含如下:

Users
Permission
Group
Message

在settings.py配置中,少不了以下配置

MIDDLEWARE_CLASSES = (
'django.middleware.common.CommonMiddleware',
'django.contrib.sessions.middleware.SessionMiddleware',
'django.contrib.auth.middleware.AuthenticationMiddleware',
'django.contrib.messages.middleware.MessageMiddleware',
)

INSTALLED_APPS = (
'django.contrib.auth', 
'django.contrib.contenttypes',  
'django.contrib.sessions',  
'django.contrib.sites',
'django.contrib.messages',
)

這些一般在建立django專案自動生成,執行 manage.py syncdb則生成相應的表。

二、Users

欄位
class models.User
User物件的具體欄位參考:django官網文件
這裡注意is_active意思是:是否為活躍使用者,對於刪除使用者儘量設定其為false而非真正的刪除,同時也作為是否可登入的判定。
方法
更多參考django官網文件
這裡指出幾個重點學習。
1、is_anonymous():區別匿名使用者和可登入使用者的方法,往往使用is_authenticated()
2、is_authenticated():authenticated表示已驗證,那麼這個方法就是它只表明使用者提供一個有效的使用者名稱和密碼。
3、set_password(raw_password)

:更改密碼,並自動處理hash值
4、check_password(raw_password):檢測密碼是否正確

三、管理方法(Manager functions)

class models.UserManager
1、create_user(username, email, password=None):建立、儲存並返回一個User,username,email和password被設定為給定的值,並且User設定了is_active=True.
2、make_random_password():
返回給定值和長度的隨機密碼:

make_random_password(length=10,allowed_chars='abcdefghjkmnpqrstuvwxyzABCDEFGHJKLMNPQRSTUVWXYZ23456789')

四、基本用法

1、建立使用者
使用create_user()來建立使用者,如下:

from django.contrib.auth.models import User
user = User.objects.create_user('BeginMan','abcd123','[email protected]')
print user.is_staff #True
user.save()

2、更改密碼
使用set_password()進行更改

>>> from django.contrib.auth.models import User
>>> u = User.objects.get(username__exact='john')
>>> u.set_password('new password')
>>> u.save() 

五、web請求中的認證

詳細內容參考
1、基本概述

首先,安裝SessionMiddleware和AuthenticationMiddleware中介軟體。把他們加入到MIDDLEWARECLASSES設定中即可。當你安裝好這些中介軟體之後,你就可以在檢視(view)中訪問request.user了。request.user將返回當前登入的使用者的一個User物件。如果當前沒有使用者登入,那麼request.user將返回一個AnonymousUser物件的例項。你可以通過isauthenticated()來判斷是否有使用者登入,如下:

if request.user.is_authenticated():
 #已登入使用者
else:
 #匿名使用者

2、使用者登入
Django在django.contrib.auth提供了2個函式:authenticate()login()
authenticate():認證函式:

如果通過給定的使用者名稱和密碼做認證,請使用authenticate()函式。他接收2個引數,一個是username一個是password。如果認證成功,它返回一個User物件。如果密碼無效,它返回一個None。例如:

from django.contrib.auth import authenticate
user=authenticate(username='john',password='secret')ifuserisnotNone:
print"使用者名稱、密碼正確!"else:
print"使用者名稱、密碼錯誤!"

login():登入函式

在檢視中登入一個使用者的話,使用login()函式。它接收HttpRequest物件和一個User物件。login()通過Django的session框架把使用者的ID儲存到session中。

from django.contrib.auth import authenticate, login

def my_view(request):
    username = request.POST['username']
    password = request.POST['password']
    user = authenticate(username=username, password=password)
    if user is not None:
        if user.is_active:
            login(request, user)
            # Redirect to a success page.
        else:
            # Return a 'disabled account' error message
    else:
        # Return an 'invalid login' error message.

3、使用者登出
要登出使用
django.contrib.auth.login()登入的使用者的話,可以在檢視中使用
django.contrib.auth.logout()。它接收一個HttpRequest引數,沒有返回值。例如:

from django.contrib.auth import logout 
def logout_view(request):
    logout(request)
    #轉到成功頁面

請注意:如果使用者沒有登入的話,logout()也不會丟擲任何異常的。

六、限制使用者的訪問

1、原始方法
原始方法就是重定向
如:if not request.user.is_authenticated():
2、使用login_required()修飾器

decorators.loginrequired([redirectfieldname=REDIRECTFIELD_NAME])
程式如下:

from django.contrib.auth.decorators import login_required
@login_required
def my_view(request):
   ...

login_required()原理:

如果使用者尚未登入,重定向到settings.LOGIN_URL。
如果使用者已經登入則正常執行。

3、已登入使用者通過通行測試(passtest)來限制訪問
詳見官方文件

七、許可權(Permissions)

Django自帶了一個簡單的許可權系統。它為向用戶和使用者組付許可權提供了一個途徑。它被用在了Django的admin站點中,當然你也可以把它用在自己的程式碼中。Django的admin站點是這樣應用許可權的:
通過"add"許可權來控制使用者是否可以訪問新增表單並新增一個指定型別的物件。通過"change"許可權來控制使用者是否可以訪問指定型別物件的列表和修改表單。*通過"delete"許可權來控制使用者是否可以刪除指定型別的物件。
許可權被賦予每種型別的物件,而不是物件的特定的例項。你可以說“瑪麗可以修改新的故事(stories)”,但是你不能說“瑪麗可以修改她建立的新的故事”或者“瑪麗只能修改特定狀態的、特定釋出時間的、特定ID的故事等等”。這些功能目前Django的開發人員還在討論之中。

1、預設許可權
3個基本的許可權--新增(add),建立(create)和刪除(delete)--在建立包含有classAdmin的Django模型的時候都自動被建立好了。在表面現象的後面,當你執行manage.pysyncdb的時候,這些許可權被新增到了auth_permission資料表中。
請注意,如果你的模型裡沒有classAdmin的話,當你執行manage.pysyncdb的時候這些許可權不會被創建出來。如果你初始化資料庫之後還想新增這些許可權,可以在模型中加入class Admin然後再執行一次manage.pysyncdb。
2、自定義許可權
為了給指定的模型自定義許可權,可以使用許可權(permissions)的modelMetaattribute。這個例子建立了3個自定義的許可權。

class Task(models.Model):
    ...
    class Meta:
        permissions = (
            ("can_view", "Can see available tasks"),
            ("can_change_status", "Can change the status of tasks"),
            ("can_close", "Can remove a task by setting its status as closed"),
        )

接下來的事情就是執行syncdb來建立這些許可權。
3、Permission的API

name:必須。小於等於50個字元。例如:'Canvote'。
contenttype:必須。引用自djangocontenttype資料表,它包含了已經安裝的
Django模型的型別。
codename:必須。小於等於100個字元。例如:'can
vote'

八、模版中的認證資料

如果使用RequestContext的話,已經登入的使用者的user和許可權物件就會儲存在template context中。
1、使用者(Users)
當前登入的使用者,不管是否是匿名的還是其他的,都儲存在模版變數{{user}}中。如:

{%ifuser.is_authenticated%}
  <p>歡迎,{{user.username}}。謝謝您的來訪。</p>
{%else%}
  <p>歡迎,請登入。</p>
{%endif%}

2、許可權(Permissions)
當前登入使用者的許可權儲存在模版變數{{perms}}中,是django.core.context_processors_PermWrapper的例項。
在{{perms}}物件中,單個屬性的查詢是使用User.hasmoduleperms的。下面這個例子中,如果使用者對foo這個app有任何許可權的話,它就返回True。{{perms.foo}}
二級屬性查詢是使用User.hasperm。下面這個例子中,如果使用者有foo.canvote許可權的話,它就返回True。{{perms.foo.can_vote}}因此,你可以在模板中用{%if%}語句來判斷許可權

{%ifperms.foo%}
<p>你有操作foo的許可權。</p>{%ifperms.foo.can_vote%}
<p>你可以投票。</p>{%endif%}
{%ifperms.foo.can_drive%}<p>你可以開車。</p>{%endif%}{%else%}
<p>你沒有操作foo的許可權。</p>
{%endif%}

九、組(Groups)

組通常用來歸類使用者,這樣你就可以為這些組裡面的使用者應用許可權或者貼其他的標籤。一個使用者可以屬於任意數量的組。
組中的使用者自動獲得賦予組的許可權。例如,如果組Siteeditors有canedithome_page的許可權,那麼任何加入這個組的使用者都自動擁有這個許可權。
組也是歸類使用者並給他們貼標籤或擴充套件功能的一個方便的途徑。例如,你建立一個'Specialusers'的組,你可以寫程式碼來讓他們訪問網站的會員專區或者傳送給他們會員專用的電子郵件。

十、訊息

this

十一、小結

看了這份文件已經有兩天了,有三點感受:
1、英語水平著實太差,很多句子晦澀難懂,導致自己翻譯的背離作者原意。
2、一味的看文件不是一個好方法,最好也看看別人的程式碼,然後自己實踐總結
3、做事情要專一,不能分散力量,否則事倍功半的。

下一步:

1、擴充套件User表