python Django session/cookie
一, Cookie
#cookie # def cook1(request): # print(request.COOKIES) # 查看cooke # # print(request.get_signed_cookie('k2',salt='uuu')) # rep = HttpResponse('ok') # 设置cook 必须在响应里面设置 # # rep.set_cookie('k1',123) # 普通的cooke # # rep.set_signed_cookie('k2',666,salt='uuu') # 加密的cookie salt加严 # # # rep.set_cookie('k999',123,path='/cooke1/') # 添加路径表示只有在当前url下才会生效 # rep.set_cookie('k888',123) # return rep # def cook2(request): # print(request.COOKIES) # 查看cooke # rep = HttpResponse('ok') # return rep
1、获取Cookie:
1 request.COOKIES['key'] 2 request.get_signed_cookie(key, default=RAISE_ERROR, salt='', max_age=None) 3 参数: 4 default: 默认值 5 salt: 加密盐 6 max_age: 后台控制过期时间
2、设置Cookie:
1 rep = HttpResponse(...) 或 rep = render(request, ...) 2 3 rep.set_cookie(key,value,...) 4 rep.set_signed_cookie(key,value,salt='加密盐',...) 5 参数: 6 key, 键 7 value='', 值 8 max_age=None, 超时时间 9 expires=None, 超时时间(IE requires expires, so set it if hasn't been already.) 10 path='/', Cookie生效的路径,/ 表示根路径,特殊的:跟路径的cookie可以被任何url的页面访问 11 domain=None, Cookie生效的域名 12 secure=False, https传输 13 httponly=False 只能http协议传输,无法被JavaScript获取(不是绝对,底层抓包可以获取到也可以被覆盖)
由于cookie保存在客户端的电脑上,所以,JavaScript和jquery也可以操作cookie。
1 <script src='/static/js/jquery.cookie.js'></script> 2 $.cookie("list_pager_num", 30,{ path: '/' });
Session
Django中默认支持Session,其内部提供了5种类型的Session供开发者使用:
- 数据库(默认)
- 缓存
- 文件
- 缓存+数据库
- 加密cookie
1、数据库Session
Django默认支持Session,并且默认是将Session数据存储在数据库中,即:django_session 表中。a. 配置 settings.pySESSION_ENGINE = 'django.contrib.sessions.backends.db' # 引擎(默认) 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,默认修改之后才保存(默认) b. 使用def index(request):# 获取、设置、删除Session中数据request.session['k1']request.session.get('k1',None)request.session['k1'] = 123request.session.setdefault('k1',123) # 存在则不设置del request.session['k1']# 所有 键、值、键值对 request.session.keys()request.session.values()request.session.items()request.session.iterkeys()request.session.itervalues()request.session.iteritems()# 用户session的随机字符串 request.session.session_key# 将所有Session失效日期小于当前日期的数据删除 request.session.clear_expired()# 检查 用户session的随机字符串 在数据库中是否request.session.exists("session_key")# 删除当前用户的所有Session数据request.session.delete("session_key")...
2、缓存Session
a. 配置 settings.pySESSION_ENGINE = 'django.contrib.sessions.backends.cache' # 引擎SESSION_CACHE_ALIAS = 'default' # 使用的缓存别名(默认内存缓存,也可以是memcache),此处别名依赖缓存的设置 SESSION_COOKIE_NAME = "sessionid" # Session的cookie保存在浏览器上时的key,即:sessionid=随机字符串SESSION_COOKIE_PATH = "/" # Session的cookie保存的路径SESSION_COOKIE_DOMAIN = None # Session的cookie保存的域名SESSION_COOKIE_SECURE = False # 是否Https传输cookieSESSION_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,默认修改之后才保存 b. 使用同上
3、文件Session
a. 配置 settings.pySESSION_ENGINE = 'django.contrib.sessions.backends.file' # 引擎SESSION_FILE_PATH = None # 缓存文件路径,如果为None,则使用tempfile模块获取一个临时地址tempfile.gettempdir() # 如:/var/folders/d3/j9tj0gz93dg06bmwxmhh6_xm0000gn/T SESSION_COOKIE_NAME = "sessionid" # Session的cookie保存在浏览器上时的key,即:sessionid=随机字符串SESSION_COOKIE_PATH = "/" # Session的cookie保存的路径SESSION_COOKIE_DOMAIN = None # Session的cookie保存的域名SESSION_COOKIE_SECURE = False # 是否Https传输cookieSESSION_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,默认修改之后才保存 b. 使用同上
4、缓存+数据库Session
数据库用于做持久化,缓存用于提高效率a. 配置 settings.pySESSION_ENGINE = 'django.contrib.sessions.backends.cached_db' # 引擎 b. 使用同上
5、加密cookie Session
a. 配置 settings.pySESSION_ENGINE = 'django.contrib.sessions.backends.signed_cookies' # 引擎 b. 使用同上
扩展:Session用户验证
def login(func):def wrap(request, *args, **kwargs):# 如果未登陆,跳转到指定页面if request.path == '/test/':return redirect('http://www.baidu.com')return func(request, *args, **kwargs)return wrap
csrf 跨站请求伪造
一、简介
django为用户实现防止跨站请求伪造的功能,通过中间件 django.middleware.csrf.CsrfViewMiddleware 来完成。而对于django中设置防跨站请求伪造功能有分为全局和局部。
全局:
中间件 django.middleware.csrf.CsrfViewMiddleware
局部:
- @csrf_protect,为当前函数强制设置防跨站请求伪造功能,即便settings中没有设置全局中间件。
- @csrf_exempt,取消当前函数防跨站请求伪造功能,即便settings中设置了全局中间件。
注:from django.views.decorators.csrf import csrf_exempt,csrf_protect
csrf :Django 有两种 :全局配置和 装饰器默认的是全局配置:settings 中设置了'django。middleware.csrf.CsrfViewMiddleware'必须遵循规则 {% csrf_token%}views: render如果 某一个函数上添加了 装饰器 @csrf_exempt 那么它就会失效 不必遵循以上规则去掉' django。middleware.csrf.CsrfViewMiddleware' 时所有的地方都失效如果非要在一个地方用到csrf可以加上装饰器 @csrf_protoct则要必须遵循规则 {% csrf_token%}views: rendercsrftoken存在于两个地方 浏览器 和 cookie 中
二、应用
1、普通表单
veiw中设置返回值:return render_to_response('Account/Login.html',data,context_instance=RequestContext(request)) 或者return render(request, 'xxx.html', data)html中设置Token:{% csrf_token %}
2、Ajax
对于传统的form,可以通过表单的方式将token再次发送到服务端,而对于ajax的话,使用如下方式。
view.py
from django.template.context import RequestContext # Create your views here.def test(request):if request.method == 'POST':print request.POSTreturn HttpResponse('ok')return render_to_response('app01/test.html',context_instance=RequestContext(request))
text.html
<!DOCTYPE html> <html> <head lang="en"><meta charset="UTF-8"><title></title> </head> <body>{% csrf_token %}<input type="button" οnclick="Do();" value="Do it"/><script src="/static/plugin/jquery/jquery-1.8.0.js"></script><script src="/static/plugin/jquery/jquery.cookie.js"></script><script type="text/javascript">var csrftoken = $.cookie('csrftoken');function csrfSafeMethod(method) {// these HTTP methods do not require CSRF protectionreturn (/^(GET|HEAD|OPTIONS|TRACE)$/.test(method));}$.ajaxSetup({beforeSend: function(xhr, settings) {if (!csrfSafeMethod(settings.type) && !this.crossDomain) {xhr.setRequestHeader("X-CSRFToken", csrftoken);}}});function Do(){$.ajax({url:"/app01/test/",data:{id:1},type:'POST',success:function(data){console.log(data);}});}</script> </body> </html>
+
Form验证
django中的Form一般有两种功能:
- 输入html-----------不能你自己写一些标签,而帮你自动生成
- 验证用户输入-------将用户验证信息保存起来,可以传到前段
#!/usr/bin/env python # -*- coding:utf-8 -*- from django.shortcuts import render,HttpResponse from app.froms import Form1 from app import models def form1(request):if request.method == 'POST':# request.POST.get('user',None)# request.POST.get('pwd',None)f1 = Form1(request.POST) #request.POST用于获取数据,这里的f1和下面的f2不一样,这里有参数可以获取错误信息if f1.is_valid():print(f1.cleaned_data)#验证成功,获取用户信息else:print(f1.errors) # 验证错误,获取错误信息return render(request,'account/from.html',{'f':f1})else:f2 = Form1() #这里的f2不能获取信息return render(request,'account/from.html',{'f':f2})return HttpResponse('OK')
Views
复制代码 <!DOCTYPE html> <html lang="en"> <head><meta charset="UTF-8"><title>Title</title> </head> <body> <form action="/from1/" method="post"><div>{{ f.user }}{% if f.errors.user.0 %}<span>{{ f.errors.user.0 }}</span>{% endif %}</div><div>{{ f.pwd }}{% if f.errors.pwd.0 %}<span>{{ f.errors.pwd.0 }}</span>{% endif %}</div><div>{{ f.email }}{% if f.errors.email.0 %}<span>{{ f.errors.email.0 }}</span>{% endif %}</div><div><input type="submit" value="提交"></div> </form> </body> </html>
form.html
#!/usr/bin/env python # -*- coding:utf-8 -*- from django import formsclass Form1(forms.Form):user = forms.CharField(widget=forms.TextInput(attrs={'class':'c1'}),error_messages={'required':'用户名不能为空'},)pwd = forms.CharField(max_length=4,min_length=2)email = forms.EmailField(error_messages={'required':'邮箱不能为空','invalid':'邮箱格式错误'})
forms.py
1、<form action="/from1/" method="post">中url必须要包括在/xxx/中间,因为,无论你在路由中有没有写最后的/在跳转的时候,浏览器都会为你自动加上,所以你必须加上,不然会报错
2、input标签你自己可以在html中创建,也可以利用djanjo创建,利用djanjo创建的好处是,当你在input标签中写入数据后,提交刷新页面的时候,数据还存在,因为在你写的f1 = Form1(request.POST)中已经存在你所输入的数据
3、在render(requset,{})中传参数的时候,既可以用local()进行传递,又可以用字典进行传递
4、后台获取数据的时候,不能通过索引进行取值,例f['user']会报错,应该通过 . 进行获取值
5、request.method == 'POST' 其中的POST,必须大写,不然会报错
一、forms.CharField()中参数总结
required=False --------------------可以为空,默认为Ture不能为空
max_length=10 --------------------最多10个字符
mix_length=10 --------------------最少10个字符
error_messages={'required':'用户名不能为空','min_length':'标题最少为5个字符','max_length':'标题最多为20个字符'}----自定义错误信息
widget=forms.TextInput()--------------默认是input标签
widget=forms.Textarea()----------------文本标签
widget=forms.TextInput(attrs={'class': "form-control", 'placeholder': '邮箱'}),------为标签设置class属性以及显示
下拉框,参数choices=xxx是固定格式,参数a的形式必须写成下面这种形式,当我们往数据库中添加数据的时候,在不从新启动服务的情况下,下拉框中的数据不会更新,因为类下的静态字段只创建一次,创建对象只执行__init__方法,所以必须在创建对象执行__init__方法的时候再一次执行一下静态字段就可以达到更新的目的
a = (
(6,'乒乓球'),
(1,'足球'),
(2,'篮球'),
(3,'手球'),
)
forms.CharField( widget=forms.Select(choices=a) )
自定制验证规则:
自己可以自定义验证规则,加到里面
from django.core.exceptions import ValidationError from django import forms import re def mobile_validate(value):mobile_re = re.compile(r'^(13[0-9]|15[012356789]|17[678]|18[0-9]|14[57])[0-9]{8}$')if not mobile_re.match(value):raise ValidationError('手机号码格式错误') pwd = forms.CharField(validators=[mobile_validate, ],error_messages={'required': u'手机不能为空'},widget=forms.TextInput(attrs={'class': "form-control",'placeholder': u'手机号码'}))
#!/usr/bin/env python # -*- coding:utf-8 -*- import re from django import forms from django.core.exceptions import ValidationErrordef mobile_validate(value):mobile_re = re.compile(r'^(13[0-9]|15[012356789]|17[678]|18[0-9]|14[57])[0-9]{8}$')if not mobile_re.match(value):raise ValidationError('手机号码格式错误')class PublishForm(forms.Form):user_type_choice = ((0, u'普通用户'),(1, u'高级用户'),)user_type = forms.IntegerField(widget=forms.widgets.Select(choices=user_type_choice,attrs={'class': "form-control"}))title = forms.CharField(max_length=20,min_length=5,error_messages={'required': u'标题不能为空','min_length': u'标题最少为5个字符','max_length': u'标题最多为20个字符'},widget=forms.TextInput(attrs={'class': "form-control",'placeholder': u'标题5-20个字符'}))memo = forms.CharField(required=False,max_length=256,widget=forms.widgets.Textarea(attrs={'class': "form-control no-radius", 'placeholder': u'详细描述', 'rows': 3}))phone = forms.CharField(validators=[mobile_validate, ],error_messages={'required': u'手机不能为空'},widget=forms.TextInput(attrs={'class': "form-control",'placeholder': u'手机号码'}))email = forms.EmailField(required=False,error_messages={'required': u'邮箱不能为空','invalid': u'邮箱格式错误'},widget=forms.TextInput(attrs={'class': "form-control", 'placeholder': u'邮箱'}))
form
转载于:https://www.cnblogs.com/pythonxiaokang/p/5808163.html
python Django session/cookie相关推荐
- python Django Session,CSRF,Model操作,Form验证,中间件,缓存,信号
Django Session,CSRF,Model操作,Form验证,中间件,缓存,信号 Session CSRF Model 操作 Form 验证 中间件 缓存 信号 1,Session 基于coo ...
- Python Django session存取值代码演示及jsonpickle序列化
- Python Django Session中存取值常用API
- Python Django 使用cookie实现三天免登录及记住密码功能代码示例
- Django 的cookie 与 session组件
Cookie概述 什么叫Cookie Cookie翻译成中文是小甜点,小饼干的意思.在HTTP中它表示服务器送给客户端浏览器的小甜点.其实Cookie是key-value结构,类似于一个python中 ...
- django组件-cookie与session
1.什么是会话跟踪技术 我们首先了解一下什么是会话!可以把会话理解为客户端与服务器之间的一次会晤,在一次会晤中可能会包含多次请求和响应,例如你给10086了电话,你就是客户端,而10086服务人员就是 ...
- Django之Cookie、Session、CSRF、Admin
Django之Cookie.Session.CSRF.Admin Cookie 1.获取Cookie: 1 2 3 4 5 6 request.COOKIES[ 'key' ] request.get ...
- Django之Cookie和 Session
简单版 1.Cookie:保存在客户端浏览器上的键值对 Django操作cookie obj = HttpResponse() return obj obj = render() return obj ...
- python - Django
django的生命周期: 发送http请求-->nginx服务器-->uwsgi服务器-->中间件-->路由-->视图-->ORM-->从ORM获取数据返回视 ...
最新文章
- 打开完成查看的CAD图纸如何一键进行打印?
- 绝大多数人没玩过也没见过的现象:20个MYSQL进程共用1个3306端口
- Leetcode--23.合并K个排序链表(Java)
- 超34款吸费手机被曝光下架 天语TCL大显等在其中
- 化工原理物性参数_化工原理
- iPhone13 系列售价曝光:没有涨价;曝华为P50系列7月29日发布;丁磊称专业比学校更重要:你同意吗?|极客头条...
- 工业互联网为什么落地这么难?
- 【HDU5008】Boring String Problem(后缀数组+二分查找+st表)
- 使用LSTM生成序列、自动问答使用?分割即可!
- 应届生应不应该参加培训????
- “华为”云桌面终端CT3200+显示器、键盘和鼠标
- 000-EMC 深入解读-目录
- Flutter第一天
- mac 装java ecli_Eclipse下Maven安装和配置
- 虹科技术 | 快速准确测量0.05m-500m--虹科dimetix激光测距传感器的优势
- err = Problems with launching via XPC. XPC error : Connection interrupted (0x00000005)
- 线上活动重大事故总结
- 【附源码】计算机毕业设计SSM校园论坛
- IEEE Transactions on Industrial Informatics(TII)投稿须知
- win10 自带截图工具 SnippingTool
热门文章
- VS2013写window服务,实现定时短信功能
- Scala / Java - 采用 MD5 加盐 实现 id 均匀分组
- 这一届 NFT 正用“躺平”和“暗黑”对抗熊市
- idea zookeeper插件使用_最新IntelliJ IDEA 神级超级牛逼插件推荐(自用,真的超级牛逼)...
- Android 源码编译
- 算法6.10 迪杰斯特拉算法
- 机器学习—集成学习(ensemble learning)
- mysql日期用什么类型_mysql存储日期使用什么类型
- 硬件黑客破解之固件分析
- 【前端 H5】模仿网易云音乐 CSS 加js 实现留声机效果 H5