python第一百零八天---Django 3 session 操作
上节内容回顾:
1、请求周期
url> 路由 > 函数或类 > 返回字符串或者模板语言? Form表单提交:
提交 -> url > 函数或类中的方法
- ....
HttpResponse('....')
render(request,'index.html')
redirect('/index/')
用户 < < 返回字符串
(当接受到redirect时)自动发起另外一个请求
--> url ..... Ajax:
$.ajax({
url: '/index/',
data: {'k': 'v', 'list': [1,2,3,4], 'k3': JSON.stringfy({'k1': 'v'}))}, $(form对象).serilize()
type: 'POST',
dataType: 'JSON':
traditional: true,
success:function(d){
location.reload() # 刷新
location.href = "某个地址" # 跳转
}
})
提交 -> url -> 函数或类中的方法
HttpResponse('{}')
render(request, 'index.html', {'name': 'v1'})
<h1>{{ name }}</h1> -->
<h1>v1</h1> XXXXXXX redirect...
用户 <<<<< 字符串 2、路由系统URL
a. /index/ -> 函数或类
b. /index/(\d+) -> 函数或类
c. /index/(?P<nid>\d+) -> 函数或类
d. /index/(?P<nid>\d+) name='root' -> 函数或类
reverse()
{% url 'root' 1%}
e. /crm/ include('app01.urls') -> 路由分发 f. 默认值
url(r'^index/', views.index, {'name': 'root'}),#在url设置默认值 def index(request,name):#相关函数需要设置接收的形参
print(name)
return HttpResponse('OK') g. 命名空间 /admin/ include('app01.urls',namespace='m1')
/crm/ include('app01.urls',namespace='m1') app01.urls
/index/ name = 'n1' reverser('m1:n1') 3、后台取数据
def func(request):
request.POST
request.GET
request.FILES
request.getlist
request.method
request.path_info return render,HttpResponse,redirect 4、模板语言
render(request, 'index.html')
# for
# if
# 索引. keys values items all 5、 数据库 models操作
#创建一个表结构
class User(models.Model):
username = models.CharField(max_length=32)
email = models.EmailField() 有验证功能
Django Admin
无验证功能:
User.objects.create(username='root',email='asdfasdfasdfasdf')
User.objects.filter(id=1).update(email='') #创建一个表结构 用户属性表
class UserType(models.Model):
name = models.CharField(max_length=32) #创建一个表结构 用户信息表
class User(models.Model):
username = models.CharField(max_length=32)
email = models.EmailField()
user_type = models.ForeignKey("UserType")#外键 关联 UserType 表 user_list = User.objects.all()#获取User表,所有记录
for obj user_list:
obj.username,obj.email,obj.user_type_id,obj.user_type.name,obj.user_type.id user = User.objects.get(id=1)#获取ID为1 的记录 为对象
user. User.objects.all().values("username","user_type__name",)#获取所有记录 的username 和 跨表的name class UserType(models.Model):
name = models.CharField(max_length=32) #创建一个表结构 用户信息表
class User(models.Model):
username = models.CharField(max_length=32)
email = models.EmailField()
user_type = models.ForeignKey("UserType")#外键 关联
m = models.ManyToMany('UserGroup')#与 UserGroup 的 第三张关联表 多对多 #创建一个表结构 用户组表 多对多
class UserGroup(models.Model):
name = .... obj = User.objects.get(id=1)#获取记录对象
obj.m.add(2)#对第三张表进行添加关联
obj.m.add(2,3)
obj.m.add(*[1,2,3]) obj.m.remove(...)#对第三张表进行删除关联 obj.m.clear()#清除当前记录的所有关联关系 obj.m.set([1,2,3,4,5])#设置关联 (重新所有的设置) # 多个组,UserGroup对象
obj.m.all()#
obj.m.filter(name='CTO')#筛选出其中的一个组对象
知识点:
Views
- 请求的其他信息
from django.core.handlers.wsgi import WSGIRequest
request.environ
request.environ['HTTP_USER_AGENT']#请求头
- 装饰器
FBV:
def auth(func):
def inner(reqeust,*args,**kwargs):
v = reqeust.COOKIES.get('username111')#获取 cookies中的值
if not v:
return redirect('/login/')
return func(reqeust, *args,**kwargs)
return inner
CBV:
from django import views
from django.utils.decorators import method_decorator
#装饰dispatch 后, 等于对类中的每一个函数进行了装饰
@method_decorator(auth,name='dispatch')#类中的 dispatch 为最先执行
class Order(views.View): # @method_decorator(auth)
# def dispatch(self, request, *args, **kwargs):
# return super(Order,self).dispatch(request, *args, **kwargs) # @method_decorator(auth)
def get(self,reqeust):
v = reqeust.COOKIES.get('username111')
return render(reqeust,'index.html',{'current_user': v}) def post(self,reqeust):
v = reqeust.COOKIES.get('username111')
return render(reqeust,'index.html',{'current_user': v})
Templates
- 母版...html
{% extends 'master.html' %}# 继承母版(子级只能继承一个母版) master.html 为母版文件
{% block title %}xxxxx{% endblock %}# 在母版 设置 子级中对应 可添加子级的专属内容
include
{% include 'tag.html' %}#组件 tag.html为组件 (子级可以加入多个组件)
- 自定义函数
simple_tag
a. app下创建templatetags目录
b. 任意xxoo.py文件
c. 创建template对象 register
- from django.utils.safestring import matk_safe
register=template.Library()
d.
@register.simple_tag
def func(a1,a2,a3....)
return "asdfasd"
e. settings中注册APP
f. 顶部 {% load xxoo %}
g. {% 函数名 arg1 arg2 %}
缺点:
不能作为if条件
优点:
参数任意
filter
a. app下创建templatetags目录
b. 任意xxoo.py文件
c. 创建template对象 register
d.
@register.filter
def func(a1,a2)
return "asdfasd"
e. settings中注册APP
f. 顶部 {% load xxoo %}
g. {{ 参数1|函数名:"参数二,参数三" }} {{ 参数1|函数名:数字 }}
缺点:
最多两个参数,不能加空格
优点:
能作为if条件 分页(自定义的分页) XSS:
{{ page_str|safe }} mark_safe(page_str)
示例:
views.py
from utils import pagination
LIST = []
for i in range(500):
LIST.append(i) def user_list(request):
current_page = request.GET.get('p', 1)#页面默认第一页
current_page = int(current_page)#转数字 val = request.COOKIES.get('per_page_count',10) #默认每页 10
print(val)
val = int(val)
page_obj = pagination.Page(current_page,len(LIST),val)#创建类对象 传入 当前页面数值 列表长度 每页显示记录数
#记录数据 开始记录数 结束记录数
data = LIST[page_obj.start:page_obj.end]# 数据记录进行切片取出 page_str = page_obj.page_str("/user_list/")#开始计算显示的页面 return render(request, 'user_list.html', {'li': data,'page_str': page_str})
pagination.py
__author__ = 'Administrator'
from django.utils.safestring import mark_safe class Page:
# 当前所在页面 记录条数统计 页面显示记录数 显示的页面数量
def __init__(self, current_page, data_count, per_page_count=10, pager_num=7):
self.current_page = current_page#当前当前所在页面
self.data_count = data_count#记录条数统计
self.per_page_count = per_page_count#页面显示记录数
self.pager_num = pager_num#显示的页面数量 #开始的记录数
@property#装饰后 不用加()
def start(self):
return (self.current_page - 1) * self.per_page_count #结束记录数
@property
def end(self):
return self.current_page * self.per_page_count #计算当前所有数据 需要的总页面数
@property
def total_count(self):
#商 余 商计算 记录条数统计 页面显示记录数
v, y = divmod(self.data_count, self.per_page_count)
if y:#如果有余数
v += 1#页面数需加1
return v #显示页面的方法函数 base_url为要跳转到的页面 ID
def page_str(self, base_url):
page_list = []#想要显示的页面列表
#当 所有的页面数 小于 想要显示的页面数
if self.total_count < self.pager_num:
#从第一页开始
start_index = 1
#到最后一页
end_index = self.total_count + 1 else:
##当前所在页面数 小于等于 想要显示的页面数的 +1 的一半 ( 总页面数 大于 想要显示的页面数 应对最前面的页面显示)
if self.current_page <= (self.pager_num + 1) / 2:
start_index = 1#第一页面
end_index = self.pager_num + 1#想要显示的页面
else:
#开始页面为选中页面的 前面几页(想要显示页面的+1的一半数, 选中页面保持中间位置 )
start_index = self.current_page - (self.pager_num - 1) / 2
end_index = self.current_page + (self.pager_num + 1) / 2
#如果 当前所在页面数 + 显示页面的 - 1 的一半 大于总页面数,(应对最后面的显示)
if (self.current_page + (self.pager_num - 1) / 2) > self.total_count:
start_index = self.total_count - self.pager_num + 1
end_index = self.total_count + 1 #如果当前为1时
if self.current_page == 1:
#上一页不再跳转
prev = '<a class="page" href="javascript:void(0);">上一页</a>'
else:
prev = '<a class="page" href="%s?p=%s">上一页</a>' % (base_url, self.current_page - 1,)
page_list.append(prev)
#循环 开始显示页面 结束显示页面
for i in range(int(start_index), int(end_index)):
#如果所选中的页面,加CSS样式
if i == self.current_page:
temp = '<a class="page active" href="%s?p=%s">%s</a>' % (base_url, i, i)
else:
temp = '<a class="page" href="%s?p=%s">%s</a>' % (base_url, i, i)
page_list.append(temp)
#如果当前所在页面 等于 最后的页面
if self.current_page == self.total_count:
#下一页不再跳转
nex = '<a class="page" href="javascript:void(0);">下一页</a>'
else:
nex = '<a class="page" href="%s?p=%s">下一页</a>' % (base_url, self.current_page + 1,)
page_list.append(nex)
#跳转页面 input框
jump = """
<input type='text' /><a onclick='jumpTo(this, "%s?p=");'>GO</a>
<script>
function jumpTo(ths,base){
var val = ths.previousSibling.value;
location.href = base + val;
}
</script>
""" % (base_url,) page_list.append(jump)#加入列表 page_str = mark_safe("".join(page_list))#拼接列表为长字符串 return page_str
user_list.html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title></title>
<style>
.pagination .page{
display: inline-block;
padding: 5px;
background-color: cyan;
margin: 5px;
}
.pagination .page.active{
background-color: brown;
color: white;
}
</style>
</head>
<body>
<ul>
{% for item in li %}
{% include 'li.html' %}
{% endfor %}
</ul> <div>
<select id="ps" onchange="changePageSize(this)">
<option value="10">10</option>
<option value="30">30</option>
<option value="50">50</option>
<option value="100">100</option>
</select>
</div> <div class="pagination">
{{ page_str }}
</div>
<script src="/static/jquery-1.12.4.js"></script>
<script src="/static/jquery.cookie.js"></script>
<script> $(function(){
{# var v = $.cookie('per_page_count', {'path': "/user_list/"});#}
var v = $.cookie('per_page_count');
$('#ps').val(v);
}); function changePageSize(ths){
var v = $(ths).val();
console.log(v);
$.cookie('per_page_count',v, {'path': "/user_list/"}); location.reload();
}
</script>
</body>
</html>
cookie
客户端浏览器上的一个文件
{"user": 'dachengzi'} request.COOKIES.get('username111')#获取 COOKIES的内容 response = render(request,'index.html')
response = redirect('/index/')
# 设置cookie,关闭浏览器失效
response.set_cookie('key',"value") # 设置cookie, N秒只有失效
response.set_cookie('username111',"value",max_age=10) # 设置cookie, 截止时间失效
import datetime
current_date = datetime.datetime.utcnow()#现在的时间
current_date = current_date + datetime.timedelta(seconds=5)# 加上5秒
response.set_cookie('username111',"value",expires=current_date)# 等 于5 称后过期
response.set_cookie('username111',"value",max_age=10)
python第一百零八天---Django 3 session 操作的更多相关文章
- django cookie session操作
Cookie是什么? cookie说的直白点就是保存在用户浏览器端的一个键值对,举个例子,你现在登录了京东商城,你把浏览器关闭之后,你再打开京东,你还是可以对你的账户继续操作,已经购买的商品,订单都是 ...
- Python学习---django下的Session操作 180205
和Cookie一样,都是用来进行用户认证.不同的是,Cookie可以吧明文/密文的信息都会KV返回给客户段,但是session可以吧用户的Value[敏感信息]保存在服务器端,安全. Django中默 ...
- django 2 ORM操作 ORM进阶 cookie和session 中间件
ORM操作 ORM概念 对象关系映射(Object Relational Mapping,简称ORM)模式是一种为了解决面向对象与关系数据库存在的互不匹配的现象的技术. 简单的说,ORM是通过使用描述 ...
- Python之路【第二十二篇】:Django之Model操作
Django之Model操作 一.字段 AutoField(Field) - int自增列,必须填入参数 primary_key=True BigAutoField(AutoField) - bi ...
- [py][mx]django的cookie和session操作-7天免登录
浏览器同源策略(same-origin policy) csrf攻击防御核心点总结 django的cookie和session操作-7天免登录 flask操作cookie&django的see ...
- Python学习---Django的基础操作180116
Django创建数据库操作 django流程之model实例 settigs.py:更改Django2.0.1的配置,更新为之前的路径配置 'DIRS': [os.path.join(BASE_DIR ...
- python 终级篇 django ---ORM操作
一般操作 必会的 ...
- Python自动化运维 - Django(三)CSRF - Cookie&Session
CSRF跨站请求伪造 CSRF跨站点请求伪造(Cross—Site Request Forgery),跟XSS攻击一样,存在巨大的危害性,你可以这样来理解:攻击者盗用了你的身份,以你的名义发送恶意请求 ...
- Django基础之Session操作
1. 创建一个示例 1.1 第一步 首先创建一个django项目,创建app01, 连接数据库,做好准备工作. 然后在templates目录下创建两个html: login.html负责登录页面: b ...
随机推荐
- VisualVM远程连接Tomcat
最近项目已经要提测了,有时间来考虑一些性能上的事儿了.之前拜读过<深入理解java虚拟机>,只可惜当时功力尚浅,有些东西还是不太懂,而且应用场景也没有,所以借这次机会看看.当然了,这次并不 ...
- httpd的编译安装
1.环境介绍 系统:2.6.32-279.el6.i686 2.准备编译环境 [root@localhost ~]# yum groupinstall "Server Platform De ...
- linux解压war包的命令
网上很多人说用jar包解压,但jar命令解压时不能指定目录,推荐使用unzip解压war包. 一.命令名: unzip 功 能说明:解压缩zip文 件 语 法:unzip [-cflptuvz][-a ...
- Python numpy中矩阵的用法总结
关于Python Numpy库基础知识请参考博文:https://www.cnblogs.com/wj-1314/p/9722794.html Python矩阵的基本用法 mat()函数将目标数据的类 ...
- hadoop集群无法找到datanode节点问题解决
问题:在配置hadoop集群时,master的50070后台中找不到slave的datanode节点怎么办? 解决: 方法一:首先确认下master和slave的hdfs-site.xml配置中的df ...
- Swing——布局管理器
前言 在编写图形界面时,总是需要考虑的就是组件放在哪里,组件怎么大才合适.在Swing中就有现成的布局管理器帮我们做这些事情,我们不必写代码去一一安排.下面将介绍什么是布局管理器.Swing中常用布局 ...
- 修改wampsever中MySql5.7.14默认为空的密码
①打开WAMP找中MySql控制台,提示输入密码,开始密码为空,直接按回车 ②输入[use mysql],控制台提示[Database changed] ③输入[update user set aut ...
- 2017 ACM/ICPC Asia Regional Shenyang Online(部分题解)
HDU 6197 array array array 题意 输入n和k,表示输入n个整数和可以擦除的次数k,如果至多擦除k次能是的数组中的序列是不上升或者是不下降序列,就是魔力数组,否则不是. 解题思 ...
- vue开发中vue-resource + canvas 图片压缩、上传、预览
1.使用vue-resource上传,也可以自定义ajax上传: 2.使用<input type="file" @change="submit()" na ...
- 《Thinking In Java》---第四版 练习题答案
百度网盘下载:https://pan.baidu.com/share/link?shareid=2111776725&uk=2869544179&app=zd 在线查看:http:// ...