Django

  1. 状态保持
  2. 用户状态例子
  3. 实现注册登陆实例
    1. django forms 表单的使用
    2. 注册功能
    3. 登陆功能

 

状态保持cookie和session

  • 1.http协议是无状态的:每次请求都是一次新的请求,不会记得之前通信的状态
  • 2.客户端与服务器端的一次通信,就是一次会话实现状态保持的方式:在客户端或服务器端存储与会话有关的数据
  • 3.存储方式包括cookie、session,会话一般指session对象
  • 4. 使用cookie,所有数据存储在客户端,注意不要存储敏感信息
  • 5.使用sesison方式,所有数据存储在服务器端,在客户端cookie中存储session_id
  • 6状态保持的目的是在一段时间内跟踪请求者的状态,可以实现跨页面访问当前请求者的数据
  • - 注意:不同的请求者之间不会共享这个数据,与请求者一一对应

启用session

先确认settings中

这些都是默认开启的,需要操作的是,先执行makemigrations,migrate的模型映射文件命令,在数据库中有生成django_session的表格.

用户登陆状态例子:

home.html

<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
<style>
</style>
</head>
<body>
欢迎用户:{{ username }}
<br>
<a href="{% url 'ss_login' %}">登陆</a><br>
<a href="{% url 'ss_logout' %}">退出</a>
</body>
</html>

login.html

<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>登陆</title>
<style>
</style>
</head>
<body>
<form action="" method="post">{% csrf_token%}
<br>
<input type="text" name="username"><br>
<input type="submit" value="提交">
</form>
</body>
</html>

session_form/urls.py

from django.urls import path
from . import views urlpatterns = [
path('home/', views.home, name='ss_home'),
path('login_test/', views.login_test, name='ss_login'),
path('logout_test/', views.logout_test, name='ss_logout'),
]

session_form/views.py

from django.shortcuts import render, redirect, reverse
from django.http import HttpResponse
# Create your views here. def home(request):
# 主页面
username = request.session.get('username', '未登录')
return render(request, 'session_form/home.html', locals()) # locals方法,自动传参 def login_test(request):
# 登陆
if request.method == 'POST':
username = request.POST.get('username')
if username:
request.session['username'] = username
request.session.set_expiry(0) # 关闭浏览器就过期
return redirect(reverse('ss_home'))
return HttpResponse('请输入用户名')
else:
return render(request, 'session_form/login.html') def logout_test(request):
# 退出
request.session.flush()
return redirect(reverse('ss_home'))
  • 1.一个既可读又可写的类似于字典的对象,表示当前的会话.
  • 2.在登录中使用request.session设置一个登录的信息.
  • 3.在主页面中获取设置的值,然后传给模板.
  • 4.使用request.session.flush()清除会话数据.
     
  • - set_expiry(value):设置会话的超时时间
  • - 如果没有指定,则两个星期后过期
  • - 如果value是一个整数,会话将在values秒没有活动后过期
  • - 若果value是一个imedelta对象,会话将在当前时间加上这个指定的日期/时间过期
  • - 如果value为0,那么用户会话的Cookie将在用户的浏览器关闭时过期
  • - 如果value为None,那么会话永不过期

可以不设置,这些都是默认设置

结果展示:

这时查看数据库dgango_session,就有一条数据

点击退出

再看django_session

实现注册登陆实例

思路:

先创建模型生成注册表,用来存放注册的数据

session_form/models.py

from django.db import models

# Create your models here.
class User_Form(models.Model):
username = models.CharField(max_length=10, unique=True)
password = models.CharField(max_length=30)
email = models.EmailField(max_length=20)

映射文件:makemigrations         migrate

关于django forms 表单的使用:

  • 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的时候,保存用户提交上来的数据.

作用:

  • 可以生成前端代码,也可以用作验证数据的合法性

forms中的参数说明:

  • max_length  最大长度
  • min_length  最小长度
  • widget  负责渲染网页上HTML 表单的输入元素和提取提交的原始数据
  • attrs  包含渲染后的Widget 将要设置的HTML 属性
  • error_messages 报错信息

注意:虽然forms可以生成前端代码,但这个功能很少用到,主要是用来用作表单数据的验证合法性

