python的Web框架,auth權限系統

使用django默認權限系統實現用戶登陸退出

判斷用戶是否登陸
request.user.is_authenticated

返回的爲bool值

 

一個簡單的登陸視圖範式:html

 1 # 導包
 2 from django.contrib.auth import login, logout, authenticate
 3 
 4 def loginview(request):
 5 
 6     # 判斷是否登陸,若是沒有登陸,這個user就是一個匿名用戶(AnonymousUser)。
 7     if request.user.is_authticate:
 8         return redirect(reverse('teacher:index')) #若是登陸了則跳到首頁
 9     
10     if request.method == 'POST':
11         username = request.POST.get('username', '')
12         password = request.POST.get('password', '')
13         
14         #校驗用戶名和密碼,驗證成功會返回一個用戶,失敗則返回一個None
15         user = authenticate(username=username, password=password)
16         
17         if user is not None:
18             # 登陸,將用戶信息保存到session
19             login(request, user)  # 綁定(接受)當前的request請求,拿到request中的session,並傳入user
20         
21             return redirect(reverse('teacher:index'))
22 
23     return render(request, 'teacher/login.html')
24     
25     
26     
27 # 簡單退出視圖
28 def logoutview(request):
29     # 用戶是否登陸均可以logout,不會拋出異常。
30     logout(request)
31     return redirect(reverse('teacher:index'))

 

html中有一個user的上下文處理器的全局變量,全部的模板能夠直接使用數據庫

{{ user.username }}

 

限制登陸訪問

若是沒有登陸就禁止訪問網頁
在函數視圖中簡單配置便可:

    # 若是當前用戶沒有登陸,則返回登陸頁面
    if not request.user.is_authenticated:
        return redirect(reverse('teacher:login'))

可是使用了這個以後,沒法跳轉到我當前進入的網頁。下面去解決這個問題。django

登陸後的跳轉

限制登陸訪問後,在登陸以後,自動跳轉到當前須要訪問的頁面。參數傳遞方法安全

 1 流程邏輯範式:
 2 
 3 # 傳參數
 4 def students(request):
 5     if not request.user.is_authenticated:
 6         # 經過參數來傳遞當前的頁面。
 7         return redirect(reverse('teacher:login') + '?next=%s' %request.path_info )
 8         
 9         
10 # 在login中接受參數並跳轉,GET和POST一樣須要設置,此處只示例GET
11 def loginview(request):
12     # 獲取next參數
13     next_url = request.GET.get('next')
14     # 若是當前登陸了帳號。則跳轉到初始訪問的網頁
15     if request.user.is_authenticated: 
16         if next_url:
17             return redirect(next_url)
18     
19         # 若是沒有登陸,則跳轉到登陸的頁面
20         else:
21             return redirect(reverse('teacher:login')

若是這樣寫的話,那就是每個APP都須要須要加上判斷和傳參數代碼。比較麻煩。而django爲咱們提供了一個方法,那就來看看把。session

login_required:裝飾器跳轉

# 導包
from django.contrib.auth.decorators import login_required

 

範式app

1 login_url爲當沒有next的時候須要跳轉的地方
2 @login_required(login_url=reverse('teacher:login'))
3 def students(request):
4     pass

 

若是不寫login_url的話,會報錯,就咱們須要在settings中配置LOGIN_URL。函數

@login_required()
def students(request):
    pass
    
    
settings中配置:
from django.urls import reverse_lazy, reverse
LOGIN_URL = reverse_lazy('teacher:login')

reverse_lazy:懶加載,若是直接配置reverse則會報錯,由於settings是最先加載的,而APP等其餘的還每有加載,當即加載是找不到咱們須要的網頁。

 


django內置權限系統管理

>>> admin.has_perm('teacher.add_student')

判斷admin是否有'teacher.add_student'的權限。
# has_perm 是否有這個表的字段

返回bool值

 

在view中的應用:ui

1 @login_required()
2 def students(request):
3     if not request.user.has_perm('teacher.view_students'):
4         return HttpResponse('你沒有權限查看')
5     pass
6     ......

 

權限的裝飾器方法
第一個參數:表明當前的權限位置,第二個參數表明:報錯拋出的異常
@permission_required('teacher.view_students', raise_exception=True)

 

HTML中判斷用戶登陸的常規寫法url

    <!--判斷用戶是否登陸-->
    {% if user.is_authenticated %}
        <li><a href="#">{{ user.username }},歡迎您</a></li>
        <a href="{% url 'teacher:logout' %}">安全退出</a>
    {% else %}
      <li><a href="{% url 'teacher:login' %}">歡迎遊客,請登陸</a></li>
    {% endif %}

 

HTML中根據權限顯示展示的功能spa

    <!--若是有添加students的權限,則顯示添加這個a標籤-->
    {% if perms.teacher.add_students %}
    <a href="{% url 'teacher:add' %}" class="btn btn-primary" role="button">添加</a>
    {% endif %}

 

刪除權限

>>> 用戶名.user_permissions.clear()

 

html權限的簡單操做

{% if perms.teacher %}說明有teacher app 的權限{% endif %}

{% if perms.teacher.add_students %}說明有teacher students 模型add 的權限{% endif %}

 

自定義權限

寫在models的模型下定義

1 class Meta:
2     permissions = (
3         
4         ('can_deleta_students', '刪除學生')
5     )
6 
7 # 這樣定義後,須要數據庫遷移
相關文章
相關標籤/搜索