第二十二章 Django会话与表单验证

第一课 模板回顾

1.基本操作

def func(req):

return render(req,'index.html',{'val':[1,2,3...]}

#index.html

<h1>{{val.0}}

2.继承:一个html页面只能继承一个模板

extends 'layout.html'

{{ block xxx}}

...

{{endblock}}

3.组件:

{{include tag.html}}

4.自定义函数:

simple_tag:任意参数,不能用于条件。

filter: 参数限制,不能加空格,可以用于条件判断。

第二课 session

1.session的原理:

Cookie是保存在用户客户端的键值对

Session是保存在服务器端的键值对

实例:

def login(req):

if req.method=="GET":

return render(req,'login.html')

elif req.method=="POST":

u=req.POST.get('username')

p=req.POST.get('pwd')

if u=='root' and p=='123':

#1.生成随机字符串

#2.写到用户浏览器cookie

#3.保存到session

#4.在随机字符串对应的字典中设置相关内容...

#1/2/3/4合并为 设置session值

req.session['username']=u

req.session['is_login']=True

if req.POST.get('rmb',None)=='1':

#超时时间,10秒

req.session.set_expiry(10)

return redirect('/index/')

else:

return render(req,'login.html')

def index(req):

#session获取值

if req.session.get('is_login'):

return render(req,'index.html',{'username':req.session['username']})

else:

return HttpResponse('滚')

运行Session之前,需要在命令行输入:

python manage.py makemigrations

python manage.py migrate

2.session的基本操作:

session获取值:

req.session['k1']# 会报错

req.session.get('k1',None) #不会报错

session设置值:

req.session['k1']='v1'

req.session.setdefault('k1',123)#存在则不设置

session删除:

del req.session['k1']

session注销(退出登录):

后台views代码:

def logout(req):

req.session.clear()

return redirect('/login/')

前端代码:

<a href="/logout">注销</a>

session设置超时时间:

req.session.set_expiry(10)#10秒

3.session的配置(setting.py):

SESSION_COOKIE_NAME = "sessionid"

# Session的cookie保存在浏览器上时的key,即:sessionid=随机字符串(默认)

SESSION_COOKIE_PATH = "/"  # Session的cookie保存的路径(默认)

SESSION_COOKIE_DOMAIN = None  # Session的cookie保存的域名(默认)

SESSION_COOKIE_SECURE = False # 是否Https传输cookie(默认)

SESSION_COOKIE_HTTPONLY = True # 是否Session的cookie只支持http传输(默认)

SESSION_COOKIE_AGE = 1209600   # Session的cookie失效日期(2周)(默认)

SESSION_EXPIRE_AT_BROWSER_CLOSE = False  # 是否关闭浏览器使得Session过期(默认)

SESSION_SAVE_EVERY_REQUEST = False # 是否每次请求都保存Session,默认修改之后才保存(默认)

第三课 CSRF

1.基于form表单的post加CSRF:

前端代码:

<form action="/fm/" method="post">

{% csrf_token %}

....

<p><input type="submit" value="提交"></p>

</form>

2.给所有Ajax加CSRF的配置:

前端代码:

<script src="/static/jquery-3.2.1.js"></script>

<script>

$(function () {

$.ajaxSetup({

data: {csrfmiddlewaretoken: '{{ csrf_token }}' }

});

$('#btn').click(function () {

$.ajax({

url:'/login/',

type:'POST',

data:{'user':'root','pwd':'123'},

suceess:function (arg) {

}

})

});

$('#btn2').click(function () {

$.ajax({

url:'/login/',

type:'POST',

data:{'user':'root','pwd':'123'},

suceess:function (arg) {

}

})

})

})

</script>

第四课 中间件(管道)

1.在项目下建立目录:Middle 并在目录下创建py文件:m1.py

m1.py中的代码:

from django.utils.deprecation import MiddlewareMixin

from django.shortcuts import HttpResponse

class row1(MiddlewareMixin):

def process_request(self,req):

print('路人甲')

# return HttpResponse('一旦process_request有返回值就截住啦!')

def process_view(self, request, callback, callback_args, callback_kwargs):

print("中间件1view")

def process_response(self,req,response):

print('路人甲返回')

return response

class row2(MiddlewareMixin):

def process_request(self,req):

print('路人乙')

def process_view(self, request, callback, callback_args, callback_kwargs):

print("中间件2view")

def process_response(self,req,response):

print('路人乙返回')

return response

class row3(MiddlewareMixin):

def process_request(self,req):

print('路人丙')

def process_view(self, request, callback, callback_args, callback_kwargs):

print("中间件3view")

def process_response(self,req,response):

print('路人丙返回')

return response

2.在setting.py文件中MIDDLEWARE 列表中加入代码:

MIDDLEWARE = [

....

'Middle.m1.row1',

'Middle.m1.row2',

'Middle.m1.row3',

]

3.views.py中增加函数:

def test(req):

print('路人丁--》没带钱。')

return HttpResponse('ok')

4.加入url.py路径后,访问路径,运行输出:

路人甲

路人乙

路人丙

中间件1view

中间件2view

中间件3view

路人丁--》没带钱。

路人丙返回

路人乙返回

路人甲返回

5.执行顺序:

1.row1.process_request(self,req)--->row2.process_request(self,req)...

#如果有process_request函数有返回值,则不继续进行。

2.row1.process_view(self,...)--->row2.process_view(self,...)....

3.views.函数

4.row1.process_response(self,req,response)-->row2.process_response(self,req,response)...

5.如果views.函数 在执行中报错了,才会执行的中间件函数:

def process_exception(self,req,exception):

print('错误提示信息')

#感觉可以用于设置一个精美的404界面

第五课 缓存

1.6种缓存模式:

开发调试(不做任何缓存,只是开启)

内存

文件

数据库

Memcache缓存(python-memcached模块)

Memcache缓存(pylibmc模块,只是与上面换了个模块而已)

2.配置:

1.开发调试:

CACHES = {

'default': {

'BACKEND': 'django.core.cache.backends.dummy.DummyCache',# 引擎

'TIMEOUT': 300,           # 缓存超时时间(默认300,None表示永不过期,0表示立即过期)

'OPTIONS':{

'MAX_ENTRIES': 300,   # 最大缓存个数(默认300)

'CULL_FREQUENCY': 3,  # 缓存达最大后,剔除缓存比例,即:1/CULL_FREQUENCY(默认3)

},

'KEY_PREFIX': '',        # 缓存key的前缀(默认空)

'VERSION': 1,            # 缓存key的版本(默认1)

'KEY_FUNCTION' 函数名   # 生成key的函数(默认函数会生成为:【前缀:版本:key】)

}

}

2.内存:

# 此缓存将内容保存至内存的变量中

# 配置:

CACHES = {

'default': {

'BACKEND': 'django.core.cache.backends.locmem.LocMemCache',

'LOCATION': 'unique-snowflake',

}

}

# 注:其他配置同开发调试版本

3.文件:

# 此缓存将内容保存至文件

# 配置:

CACHES = {

'default': {

'BACKEND': 'django.core.cache.backends.filebased.FileBasedCache',

'LOCATION': '/var/tmp/django_cache',

}

}

# 注:其他配置同开发调试版本

4.5.6.略

3.实例(文件):

1.在项目目录下建立cache目录

2.在settings下加入配置代码:

CACHES={

'default':{

'BACKEND':'django.core.cache.backends.filebased.FileBasedCache',

'LOCATION':os.path.join(BASE_DIR,'cache')

}

}

3.在urls.py下增加路径:

path('cache/', views.cache),

4.在views.py下:

1.作用于整个函数的缓存,前端只要调用就使用缓存,给函数加装饰器:

from django.views.decorators.cache import cache_page

@cache_page(10) #对函数进行缓存,10秒钟失效,只要调用就用缓存

def cache(req):

import time

ctime=time.time()

return render(req,'cache.html',{'ctime':ctime})

2.局部使用缓存(适用范围更广一些)只引入模块,不加装饰器:

from django.views.decorators.cache import cache_page

def cache(req):

import time

ctime=time.time()

return render(req,'cache.html',{'ctime':ctime})

在前端html文件中:#############最常用

{% load cache %}

<html>

....

{% cache 10 c1 %}  #10秒钟失效

<h1>{{ ctime }}</h1>

{% endcache %}

...

</html>

3.整个全站设置缓存,使用中间件(几乎没有应用场景)

第六课 信号(作用于函数内部方法的’装饰器‘):

第七课 Form组件验证(用于注册,比modelform定制性强):

1.templates目录下新建fm.html文件:

...

<style>

.c1{

background-color: blue;

}

</style>

...

<form action="/fm/" method="post">

{% csrf_token %}

<p>{{ obj.user }}{{ obj.errors.user.0 }}</p>

<p>{{ obj.pwd }}{{ obj.errors.pwd.0 }}</p>

<p>{{ obj.email }}{{ obj.errors.email.0 }}</p>

<p><input type="submit" value="提交"></p>

</form>

...

2.views.py下:

from django.forms import Form

from django.forms import fields

from django.forms import widgets

class FM(Form):

user=fields.CharField(error_messages={'required':'用户名不能为空'})

#变量名自动匹配前端传过来的name值

pwd=fields.CharField(

max_length=12,

min_length=6,

error_messages={'required':'密码不能为空','max_length':'密码长度不能大于12','min_length':'密码长度不能小于6'},

widget=widgets.PasswordInput(attrs={'class':'c1'})

)

email=fields.EmailField(error_messages={'required':'邮箱不能为空','invalid':'邮箱格式错误!'})

def fm(req):

if req.method=='GET':

obj=FM()

return render(req,'fm.html',{'obj':obj})

elif req.method=='POST':

#获取用户所有数据

#每条数据的请求验证

#成功:获取所有正确的信息

#失败:显示错误信息

obj=FM(req.POST)

r1=obj.is_valid()

print(r1)#数据是否符合要求,成功:True 失败:False

if r1:

print(obj.is_valid())

else:

print(obj.errors)

return render(req,'fm.html',{'obj':obj})

第二十二章 Django会话与表单验证第一课 模板回顾1.基本操作def func(req):return render(req,'index.html',{'val':[1,2,3...]}#index.html<h1>{{val.0}}2.继承:一个html页面只能继承一个模板extends 'layout.html'{{ block xxx}}...{{endblock}}3.组件:{{include tag.html}}4.自定义函数:simple_tag:任意参数,不能用于条件。 filter: 参数限制,不能加空格,可以用于条件判断。第二课 session1.session的原理:Cookie是保存在用户客户端的键值对Session是保存在服务器端的键值对实例:def login(req):if req.method=="GET":return render(req,'login.html')elif req.method=="POST":u=req.POST.get('username')p=req.POST.get('pwd')if u=='root' and p=='123':#1.生成随机字符串#2.写到用户浏览器cookie#3.保存到session#4.在随机字符串对应的字典中设置相关内容...#1/2/3/4合并为 设置session值req.session['username']=ureq.session['is_login']=Trueif req.POST.get('rmb',None)=='1':#超时时间,10秒req.session.set_expiry(10)return redirect('/index/')
else:return render(req,'login.html')def index(req):#session获取值if req.session.get('is_login'):return render(req,'index.html',{'username':req.session['username']})else:return HttpResponse('滚')运行Session之前,需要在命令行输入:python manage.py makemigrationspython manage.py migrate2.session的基本操作:session获取值:req.session['k1']# 会报错req.session.get('k1',None) #不会报错session设置值:req.session['k1']='v1'req.session.setdefault('k1',123)#存在则不设置session删除:del req.session['k1']session注销(退出登录):后台views代码:def logout(req):req.session.clear()return redirect('/login/')前端代码:<a href="/logout">注销</a>session设置超时时间:req.session.set_expiry(10)#10秒3.session的配置(setting.py):SESSION_COOKIE_NAME = "sessionid"# Session的cookie保存在浏览器上时的key,即:sessionid=随机字符串(默认)SESSION_COOKIE_PATH = "/"  # Session的cookie保存的路径(默认)SESSION_COOKIE_DOMAIN = None  # Session的cookie保存的域名(默认)SESSION_COOKIE_SECURE = False # 是否Https传输cookie(默认)SESSION_COOKIE_HTTPONLY = True # 是否Session的cookie只支持http传输(默认)SESSION_COOKIE_AGE = 1209600   # Session的cookie失效日期(2周)(默认)SESSION_EXPIRE_AT_BROWSER_CLOSE = False  # 是否关闭浏览器使得Session过期(默认)SESSION_SAVE_EVERY_REQUEST = False # 是否每次请求都保存Session,默认修改之后才保存(默认)第三课 CSRF1.基于form表单的post加CSRF:前端代码:<form action="/fm/" method="post">{% csrf_token %}....<p><input type="submit" value="提交"></p></form>2.给所有Ajax加CSRF的配置:前端代码:<script src="/static/jquery-3.2.1.js"></script><script>$(function () {$.ajaxSetup({data: {csrfmiddlewaretoken: '{{ csrf_token }}' }});$('#btn').click(function () {$.ajax({url:'/login/',type:'POST',data:{'user':'root','pwd':'123'},suceess:function (arg) {
}})});$('#btn2').click(function () {$.ajax({url:'/login/',type:'POST',data:{'user':'root','pwd':'123'},suceess:function (arg) {}})})})</script>第四课 中间件(管道)1.在项目下建立目录:Middle 并在目录下创建py文件:m1.pym1.py中的代码:from django.utils.deprecation import MiddlewareMixinfrom django.shortcuts import HttpResponseclass row1(MiddlewareMixin):def process_request(self,req):print('路人甲')# return HttpResponse('一旦process_request有返回值就截住啦!')def process_view(self, request, callback, callback_args, callback_kwargs):print("中间件1view")def process_response(self,req,response):print('路人甲返回')return responseclass row2(MiddlewareMixin):def process_request(self,req):print('路人乙')def process_view(self, request, callback, callback_args, callback_kwargs):print("中间件2view")def process_response(self,req,response):print('路人乙返回')return responseclass row3(MiddlewareMixin):def process_request(self,req):print('路人丙')def process_view(self, request, callback, callback_args, callback_kwargs):print("中间件3view")def process_response(self,req,response):print('路人丙返回')return response2.在setting.py文件中MIDDLEWARE 列表中加入代码:MIDDLEWARE = [....'Middle.m1.row1','Middle.m1.row2','Middle.m1.row3',]3.views.py中增加函数:def test(req):print('路人丁--》没带钱。')return HttpResponse('ok')4.加入url.py路径后,访问路径,运行输出:路人甲路人乙路人丙中间件1view中间件2view中间件3view路人丁--》没带钱。路人丙返回路人乙返回路人甲返回5.执行顺序:1.row1.process_request(self,req)--->row2.process_request(self,req)...#如果有process_request函数有返回值,则不继续进行。2.row1.process_view(self,...)--->row2.process_view(self,...)....3.views.函数4.row1.process_response(self,req,response)-->row2.process_response(self,req,response)...5.如果views.函数 在执行中报错了,才会执行的中间件函数:def process_exception(self,req,exception):print('错误提示信息')#感觉可以用于设置一个精美的404界面第五课 缓存1.6种缓存模式:开发调试(不做任何缓存,只是开启)内存文件数据库Memcache缓存(python-memcached模块)Memcache缓存(pylibmc模块,只是与上面换了个模块而已)2.配置:1.开发调试:CACHES = {            'default': {                'BACKEND': 'django.core.cache.backends.dummy.DummyCache',# 引擎                'TIMEOUT': 300,           # 缓存超时时间(默认300,None表示永不过期,0表示立即过期)                'OPTIONS':{                    'MAX_ENTRIES': 300,   # 最大缓存个数(默认300)                    'CULL_FREQUENCY': 3,  # 缓存达最大后,剔除缓存比例,即:1/CULL_FREQUENCY(默认3)                },                'KEY_PREFIX': '',        # 缓存key的前缀(默认空)                'VERSION': 1,            # 缓存key的版本(默认1)                'KEY_FUNCTION' 函数名   # 生成key的函数(默认函数会生成为:【前缀:版本:key】)}}2.内存:# 此缓存将内容保存至内存的变量中# 配置:CACHES = {'default': {'BACKEND': 'django.core.cache.backends.locmem.LocMemCache','LOCATION': 'unique-snowflake',}}
# 注:其他配置同开发调试版本3.文件:# 此缓存将内容保存至文件# 配置:
CACHES = {'default': {'BACKEND': 'django.core.cache.backends.filebased.FileBasedCache','LOCATION': '/var/tmp/django_cache',}}# 注:其他配置同开发调试版本4.5.6.略3.实例(文件):1.在项目目录下建立cache目录2.在settings下加入配置代码:CACHES={'default':{'BACKEND':'django.core.cache.backends.filebased.FileBasedCache','LOCATION':os.path.join(BASE_DIR,'cache')}}3.在urls.py下增加路径:path('cache/', views.cache),4.在views.py下:1.作用于整个函数的缓存,前端只要调用就使用缓存,给函数加装饰器:from django.views.decorators.cache import cache_page@cache_page(10) #对函数进行缓存,10秒钟失效,只要调用就用缓存def cache(req):import timectime=time.time()return render(req,'cache.html',{'ctime':ctime})2.局部使用缓存(适用范围更广一些)只引入模块,不加装饰器:from django.views.decorators.cache import cache_pagedef cache(req):import timectime=time.time()return render(req,'cache.html',{'ctime':ctime})在前端html文件中:#############最常用{% load cache %}<html>....{% cache 10 c1 %}  #10秒钟失效<h1>{{ ctime }}</h1>{% endcache %}...</html>3.整个全站设置缓存,使用中间件(几乎没有应用场景)第六课 信号(作用于函数内部方法的’装饰器‘):略第七课 Form组件验证(用于注册,比modelform定制性强):1.templates目录下新建fm.html文件:...<style>.c1{background-color: blue;}</style>...<form action="/fm/" method="post">{% csrf_token %}<p>{{ obj.user }}{{ obj.errors.user.0 }}</p><p>{{ obj.pwd }}{{ obj.errors.pwd.0 }}</p><p>{{ obj.email }}{{ obj.errors.email.0 }}</p><p><input type="submit" value="提交"></p></form>...2.views.py下:from django.forms import Formfrom django.forms import fieldsfrom django.forms import widgetsclass FM(Form):user=fields.CharField(error_messages={'required':'用户名不能为空'})#变量名自动匹配前端传过来的name值pwd=fields.CharField(max_length=12,min_length=6,error_messages={'required':'密码不能为空','max_length':'密码长度不能大于12','min_length':'密码长度不能小于6'},widget=widgets.PasswordInput(attrs={'class':'c1'}))email=fields.EmailField(error_messages={'required':'邮箱不能为空','invalid':'邮箱格式错误!'})def fm(req):if req.method=='GET':obj=FM()return render(req,'fm.html',{'obj':obj})elif req.method=='POST':#获取用户所有数据#每条数据的请求验证#成功:获取所有正确的信息#失败:显示错误信息obj=FM(req.POST)r1=obj.is_valid()print(r1)#数据是否符合要求,成功:True 失败:Falseif r1:print(obj.is_valid())else:print(obj.errors)return render(req,'fm.html',{'obj':obj})

第二十二章 Django会话与表单验证的更多相关文章

  1. 《Linux命令行与shell脚本编程大全》 第二十二章 学习笔记

    第二十二章:使用其他shell 什么是dash shell Debian的dash shell是ash shell的直系后代,ash shell是Unix系统上原来地Bourne shell的简化版本 ...

  2. Gradle 1.12用户指南翻译——第二十二章. 标准的 Gradle 插件

    其他章节的翻译请参见: http://blog.csdn.net/column/details/gradle-translation.html 翻译项目请关注Github上的地址: https://g ...

  3. 第二十二章 跳出循环-shift参数左移-函数的使用 随堂笔记

    第二十二章 跳出循环-shift参数左移-函数的使用 本节所讲内容: 22.1 跳出循环 22.2 Shift参数左移指令 22.3 函数的使用 22.4 实战-自动备份mysql数据库和nginx服 ...

  4. “全栈2019”Java多线程第二十二章:饥饿线程(Starvation)详解

    难度 初级 学习时间 10分钟 适合人群 零基础 开发语言 Java 开发环境 JDK v11 IntelliJ IDEA v2018.3 文章原文链接 "全栈2019"Java多 ...

  5. “全栈2019”Java异常第二十二章:try-with-resources语句详解

    难度 初级 学习时间 10分钟 适合人群 零基础 开发语言 Java 开发环境 JDK v11 IntelliJ IDEA v2018.3 文章原文链接 "全栈2019"Java异 ...

  6. “全栈2019”Java第二十二章:控制流程语句中的决策语句if-else

    难度 初级 学习时间 10分钟 适合人群 零基础 开发语言 Java 开发环境 JDK v11 IntelliJ IDEA v2018.3 文章原文链接 "全栈2019"Java第 ...

  7. python 教程 第二十二章、 其它应用

    第二十二章. 其它应用 1)    Web服务 ##代码 s 000063.SZ ##开盘 o 26.60 ##最高 h 27.05 ##最低 g 26.52 ##最新 l1 26.66 ##涨跌 c ...

  8. 20190925 On Java8 第二十二章 枚举

    第二十二章 枚举 基本 enum 特性 创建 enum 时,编译器会为你生成一个相关的类,这个类继承自 Java.lang.Enum. valueOf() 是在 Enum 中定义的 static 方法 ...

  9. Introduction to 3D Game Programming with DirectX 12 学习笔记之 --- 第二十二章:四元数(QUATERNIONS)

    原文:Introduction to 3D Game Programming with DirectX 12 学习笔记之 --- 第二十二章:四元数(QUATERNIONS) 学习目标 回顾复数,以及 ...

