上节内容回顾:
 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 操作的更多相关文章

  1. django cookie session操作

    Cookie是什么? cookie说的直白点就是保存在用户浏览器端的一个键值对,举个例子,你现在登录了京东商城,你把浏览器关闭之后,你再打开京东,你还是可以对你的账户继续操作,已经购买的商品,订单都是 ...

  2. Python学习---django下的Session操作 180205

    和Cookie一样,都是用来进行用户认证.不同的是,Cookie可以吧明文/密文的信息都会KV返回给客户段,但是session可以吧用户的Value[敏感信息]保存在服务器端,安全. Django中默 ...

  3. django 2 ORM操作 ORM进阶 cookie和session 中间件

    ORM操作 ORM概念 对象关系映射(Object Relational Mapping,简称ORM)模式是一种为了解决面向对象与关系数据库存在的互不匹配的现象的技术. 简单的说,ORM是通过使用描述 ...

  4. Python之路【第二十二篇】:Django之Model操作

    Django之Model操作   一.字段 AutoField(Field) - int自增列,必须填入参数 primary_key=True BigAutoField(AutoField) - bi ...

  5. [py][mx]django的cookie和session操作-7天免登录

    浏览器同源策略(same-origin policy) csrf攻击防御核心点总结 django的cookie和session操作-7天免登录 flask操作cookie&django的see ...

  6. Python学习---Django的基础操作180116

    Django创建数据库操作 django流程之model实例 settigs.py:更改Django2.0.1的配置,更新为之前的路径配置 'DIRS': [os.path.join(BASE_DIR ...

  7. python 终级篇 django ---ORM操作

                                       一般操作                                                          必会的 ...

  8. Python自动化运维 - Django(三)CSRF - Cookie&Session

    CSRF跨站请求伪造 CSRF跨站点请求伪造(Cross—Site Request Forgery),跟XSS攻击一样,存在巨大的危害性,你可以这样来理解:攻击者盗用了你的身份,以你的名义发送恶意请求 ...

  9. Django基础之Session操作

    1. 创建一个示例 1.1 第一步 首先创建一个django项目,创建app01, 连接数据库,做好准备工作. 然后在templates目录下创建两个html: login.html负责登录页面: b ...

随机推荐

  1. web进修之—Hibernate 懒加载(6)

    关于懒加载 在关系数据库设计的时候,我们很多时候把表之间的关系设置为强关联(使用外键进行约束),在Hibernate中利用对象的包含关系进行维护(HIbernate本身就是面向对象的数据库操作模式), ...

  2. Linux常用命令之压缩和解压缩命令

    目录 1.压缩解压缩格式 .gz 一.将文件压缩为 .gz 格式,只能压缩文件:gzip 二.将 .gz 文件解压:gunzip 2.压缩解压缩格式 .tar.gz 一.将文件或目录压缩为 .tar. ...

  3. RabbitMQ系列(六)你不知道的RabbitMQ集群架构全解

    前言 本文将系统的介绍一下RabbitMQ集群架构的特点.异常处理.搭建和使用中要注意的一些细节. 知识点 一.为什么使用集群? 二.集群的特点 三.集群异常处理 四.集群节点类型 五.集群搭建方法 ...

  4. 视频人脸检测——Dlib版(六)

    往期目录 视频人脸检测--Dlib版(六) OpenCV添加中文(五) 图片人脸检测--Dlib版(四) 视频人脸检测--OpenCV版(三) 图片人脸检测--OpenCV版(二) OpenCV环境搭 ...

  5. 弹窗查看内容时 内容滚动区域设置为body区

    看到渣浪的查看文章或者查看大图有个效果:弹窗查看内容时,如果内容过长有滚动条,则滚动条会被放到body区滚动 什么意思呢? 看个图片,一般正常弹窗是有宽高限制的,如果内容过长则直接在弹窗中进行滚动 点 ...

  6. HTTP协议学习(一)

    一.HTTP报文的组成 请求报文由 请求行.请求头.请求空行.请求实体四部分组成.其中,请求行和请求头共同组成 请求报文头部 请求行:一行,依次由 请求方法.URI(或者应该说是域名?).HTTP协议 ...

  7. 南大算法设计与分析课程OJ答案代码(5)--割点与桥和任务调度问题

    问题 A: 割点与桥 时间限制: 1 Sec  内存限制: 5 MB提交: 475  解决: 34提交 状态 算法问答 题目描述 给出一个无向连通图,找到所有的割点和桥 输入 第一行:点的个数,如果点 ...

  8. python抓取电影<海王>影评词云生成

    海王是前段时间大热的影片,个人对这种动漫题材的电影并不是很感兴趣.然鹅,最近这部电影实在太热了,正好最近看自然语言处理的时候,无意间发现了word cloud这个生成词云的库,还蛮好玩的,那就抓抓这部 ...

  9. Linux学习笔记之基本指令

    1.ll 注:详细展示当前文件夹下的所有文件及目录  ,与 ls -al 有异曲同工的作用 2.free -m/-h 注:-m:显示当前的内存信息,-m表示以MB为单位显示:-h:以人类能读懂的形式显 ...

  10. Prism 学习:从本地目录加载 Module

    在 Prism 中,将外部模块加载到主程序有以下几种方式:Code.XAML.配置文件.指定模块目录:其中,如果要使用 Code 方式来加载 Module,则需要将该 Module 引用到当前项目中: ...