第二十二章 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. sed 变量替换和Linux的特殊符号大全

    1 sed支持两种方式的变量替换,建议使用下面的第二种,比较简单 这样就可以给变量a赋值很多特殊字符了,比如 赋值a='!@#¥%……' sed -n 's/echo/'"$a"' ...

  2. SVN错误:Attempted to lock an already-locked dir的解决

    问题: SVN locked,文件被锁无法更新,SVN上更新代码失败,某些文件提示错误:Attempted to lock an already-locked dir 解决方法: 右键具体文件→Tea ...

  3. MS SQL 批量给存储过程/函数授权

    在工作当中遇到一个类似这样的问题:要对数据库账户的权限进行清理.设置,其中有一个用户Test,只能拥有数据库MyAssistant的DML(更新.插入.删除等)操作权限,另外拥有执行数据库存储过程.函 ...

  4. 【转】软件开发工具介绍之 6.Web开发工具

    [本文转自http://www.cnblogs.com/dusonchen/archive/2011/02/09/1739087.html ] 1.EditPlus 无论是编写xhtml页面,还是cs ...

  5. 《css定位 position》课程笔记

    这是我学习课程css定位 position时做的笔记! 本节内容 html的三种布局方式 position可选参数 z-index 盒子模型和定位的区别 侧边栏导航跟随实例 html的三种布局方式 三 ...

  6. nodejs爬虫笔记(五)---利用nightmare模拟点击下一页

    目标 以腾讯滚动新闻为例,利用nightmare模拟点击下一页,爬取所有页面的信息.首先得感谢node社区godghdai的帮助,开始接触不太熟悉nightmare,感觉很高大上,自己写代码的时候问题 ...

  7. 【转】用Linux命令行获取本机外网IP地址

    $ curl ifconfig.me $ curl icanhazip.com $ curl ident.me $ curl ipecho.net/plain $ curl whatismyip.ak ...

  8. cache.config文件配置模板

    # # cache.config # # The purpose of this file is to alter caching parameters of # specific objects o ...

  9. srs2录制flv文件metadata不准确

    测试环境:server:srs2client:librestreaming / yasea srs 配置 dvr录制24分钟flv文件. e:\flv $ ll total drwxr-xr-x Ad ...

  10. android adb shell and monkey 学习记录

    Monkey环境: android SDK and JDK SDK目录下的platform-tools和tools目录要配置环境变量 查看版本: ADB 的安装这里就不多说了,输入以下命令有如下提示就 ...