Python web開發之旅

### django自帶的admin系統:

1. 如何開啟admin系統:

>1. 在使用admin之前,要確保安裝了一些東西。

* 確保在`settings.py`中的`INSTALLED_APPS`安裝了`'django.contrib.admin'`

* 在`INSTALLED_APPS`中添加了四個依賴的`app`,`django.contrib.auth`,`django.contrib.contenttypes`,`django.contrib.messages`和`django.contrib.sessions`。

* 在模板上下文中添加以下依賴`django.contrib.auth.context_processors.auth`,`django.contrib.messages.context_processors.messages`

* 在中間件中添加以下依賴,`django.contrib.auth.middleware.AuthenticationMiddleware`,`django.contrib.messages.middleware.MessageMiddleware`。

>2. 運行命令`python manage.py createsuperuser`創建一個超級用戶,然後輸入超級用戶的用戶名和密碼。

>3. 在瀏覽器中輸入`127.0.0.1:8000/admin/`進入`admin`登錄界面。輸入剛剛創建的用戶名和密碼,進入admin管理界面。

2. 如何將語言改成本地語言:

> 1. 在`MIDDLEWARE`的最後添加`django.middleware.locale.LocaleMiddleware`中間件。`django`會根據用戶瀏覽器提交的數據`request.META['HTTP_ACCEPT_LANGUAGE']`做一個判斷,來返回具體的語言。

> 2. 也可以不適用國際化,把`jango.middleware.locale.LocaleMiddleware`關掉,然後設置`LANGUAGE_CODE=zh_hans`。

3. 自定義`admin`:

> * 把需要管理的模型添加到`admin`中:首先要在`INSTALLED_APPS`中添加,然後在`admin.py`中註冊`admin.site.register(ArticleModel)`。

> * 修改模型列表的`title`展示:在`ArticleModel`中添加一個`__unicode__`方法,然後返回你需要展示的字符串,比如要展示文章的標題:

>

```python

def __unicode__(self):

return self.title

```

> * `list_display`:可以修改展示的列表項

> * `search_fields`:可以提供搜索的查找項。

> * `list_filter`:可以提供一個過濾的表。

### `auth`系統:

1. `User`用戶:

* 創建一個用戶:`from django.contrib.auth.models import User`,然後使用`create_user`來創建一個用戶。

* 修改密碼:

```

from django.contrib.auth.models import User

u = User.objects.get(username='john')

u.set_password('new password')

u.save()

```

* 驗證用戶:

```python

from django.contrib.auth import authenticate

user = authenticate(username='john', password='secret')

if user is not None:

# 這個用戶存在數據庫中

else:

# 這個用戶沒有存在這個數據庫中

```

* 登錄:

```python

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)

# 登錄成功

else:

# 用戶沒有被激活,不能登錄

else:

# 用戶名或者密碼錯誤

```

* 註銷:

```python

from django.contrib.auth import logout

def logout_view(request):

logout(request)

# 註銷這個用戶。他的session信息將被清除掉。

```

* `login_required`裝飾器:

```python

from django.contrib.auth.decorators import login_required

@login_required

def my_view(request):

...

```

如果沒有登錄成功,會跳轉到`settings.LOGIN_URL`指定的URL中。否則,直接執行函數中的內容。

* `user_passes_test`裝飾器:

```python

from django.contrib.auth.decorators import user_passes_test

def email_check(user):

return user.email.endswith('@example.com')

@user_passes_test(email_check)

def my_view(request):

...

```

可以用來判斷當前用戶是否滿足某種要求們如果沒有滿足,則會跳轉到`settings.LOGIN_URL`.

* `permission_required`裝飾器:傳一個權限名稱,如果這個用戶有這個權限,則正常執行view函數,否則將跳轉到`settings.LOGIN_URL`定義好的`url`去。

```python

from django.contrib.auth.decorators import permission_required

@permission_required('polls.can_vote')

def my_view(request):

...

```

* `User`模型常用屬性和方法:

* `username`:用戶名。

* `email`:郵箱。

* `groups`:多對多的組。

* `user_permissions`:多對多的用戶權限。

* `is_staff`: 是否是`admin`的管理員。

* `is_active`: 是否激活,判斷該用戶是否可用。

* `is_superuser`: 是否是超級用戶。

* `last_login`: 上次登錄時間。

* `date_joined`: 註冊時間。

* `is_authenticated`: 是否驗證通過了。

* `is_anonymous`:是否是匿名用戶。

* `set_password(raw_password)`: 設置密碼,傳原生密碼進去。

* `check_password(raw_password)`: 檢查密碼。

* `has_perm(perm)`: 判斷用戶是否有某個權限。

* `has_perms(perm_list)`: 判斷用戶是否有權限列表中的某個列表。

*

2. `Permission`權限模型:

* 在模型中添加權限:

```python

class Task(models.Model):

class Meta:

permissions = (

("view_task", "Can see available tasks"),

("change_task_status", "Can change the status of tasks"),

("close_task", "Can remove a task by setting its status as closed"),

)

```

* 在代碼中添加權限:

```python

from myapp.models import BlogPost

from django.contrib.auth.models import Permission

from django.contrib.contenttypes.models import ContentType

content_type = ContentType.objects.get_for_model(BlogPost)

permission = Permission.objects.create(

codename='can_publish',

name='Can Publish Posts',

content_type=content_type,

)

```

* 用戶的權限操作:

```python

myuser.user_permissions.set([permission_list])

myuser.user_permissions.add(permission, permission, ...)

myuser.user_permissions.remove(permission, permission, ...)

myuser.user_permissions.clear()

myuser.has_perm('foo.add_bar')

```

* 訪問權限的方式:`appname`+`.`+`權限名稱`。

3. `Group`模型:

* 所屬包`django.contrib.auth.models.Group`

* 創建`Group`:必須傳一個`name`參數進去。

* `Group`操作:

```python

group.permissions.set([permission_list])

group.permissions.add(permission, permission, ...)

group.permissions.remove(permission, permission, ...)

group.permissions.clear()

```


分享到:


相關文章: