一、注册
1.创建用户model
from django.db import models
# Create your models here.
class User(models.Model):
u_name = models.CharField(max_length=20)
u_password = models.CharField(max_length=255)
u_ticket = models.CharField(max_length=20)
class Meta:
db_table = 'p427_user'
2.创建url
from django.conf.urls import url
from axf_app import views
urlpatterns = [
url(r'^regist/', views.regist, name='regist'),
]
3.创建views
知识点:
1.获取页面上传的文件
request.FILES.get()
def regist(request):
if request.method == 'GET':
return render(request, 'day6_regist.html')
if request.method == 'POST':
User.objects.create(
u_name=request.POST.get('name'),
u_password=request.POST.get('password'),
)
return HttpResponseRedirect('/uauth/login/')
二、登陆
1.创建url
urlpatterns = [
url(r'^login/', views.login, name='login'),
]
2.创建views
知识点:
1.set_cookie()
给浏览器的cookies绑定参数,如上把ticket绑定在cookies中,参数max_age 表示最大存货时间,单位时秒;也可以使用 expires,表示过期时间。
def login(request):
if request.method == 'GET':
return render(request, 'day6_login.html')
if request.method == 'POST':
name = request.POST.get('name')
if User.objects.filter(u_name=name).exists():
user = User.objects.get(u_name=name)
if user.u_password == request.POST.get('password'):
# ticket = 'dssfssfsf'
s = 'qwertyuiopasdfghjklzxcvbnm1234567890'
ticket = ''
for i in range(15):
# 获取随机字符串
ticket += random.choice(s)
now_time = int(time.time())
ticket = 'TK_' + ticket + str(now_time)
# response = HttpResponse('登陆成功')
response = HttpResponseRedirect('/stuapp/index/')
# max_age 存活时间 / ticket 保存的最长时间
response.set_cookie('ticket', ticket, max_age=1000)
user.u_ticket = ticket
user.save()
return response
else:
return render(request, 'day6_login.html', {'password': '密码错误'})
else:
return render(request, 'day6_login.html', {'name': '用户名不存在'})
3.中间件 — 判断用户是否登陆
当用户登陆时,给用户生成一个ticket,同时存于页面和服务器。当用户做其他操作时(跳转页面),通过ticket的值判断用户是否登陆,只有登陆成功的用户才能进行一系列操作。
比如进入淘宝页面,若想要查看购物车或订单都需要先验证用户是否登陆,若用户登陆成功,可查询该用户的数据,返回对应页面,若用户未登陆,跳转至登陆页面。
from django.utils.deprecation import MiddlewareMixin
from django.http import HttpResponseRedirect
from uauth.models import User
class AuthMiddleware(MiddlewareMixin):
def process_request(self, request):
# 统一验证是否登陆
# return None 或者不写return 才会继续往下执行
if request.path == '/uauth/login/' or request.path == '/uauth/regist/':
return None
ticket = request.COOKIES.get('ticket')
if not ticket:
return HttpResponseRedirect('/uauth/login/')
users = User.objects.filter(u_ticket=ticket)
if not users:
return HttpResponseRedirect('/uauth/login/')
# 在request中存储当前登陆的用户
request.user = users[0]
cookie知识点:
a.页面保存cookie的ticket属性
参数:
max_age - 最大存货时间,单位:秒
expires - 过期时间,是一个年月日时间
b.获取页面cookie的ticket值
c.删除页面cookie的ticket值
4.退出登陆
用户退出登陆,删除页面和服务器中的ticket。由于用户每次重新登陆时都会生成新的ticket,并且更新服务器中ticket的内容,所以此处服务器中的ticket可以不用删除。
def logout(request):
if request.method == 'GET':
response = HttpResponseRedirect('/uauth/login/')
response.delete_cookie('ticket')
return response