前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >第二十二章 Django会话与表单验证

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

作者头像
玩蛇的胖纸
发布2018-06-08 13:11:21
5280
发布2018-06-08 13:11:21
举报

第二十二章 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})

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2018-01-14 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
相关产品与服务
消息队列 TDMQ
消息队列 TDMQ (Tencent Distributed Message Queue)是腾讯基于 Apache Pulsar 自研的一个云原生消息中间件系列,其中包含兼容Pulsar、RabbitMQ、RocketMQ 等协议的消息队列子产品,得益于其底层计算与存储分离的架构,TDMQ 具备良好的弹性伸缩以及故障恢复能力。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档