Django 学习笔记(3)

Django 登录逻辑和配置邮箱登录

1.登录逻辑

在应用下的views 中定义登录逻辑

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
# -*- coding:utf-8 -*-
from django.views.generic.base import View
from django.contrib.auth import login
from django.contrib.auth import authenticate

from .forms import LoginForm


# views.py
class LoginView(View):

def get(self, request):
return render(request, "login.html", {})

def post(self,request):
login_form = LoginForm(request.POST)
if login_form.is_valid():
user_name = request.POST.get('username', '')
pass_word = request.POST.get('password', '')
user = authenticate(username=user_name, password=pass_word)
if user is not None:
login(request, user)
return render(request, 'index.html')
else:
return render(request, 'login.html', {'msg': '用户名或密码错误'})
else:
return render(request, 'login.html', {'login_form': login_form})


from django import forms


# forms.py
class LoginForm(forms.Form):
username = forms.CharField(required=True)
password = forms.CharField(required=True, min_length=6)
  • 这里使用基于类的视图来写登陆逻辑,登录视图继承
    视图,里面有 get 和 post 方法,我们要复写,同时要带上请求参数 request 。
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27

    - 在客户端post过来的表单数据后,使用自己定义的form对数据进行校验,检验数据是否合法,里面有一些参数可选。

    - 在对表单进行校验后,如果数据合法,则获取请求参数中的用户名和密码,然后使用 django 提供的authenticate 方法验证账户和密码正确性。

    - 在得到验证后的数据后如果正确,在调用 django 的 login 方法,将 user 对象进行登录,让后返回登录后的页面;如果错误则返回登录的页面,同时放入错误信息。


    2.邮箱登录

    ```python
    # -*- coding:utf-8 -*-
    from django.contrib.auth import authenticate
    from django.contrib.auth.backends import ModelBackend
    from django.db.models import Q

    from .models import UserProfile


    class CustmoBackend(ModelBackend):
    def authenticate(self, username=None, password=None, **kwargs):
    try:
    user = UserProfile.objects.get(Q(username=username)|Q(email=username))
    if user.check_password(password):
    return user
    except Exception as e:
    return None