web开发第七课用户登录
一、cookie和session概念
网站登录后
后面的操作,服务端怎么知道是前面登录的用户操作的呢
http协议被称为无状态协议
访问前面的网页的http请求和访问后面网页的http请求是互不相干的,是独立的
答案是 cookie
cookie是我们访问一个网站时,通常由网站服务器返回的一种标记为cookie类型数据
要求我们存储在浏览器所在的电脑上
以后每次访问本网站时,浏览器都会在http请求中将该数据发送过来
cookie的作用:前端使用
1、比如,用户登录后,服务端可以返回用户的姓名、等级等
2、4k大小限制
3、前端信息可以更改
4、每次请求http消息里面后会带着(隐藏信息不能放里面,而且不能太大)
服务端的使用:sessionid
1、浏览器发出用户登录请求
2、服务器可以在验证通过后,创建一个随机产生的字符串,称之为sessionid,标志着这次登录,放在http响应消息里面,作为一个cookies返回给浏览器
3、同时,自己在一张表(通常是数据库)中记录下类似这样的信息
cdscsdgsgs23derfe4:{
userid:23,
username:zhngdsd,
......
}
cdscsdgsgs23derfe4叫sessionid或sessionkey,后面叫session data
返回给浏览器的是id,data是存储在后端的
不会把data存在前端,如果那样,就失去了安全性
sessionid重复的可能性为0,服务端程序保证
实现用户功能
Django内置用户认证登录系统
django.contrib.auth 和 django.contrib.sessions
对应的数据库: auth_user和django_sessions
在settings.py中有
INSTALLED_APPS = [ 'django.contrib.admin', 'django.contrib.auth', 'django.contrib.contenttypes', 'django.contrib.sessions', 'django.contrib.messages', 'django.contrib.staticfiles', 'dandan' ] MIDDLEWARE = [ 'django.middleware.security.SecurityMiddleware', 'django.contrib.sessions.middleware.SessionMiddleware', 'django.middleware.common.CommonMiddleware', 'django.middleware.csrf.CsrfViewMiddleware', 'django.contrib.auth.middleware.AuthenticationMiddleware', 'django.contrib.messages.middleware.MessageMiddleware', 'django.middleware.clickjacking.XFrameOptionsMiddleware',创建两种用户
管理员
python manage.py createsuperuser
学生用户
管理员登录后在web网页上创建
在数据库修改课程
# 修改课程处理 def modify_course(request): record = Course.objects.get(id=request.params['id']) # 由于是json编码,这里需要解码为对象 newdata = json.loads(request.params['newdata']) record.name = newdata['name'] record.desc = newdata['desc'] record.display_idx = newdata['display_idx'] record.save()重定向问题
前端发送的api过来,后端的代码,直接就响应了
并没有验证这个请求是否是一个登录后的用户发出来了
我们需要验证是否是登录用户,如果不是,最好重定向到该用户对应的登录界面
重定向
返回http请求status是320,还有一个目的地地址url
浏览器收到该请求,就自动访问目的地址url
装饰器
但是这是前后端分离,ajax异步请求,但是不刷新
from django.http import JsonResponse def ALR(view_func): def wrapper(request, *args, **kwargs): if request.user.is_authenticated(): return view_func(request, *args, **kwargs) return JsonResponse({'retcode':302,'redirect':'/login.html'}) return wrapper