随机推荐

  1. SpringMvc4.x--@ControllerAdvice注解

    通过@ControllerAdvice.我们可以将对于控制器的全局配置放置在同一个位置,注解了@ControllerAdvice的类的方法可以使用@ExceptionHandler,@InitBind ...

  2. _3_body_标签

    创:20_3_2017修:5_4_2017 什么是div标签? div 双 -- div标签没有任何默认属性 -可以任意写入样式和内容,和 水一样,水自然平凡而又最多 什么是h1标签? h1 标题(双 ...

  3. 《UNIX实用教程》读书笔记

    原著:<Just Enough UNIX>  Fifth Edition  [美]Paul K.Andersen 译著:<UNIX实用教程> 第5版 宋虹 曾庆冬 段桂华 杨路 ...

  4. XML,HTML,XHTML

    对于上面3种技术,我们经常使用到,这里具体的做一个总结,来对比一下这3个东西. 什么是XML? XML即Extentsible Markup Language(可扩展标记语言),是用来定义其它语言的一 ...

  5. restful 风格的理解

    rest   其实就是representation    status   transfer(表现层状态转换) restful 风格的API具有如下特征: 1. 每个URI  包含一种资源,而且URI ...

  6. php之快速排序

     <?phpfunction shell_sort(array $arr){        $right=$left = array();    $Rights=$Lefts = array() ...

  7. NodeJs实现他人项目实例

    1.简单实例,参考 https://github.com/alsotang/node-lessons/tree/master/lesson2 2.express一个新项目 ,但出现警告 发现少了nod ...

  8. Mybatis使用过程问题总结

    Mybatis配置文件 test语句问题 字符串比较问题 示例语句:<if test="isIbatis == 'Y'"></if> 问题:NumberEx ...

  9. Linux普通用户使用sudo权限启停apache服务

    sudo的工作过程如下: 1,用户执行sudo时,系统会主动寻找/etc/sudoers文件,判断该用户是否有执行sudo的权限 2,确认用户具有可执行sudo的权限后,让用户输入密码确认 3,若密码 ...

  10. make和makefile简明基础

    0.make.makefile是什么? makefile定义了一系列的规则,来规定哪些部分先编译,哪些部分后编译,写好makefile以后,只需一个make命令就可以让整个工程完全自动编译,所以简单的 ...