注册

新建表单文件,forms.py  注册用

from django import forms

class Register(forms.Form):

    # 可以写前端代码,但功能主要在于后台信息的验证

    username = forms.CharField(max_length=10, min_length=2,
error_messages={'min_length': '用户名字长少于2',
'max_length': '用户名不得多于10'})
password = forms.CharField(max_length=15, min_length=4,
widget=forms.PasswordInput(),
attrs={'placeholder': '请输入密码'},
error_messages={
'min_length': '密码长度小于6',
'max_length': '密码长度超过8了'
})
password_repeat = forms.CharField(widget=forms.PasswordInput())
email = forms.EmailField()

再创建注册的页面  register.html

<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
<style>
</style>
</head>
<body>
<form action="" method="post">{% csrf_token %}
{#里面使用的时forms.py创建的表单#}
{{ register_form.as_p }}
<input type="submit" value="提交">
</form>
</body>
</html>

session_form/views.py

from django.contrib.auth.hashers import make_password
from django.views import View
from .forms import RegisterForm
from .models import User_Form class Register(View): def get(self, request):
register_form = RegisterForm()
return render(request, 'session_form/register.html', locals()) def post(self, request):
form = RegisterForm(request.POST) # 获取表单提交上来的数据
if form.is_valid(): # 如果数据符合规则
username = form.cleaned_data.get('username')
password = form.cleaned_data.get('password')
password_repeat = form.cleaned_data.get('password_repeat')
email = form.cleaned_data.get('email')
if password == password_repeat:
         # password = make_password(password) # 给密码加密,在数据库中就看不到真正的密码
user = User_Form()
user.username = username
user.password = password
user.email = email
user.save()
return redirect(reverse('ss_login'))
return HttpResponse('注册失败')
print(form.errors)
return HttpResponse(form.errors)

配置好url

from django.urls import path
from . import views urlpatterns = [
path('home/', views.home, name='ss_home'),
path('login/', views.LoginTest.as_view(), name='ss_login'),
path('login_test/', views.login_test, name='login_test'), # 状态保持的login
path('logout_test/', views.logout_test, name='ss_logout'),
path('register/', views.Register.as_view(), name='ss_register'),
]

就可以看到注册页面了

注册信息符合规则以后,就会再数据库中显示出来

登陆

创建一个登陆页面login_form.html

<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>登陆</title>
<style>
</style>
</head>
<body>
<form action="" method="post">{% csrf_token %}
{{ form.as_p }}
<input type="submit" value="提交">
</form>
</body>
</html>

session_form/forms.py

from django import forms

class LoginForm(forms.Form):
username = forms.CharField(max_length=10, min_length=2,)
password = forms.CharField(max_length=15, min_length=4,
widget=forms.PasswordInput())

这里使用了表单的验证合法性,并没有使用生成前端代码的功能

views.py

from django.contrib.auth.hashers import check_password
from .forms import LoginForm class LoginTest(View): def get(self, request):
     form = LoginForm()return render(request, 'session_form/login_form.html', locals()) def post(self, request):
form = LoginForm(request.POST)
if form.is_valid():
username = form.cleaned_data.get('username')
password = form.cleaned_data.get('password')
user = User_Form.objects.filter(username=username, password=password)
if user:
       # if check_password(password.user[0].password): # 还可以这样判断
request.session['username'] = username
return redirect(reverse('ss_home'))
return redirect(reverse('ss_register'))
print(form.errors)
return HttpResponse(form.errors)

url配置还是前面的

现在使用前面注册的账号来登陆

查看数据库django_session

这样就完成了注册和登陆的功能

Django——11 状态保持 form表单 登陆注册样例的更多相关文章

  1. Django 11 form表单(状态保持session、form表单及注册实现)

    Django 11 form表单(状态保持session.form表单及注册实现) 一.状态保持 session 状态保持 #1.http协议是无状态的:每次请求都是一次新的请求,不会记得之前通信的状 ...

  2. Django基础,Day5 - form表单投票详解

    投票URL polls/urls.py: # ex: /polls/5/vote/ url(r'^(?P<question_id>[0-9]+)/vote/$', views.vote, ...

  3. Django框架获取各种form表单数据

    Django中获取text,password 名字:<input type="text" name="name"><br><br& ...

  4. Django学习系列之Form表单结合ajax

      Forms结合ajax Forms的验证流程: 定义用户输入规则的类,字段的值必须等于html中name属性的值(pwd= forms.CharField(required=True)=<i ...

  5. Django框架详细介绍---Form表单

    一.概述 在HTML页面中,利用form表单向后端提交数据时,需要编写input等输入标签并用form标签包裹起来,与此同时,在很多应用场景之下需要对用户输入的数据校验,例如注册登录页面中,校验用户注 ...

  6. form表单简易注册登陆

    注册页面: html <form action="updata.php" method="post" id="text_form"&g ...

  7. 6.4-6.5 使用form表单验证,完善登录页面

    之前是使用自定义的类来实现登录逻辑,现在使用django内置的form表单验证,用继承django的view来实现登录页面. users > views.py 的内容是: from django ...

  8. 前端HTML基础之form表单

    目录 一:form表单 1.form表单功能 2.表单元素 二:form表单搭建(注册页面) 1.编写input会出现黄色阴影问题 三:完整版,前端代码(注册页面) 四:type属性介绍 1.inpu ...

  9. Django学习笔记(6)——Form表单

    知识储备:HTML表单form学习 表单,在前端页面中属于最常见的一个东西了.基本上网站信息的提交都用到了表单,所以下面来学习Django中优雅的表单系统:Form 表单的主要作用是在网页上提供一个图 ...

随机推荐

  1. seq2seq里的数学

    seq2seq模型详解 原创 2017年12月25日 09:41:04 标签: seq2seq / 自然语言 / 机器人   在李纪为博士的毕业论文中提到,基于生成的闲聊机器人中,seq2seq是一种 ...

  2. bzoj 1022 小约翰的游戏John

    题目大意: n堆石子,两个人轮流取石子,每个人取的时候,可以随意选择一堆石子 在这堆石子中取走任意多的石子,但不能一粒石子也不取,取到最后一粒石子的人算输 思路: 首先当每堆石子数都为1时,偶数为先手 ...

  3. 【POJ 3614】 Sunscreen

    [题目链接] http://poj.org/problem?id=3614 [算法] 将MinSPF从大到小排序,每头牛找SPF值最大的防晒霜 [代码] #include <algorithm& ...

  4. 杂项-Java:JMX

    ylbtech-杂项-Java:JMX 1.返回顶部 1. JMX(Java Management Extensions,即Java管理扩展)是一个为应用程序.设备.系统等植入管理功能的框架.JMX可 ...

  5. codeforces 764D

    脑洞 很早以前没有补掉的题目 四色问题肯定使有解的,然后就是怎么构造.注意到边长是奇数,那么我们就可以分类,按左上角坐标的奇偶性分类,正好对应四种颜色.因为当两个矩形左上角横纵坐标奇偶性不同时,那么肯 ...

  6. Map类型介绍与遍历

    声明:本文非原创: 在程序员开发过程中,Map有着利用率占比是非常高:很多时间我们只知其用,不知其理:写这个随笔的目的也是希望对伙伴们对Map的理解有一点帮助. 类型介绍 java自带各种Map类.统 ...

  7. JavaScript--编程练习1

    使用JS完成一个简单的计算器功能.实现2个输入框中输入整数后,点击第三个输入框能给出2个整数的加减乘除. 提示:获取元素的值设置和获取方法为:例:赋值:document.getElementById( ...

  8. 题解报告:hdu 2188 悼念512汶川大地震遇难同胞——选拔志愿者(巴什博弈)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2188 Problem Description 对于四川同胞遭受的灾难,全国人民纷纷伸出援助之手,几乎每 ...

  9. IIS 配置 SVC

    IIS8中添加WCF支持几种方法小结[图文] 方法一 最近在做Silverlight,Windows Phone应用移植到Windows 8平台,在IIS8中测试一些传统WCF服务应用,发现IIS8不 ...

  10. EF 批量插入,sqlhelper 批量插入

    需添加一个using System.Linq; 引用 public void BulkInsert<T>(string connection, string tableName, ILis ...