用户注册后端逻辑
用户在页面填写了信息之后,点击注册,我们后端怎么获取信息呢?
前端的页面:
提交的信息是一个表单,使用POST提交,所以在后端我们可以这样获取
后端获取信息写在views.py里:使用request.POST.get()
获取提交表单的信息,注意这里的参数,必须和前端表单里的参数一致
from django.views import View
class RegisterView(View):
def post(self, request: HttpRequest):
'''处理用户提交的注册信息'''
# 1、提取数据
# username
# password
# password2
# mobile
# sms_code
# allow
username = request.POST.get("username")
password = request.POST.get("password")
password2 = request.POST.get("password2")
mobile = request.POST.get("mobile")
sms_code = request.POST.get("sms_code")
allow = request.POST.get("allow")
尽管前端页面可以帮助我们校验大部分的数据,但是我们为了防止黑客绕过前端,向我们服务器发起非法请求,所以我们还是要对数据进行校验
- 判断前端的数据获取的是否完整:all()函数作用是当其中字段为空时会返回false
if not all([username, password, password2, mobile, sms_code, allow]):
return HttpResponseForbidden("参数不完整")
- 匹配用户名是否合法:
读懂正则表达式:r 表示正则表达式开始:[]里内容表示一个字符满足的条件,这里是0-9的数字,或者是所有字母,或者是下划线、中划线,然后一共有5-20个这样的字符
import re
if re.match(r"[0-9a-zA-Z_-]{5,20}", username) is None:
return HttpResponseForbidden("用户名必须是5-20 个字母、数字、下划线、中划线")
- 匹配手机号是否规范
你可能会这样写:
import re
if re.match(r"1[3,9]\d{9}",mobile)
但是我们是这样写的:我们还要加上开头和结尾匹配,防止一大串数字恰好匹配上
if re.match(r"^1[3-9]\d{9}$", mobile) is None:
return HttpResponseForbidden("手机号不规范")
- 查看用户是否勾选用户协议:
if allow != "on":
return HttpResponseForbidden("没勾")
其实这些前端都已经帮我们做好了,我们接着来看看后端做的事情:
检查用户名是否重复,判断手机号是否重复
查询数据库的操作
这就需要对models中定义的User表进行查询了
if User.objects.filter(username=username).count() > 0:
return HttpResponseForbidden("用户名重复")
同理对于手机号也是这个操作:
if User.objects.filter(mobile=mobile).count() > 0:
return HttpResponseForbidden("手机号重复")
数据校验之后,就是保存数据了
保存注册的数据
通过下面的提示我们可以知道,保存用户信息用的方法是:
User.objects.create_user(username=username, password=password, mobile=mobile)
注册用户之后,我们应该从注册页面直接返回给用户一个登陆成功的主页吧,这个主页就是商城的首页吧,就不会说是注册完成之后,还要用户重新输入账号和密码,影响用户体验
保持登录状态
这里用到了django自带的用户认证模块
from django.contrib.auth import authenticate, login
auth中提供了许多实用方法:
1、authenticate()
提供了用户认证功能,即验证用户名以及密码是否正确,一般需要username 、password两个关键字参数。
如果认证成功(用户名和密码正确有效),便会返回一个 User 对象。
authenticate()会在该 User 对象上设置一个属性来标识后端已经认证了该用户,且该信息在后续的登录过程中是需要的。
user = authenticate(username=username,password = password)
后面就依据这个user 是否为空,来定义到首页
if user is not None:
# 正确,让用户保持登录状态,重定向到首页
login(request,user)
#重定向到首页
return redirect("/")
2、login(HttpRequest, user)
该函数接受一个HttpRequest对象,以及一个经过认证的User对象。
该函数实现一个用户登录的功能。它本质上会在后端为该用户生成相关session数据。
3.create_user()
auth 提供的一个创建新用户的方法,需要提供必要参数(username、password)等。
4.set_password(raw_password)
auth 提供的一个修改密码的方法,接收 要设置的新密码 作为参数。
注意:设置完一定要调用用户对象的save方法!!!
5 check_password(raw_password)
auth 提供的一个检查密码是否正确的方法,需要提供当前请求用户的密码。
密码正确返回True,否则返回False。
最后注册完成之后应该返回商品首页
$ cd ~/projects/WoniuMallRepo/woniu_mall/woniu_mall/apps
$ python ../../manage.py startapp contents
定义首页广告视图
配置首页广告路由:绑定命名空间
在woniumall下的urls下配置:
在content下配置url:
测试首页能否访问: