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
# 導包 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等其餘的還每有加載,當即加載是找不到咱們須要的網頁。
>>> 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 # 這樣定義後,須要數據庫遷移