上衣章节我们知道了浏览器的cookie保存,但是,浏览器存储cookie的方式不太安全,那有没有更好些的来存储登入状态的方式呢???
状态保持----cookie和session:
cookie是保存在浏览器客户端的,而session是保存在服务器端的,相对来说呀哦安全很多。

状态保持:
1、http协议是无状态的:每次请求都是一次新的请求,不会记得之前通信的状态
2、客户端与服务器端的一次通信,就是一次会话实现状态保持的方式:在客户端或服务器端存储与会话有关的数据
3、存储方式包括cookie、session,会话一般指session对象
4、使用cookie,所有数据存储在客户端,注意不要存储敏感信息
5、使用sesison方式,所有数据存储在服务器端,在客户端cookie中存储session_id
6、状态保持的目的是在一段时间内跟踪请求者的状态,可以实现跨页面访问当前请求者的数据
- 注意:不同的请求者之间不会共享这个数据,与请求者一一对应
启用session:
在settings.py文件中,默认是都有的启用的。
INSTALLED_APPS = [
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions', #session
'django.contrib.messages',
'django.contrib.staticfiles',
MIDDLEWARE = [
'django.middleware.security.SecurityMiddleware',
'django.contrib.sessions.middleware.SessionMiddleware',#session
'django.middleware.common.CommonMiddleware',
'django.middleware.csrf.CsrfViewMiddleware',
'django.contrib.auth.middleware.AuthenticationMiddleware',
'django.contrib.messages.middleware.MessageMiddleware',
'django.middleware.clickjacking.XFrameOptionsMiddleware',
注: 使用session之前需要先执行makemigrations,migrate的模型映射文件命令,在数据库中有生成django_session的表格.
使用session:
启用会话后,每个HttpRequest对象将具有一个session属性,它是一个类字典对象
- get(key, default=None):根据键获取会话的值
- flush():删除当前的会话数据并删除会话的Cookie
def s_index(request):
username = request.session.get('username','未登录')
return render(request,'student/s_index.html',context={'username':username})
class Addstudent(View):
def get(self,request):
form_student = StudentForm()
return render(request,'student/s_add.html',context={'form':form_student})
def post(self,request):
form_student = StudentForm(request.POST)
if form_student.is_valid():
student_id = form_student.cleaned_data.get('student_id')
username = form_student.cleaned_data.get('username')
Student.objects.create(s_id=student_id,s_name=username)
return HttpResponse('注册成功')
else:
return HttpResponse('输入不符合,请检查')
def logout(request):
request.session.flush()#删除session
return redirect(reverse('s_index'))
会话过期时间:
- set_expiry(value):设置会话的超时时间
- 如果没有指定,则两个星期后过期
- 如果value是一个整数,会话将在values秒没有活动后过期
- 若果value是一个imedelta对象,会话将在当前时间加上这个指定的日期/时间过期
- 如果value为0,那么用户会话的Cookie将在用户的浏览器关闭时过期
- 如果value为None,那么会话永不过期
def login(request):
if request.method == 'GET':
return render(request, 'student/s_index.html')
elif request.method == 'POST':
username = request.POST.get('username')
request.session['username'] = username #将username保存到session数据库中
request.session.set_expiry(0) #浏览器关闭就失效
return redirect(reverse('s_index'))
会话过期时间:可以不配置,都是默认的选项
我们实现了登录状态的保持了,�接下来,如果需要注册登录呢?
登录注册实现思路:

登录注册第一步--创建模型生成数据表:model.py文件中
from django.db import models
# Create your models here.
class UserModel(models.Model):
username = models.CharField(max_length=20,null=False)
password = models.CharField(max_length=50)
email = models.EmailField()
def __str__(self):
return 'username={},password={},email={}'.format(
self.username,self.password,self.email
)
执行映射文件生成数据表
mysql> show tables;
+----------------------------+
| Tables_in_mydb |
+----------------------------+
| auth_group |
| auth_group_permissions |
| auth_permission |
| auth_user |
| auth_user_groups |
| auth_user_user_permissions |
| db_test_course |
| db_test_course_student |
| db_test_department |
| db_test_stu_detail |
| db_test_student |
| django_admin_log |
| django_content_type |
| django_migrations |
| django_session |
| models_user | #建立的user表
+----------------------------+
16 rows in set (0.00 sec)
form表单的引用:(django的表单比较鸡肋,但是好处是可以做验证,这样可以节省很多代码。)
登录页面和注册页面都会用到form表单来提交数据
当数据提交到后台后,需要在视图函数中去验证数据的合法性.
django中提供了一个form表单的功能,这个表单可以用来验证数据的合法性还可以用来生成HTML代码
今天的登录注册案例我们就来使用这个django自带的form来生成前端页面以及验证数据.
关于django form表单的使用:
1、 创建一个forms.py的文件,放在指定的app当中,然后在里面写表单.
2、表单是通过类实现的,继承自forms.Form,然后在里面定义要验证的字段.
3、 在表单中,创建字段跟模型是一模一样的,但是没有null=True或者blank=True等这几种参数了,有的参数是required=True/False.
4.、使用is_valid()方法可以验证用户提交的数据是否合法,而且HTML表单元素的name必须和django中的表单的name保持一致,否则匹配不到.
5.、is_bound属性:用来表示form是否绑定了数据,如果绑定了,则返回True,否则返回False.
6.、cleaned_data:这个是在is_valid()返回True的时候,保存用户提交上来的数据.
form表单例子:在app中建立form.py 文件
class StudentForm(forms.Form):
username = forms.CharField(max_length=20,min_length=4)
password = forms.CharField(min_length=4,max_length=20,widget=forms.PasswordInput(attrs={'placeholder':'请输入密码'}),
error_messages={'min_length': '密码长度小于4',
'max_length': '密码长度超过20了'})
password_repeat = forms.CharField(min_length=4, max_length=20, widget=forms.PasswordInput(attrs={'placeholder': '请再次输入密码'}),
error_messages={'min_length': '密码长度小于4',
'max_length': '密码长度超过20了'})
email = forms.EmailField()
<body>
<form action="" method="post">{% csrf_token %}
{{ form.as_p }}
<input type="submit" value="提交">
</form>
class Addstudent(View):
def get(self,request):
form_student = StudentForm()
return render(request,'student/s_add.html',context={'form':form_student})
def post(self,request):
form_student = StudentForm(request.POST)
if form_student.is_valid():
username = form_student.cleaned_data.get('username')
password = form_student.cleaned_data.get('password')
password_repeat = form_student.cleaned_data.get('password_repeat')
emial = form_student.cleaned_data.get('email')
if password == password_repeat:
UserModel.object.get(username=username,password=password,email=email)
return HttpResponse('注册成功')
else:
return HttpResponse('注册失败')
form表单中的一些参数说明:
max_length 最大长度
min_length 最小长度
widget 负责渲染网页上HTML 表单的输入元素和提取提交的原始数据
attrs 包含渲染后的Widget 将要设置的HTML 属性
error_messages 报错信息
注:虽然form可以生成前端页面,但这个功能实际用的少,主要是是用form表单的验证功能.
网友评论