1. 程式人生 > >(項目)在線教育平臺(三)

(項目)在線教育平臺(三)

har 登錄驗證 mod class true 技術 abs 姓名 ali

五、登錄功能

1、首頁和登錄頁面配置

  將首頁的index.html和登錄頁面login.html前端文件拷貝到項目的templates文件夾內,如果需要前端初始文件請聯系我QQ:779060694,。

  然後在項目根目錄下新建static文件夾,該文件夾用來存放一些前端的靜態文件,將前端的靜態文件(css、images、img、js、media)這些文件拷貝到該文件夾下。

技術分享圖片

  然後在setting.py文件中配置靜態文件的訪問路徑:

1 STATICFILES_DIRS = (
2     os.path.join(BASE_DIR, static),
3 )

  然後修改首頁index.html和登錄頁面login.html初始文件中的靜態文件訪問路徑,使用ctrl+f查找出所有的‘../‘,然後ctrl+r全部替換為‘/static/‘。

  現在開始在url.py文件中配置首頁的訪問url和登錄頁面的訪問url:

1 from django.views.generic import TemplateView
2 
3 urlpatterns = [
4     path(‘‘, TemplateView.as_view(template_name=index.html), name=index),  # 首頁
5     path(login/, TemplateView.as_view(template_name=login.html), name=login),  # 登錄
6 ]

  在index.html文件中修改跳轉到登錄頁面的url,初始文件中將登錄和註冊都註釋了,需要取消註釋,然後修改跳轉url:

技術分享圖片

  現在就可以可以訪問首頁和登錄頁面了:http://127.0.0.1:8000/

2、後端用戶登錄接口

2.1 編寫登錄接口

  在users/views.py文件中編寫登錄的接口:

 1 from django.contrib.auth import authenticate, login
 2 
 3 # Create your views here.
 4 
 5 def user_login(request):
 6     if request.method == POST:
 7         # 獲取用戶提交的用戶名和密碼
 8         user_name = request.POST.get(
username, None) 9 pass_word = request.POST.get(password, None) 10 11 # 通過django的authenticate方法獲取user對象,也就是驗證用戶是否存在 12 user = authenticate(username=user_name, password=pass_word) 13 14 if user is not None: 15 # 驗證通過,通過django的login方法去登錄,然後返回首頁 16 login(request, user) 17 return render(request, index.html) 18 else: 19 return render(request, login.html, {msg: 用戶名或密碼錯誤}) 20 21 elif request.method == GET: 22 return render(request, login.html)

2.2 修改登錄的url

  在urls.py文件中修改登錄頁面的url:

1 from users import views
2 
3 urlpatterns = [
4     path(login/, views.user_login, name=login),  # 登錄
5 ]

3、前端登錄頁面配置

  在login.html文件中修改如下內容,與後端接口對接:

技術分享圖片

  然後修改index.html文件中頂部登錄註冊按鈕在登錄狀態下隱藏的問題,也就是未登錄狀態下顯示登錄註冊按鈕,登錄狀態下顯示用戶姓名和個人中心:

技術分享圖片

4、後端登錄接口完善,增加郵箱登錄和form表單驗證

  同時需要郵箱和用戶名登錄,需要自定義authenticate方法,在users/views中重寫ModelBackend類中的方法authenticate:

 1 from django.contrib.auth.backends import ModelBackend
 2 from django.db.models import Q
 3 
 4 from .models import UserProfile
 5 
 6 # Create your views here.
 7 
 8 
 9 class CustomBackend(ModelBackend):
10     """郵箱用戶名同時登錄驗證方法"""
11     # 重寫authenticate方法實現用戶名、郵箱都可以登錄
12     def authenticate(self, request, username=None, password=None, **kwargs):
13         try:
14             # 同時查詢用戶名和郵箱記錄,使用Q並集查詢
15             user = UserProfile.objects.get(Q(username=username)|Q(email=username))
16 
17             # 密碼在數據庫中是加密的,需要使用UserProfile繼承的AbstractUser中的check_password方法
18             if user.check_password(password):
19                 return user
20         except Exception as e:
21             return None

  然後將重寫後的CustomBackend類配置進setting.py文件中:

1 AUTHENTICATION_BACKENDS = (
2     users.views.CustomBackend,
3 )

  現在就可以通過郵箱和用戶名進行登錄了。

  繼續完善登錄接口,增加form表單驗證,在users下新建form.py文件,添加需要表單驗證的字段:

1 from django import forms
2 
3 
4 class LoginForm(forms.Form):
5     """登錄表單驗證"""
6     # required=True用戶名和密碼不能為空
7     username = forms.CharField(required=True)
8     password = forms.CharField(required=True, min_length=5)

  繼續完善登錄接口,將函數的形式改成類的形式,通過form表單進行驗證,先把函數形式改成類的形式:

 1 class LoginView(View):
 2     """登錄"""
 3     def get(self, request):
 4         return render(request, login.html)
 5 
 6     def post(self, request):
 7         # form實例化
 8         login_form = LoginForm(request.POST)
 9         if login_form.is_valid():
10             # form驗證通過,獲取用戶提交的用戶名和密碼
11             user_name = request.POST.get(username, None)
12             pass_word = request.POST.get(password, None)
13 
14             # 通過django的authenticate方法獲取user對象,也就是驗證用戶是否存在
15             user = authenticate(username=user_name, password=pass_word)
16 
17             if user is not None:
18                 # 驗證通過,通過django的login方法去登錄,然後返回首頁
19                 login(request, user)
20                 return render(request, index.html)
21             else:
22                 # 驗證不通過,返回登錄頁面,並將錯誤信息返回回去顯示
23                 return render(request, login.html, {msg: 用戶名或密碼錯誤, login_form: login_form})
24         else:
25             return render(request, login.html, {login_form: login_form})

  修改登錄接口的url:

1 from users.views import LoginView
2 
3 urlpatterns = [
4     path(login/, LoginView.as_view(), name=login),  # 登錄
5 ]

5、前端錯誤提示信息修改

  登錄失敗後,前端需要有錯誤信息提示,login.html修改地方如下:

技術分享圖片

(項目)在線教育平臺(三)