要求:
登录注册
班级管理
学员管理
增删改查
1.定义数据库表结构
定义表结构关系
class Classes(models.Model):
caption = models.CharField(max_length=32)
class Student(models.Model):
name = models.CharField(max_length=32)
cls = models.ForeignKey('Classes',on_delete=models.CASCADE,)
username = models.CharField(max_length=32,default="")
password = models.CharField(max_length=32,default="")
class Teacher(models.Model):
name = models.CharField(max_length=32)
username = models.CharField(max_length=32,default="")
password = models.CharField(max_length=32,default="")
cls = models.ManyToManyField('Classes') # 自动生成另外的表
class Administrator(models.Model):
username = models.CharField(max_length=32,default="")
password = models.CharField(max_length=32,default="")
python manage.py makemigrations
python manage.py migrate
2.登录、注册
提交数据:
- Form
- Ajax
登录:
- 成功: 记住状态 <->保持会话
- 失败: 错误提示
3.Cookie
保存在浏览器端的键值对。可以利用其做免密登录
1、保存在用户浏览器
2、可以主动清除
3、也可以被“伪造”(爬虫)
4、跨域名cookie不共享 (各个服务器返回的cookie不同)
5、浏览器可以设置不接收cookie
4.设置cookie属性:
服务端设置的Cookie
url(r'^test.html', views.test)
import datetime
def test(request):
print(request.COOKIES)
obj = HttpResponse('Ok')
obj.set_cookie('k1', 'v1') # 设置cookie对 k1:v1
obj.set_cookie('k1', 'v1', max_age=4) # 10s后失效
v = datetime.datetime.utcnow( ) + datetime.timedelta(seconds=10) # 当前的统一时间加延时10s
obj.set_cookie('k1', 'v1', max_age=10, expires=v)
obj.set_cookie('k3', '333333', max_age=10, expires=v, path='/')
obj.set_cookie('k5', 'v5', max_age=10, expires=v, domain='***')
obj.set_cookie('k7', 'v7', httponly=True)
return obj
获取cookie
url(r'^kk.html', views.kk),
def kk(request):
v = request.COOKIES.get('k7')
return HttpResponse(v)
参数:
path:
/ # 表示设置cookie全局生效 当前域名下所有url。默认
/xxxx/ # 表示只有当前url生效设置cookie
domian:
obj.set_cookie('k4','v4',max_age=10,expires=v,path='/', domain='*******') # 设置的cookie为此域名下操作,默认为None。可以对域名设置,更改本地hosts文件,并放入domain中。
obj.set_cookie('k1','v1')
httponly: # 仅仅HTTP网络传输使用 通过js不可获取 但是可以通过抓包获取
cookie实现免密登录
url(r'^login.html', views.login),
url(r'^index.html', views.index),
def login(request):
message = ""
if request.method == "POST":
user = request.POST.get('user')
pwd = request.POST.get('pwd')
c = models.Administrator.objects.filter(username=user, password=pwd).count() # 判断是否在数据库中
if c:
rep = redirect('/index.html')
rep.set_signed_cookie('username', user)
rep.set_signed_cookie('pwd', '1231456')
return rep
else:
message = "用户名或密码错误"
return render(request,'login.html', {'msg': message}) # 传参数为空字符串
def index(request):
# 如果用户已经登录,获取当前登录的用户名。否则,返回登录页面
username = request.get_signed_cookie('username')
if username:
return render(request, 'index.html', {'username': username})
else:
return redirect('/login.html')
login.html
<head>
<meta charset="UTF-8">
<title>Title</title>
<style>
label{
width: 80px;
text-align: right;
display: inline-block;
}
</style>
</head>
<body>
<form action="login.html" method="post">
<div>
<label for="user">用户名:</label>
<input id="user" type="text" name="user" />
</div>
<div>
<label for="pwd">密码:</label>
<input id="pwd" type="password" name="pwd" />
</div>
<div>
<label> </label>
<input type="submit" value="登录" />
<span style="color: red;">{{ msg }}</span>
</div>
</form>
</body>
index.html
<body>
<h1>Hello {{ username }}</h1>
<a href="/logout.html">注销</a>
</body>
客户端浏览器上操作cookie
jquery插件
url(r'^js_cookie$', views.js_cookie),
<head>
<meta charset="UTF-8">
<title>Title</title>
<script src="/static/jquery-2.1.4.min.js"></script>
<script src="/static/jquery.cookie.js"></script>
</head>
在console下
$.cookie()
//一个参数:
$.cookie('zzz') 获取值
//二个参数:
$.cookie('k','v',{'path': '/js_cookie'}) //可以加和后端一样的参数 expires支持两种形式
Cookie的应用
登录认证
普通cookie
- obj.set_cookie(‘k7’,‘v7’)
- 敏感信息不宜放置在cookie中,可以放在数据库,频繁操作数据库
签名的cookie
- obj.set_signed_cookie(‘k7’,‘v7’)
- 敏感信息(可能会解密) 仍不宜放置在cookie中,敏感信息放在数据库,频繁操作数据库
cookie做认证时,将不敏感的信息放在cookie中,敏感信息放入数据库,频繁操作数据库
5.Session
session是服务器端的一个键值对 保存的是对象 随机字符串。
内部依赖于cookie
# 获取、设置、删除Session中数据
request.session['k1']
request.session.get('k1',None)
request.session['k1'] = 123
request.session.setdefault('k1',123) # 存在则不设置
del request.session['k1']
request.session.clear()
# 获取所有键、值、键值对
request.session.keys()
request.session.values()
request.session.items()
request.session.iterkeys()
request.session.itervalues()
request.session.iteritems()
# 用户session的随机字符串
request.session.session_key
# 将所有Session失效日期小于当前日期的数据删除
request.session.clear_expired()
# 检查用户session的随机字符串 在数据库中是否存在
request.session.exists("session_key")
# 删除当前用户的所有Session数据
request.session.delete("session_key")
session实现免密登录
def login(request):
message = ""
if request.method == "POST":
user = request.POST.get('user')
pwd = request.POST.get('pwd')
c = models.Administrator.objects.filter(username=user, password=pwd).count()
if c:
request.session['is_login3334'] = True
request.session['username3334'] = user
rep = redirect('/index.html')
return rep
else:
message = "用户名或密码错误"
obj = render(request,'login.html', {'msg': message})
return obj
def index(request):
# 如果用户已经登录,获取当前登录的用户名。否则,返回登录页面
username = request.session.get('username3334',None)
if username:
return render(request, 'index.html', {'username': username})
else:
return redirect('/login.html')
def logout(request):
request.session.clear()
return redirect('/login.html')