上节内容回顾:
 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. 【C#写日志两个简单方法】

    方法一:以日期为日志文件名. public void WriteLog(string msg) { string filePath = AppDomain.CurrentDomain.BaseDire ...

  2. 第一个NHibernateDemo

    什么是Nhibernate,Nhibernate是一个面向.Net环境的对 象/关系数据库映射工具.(ORM) 1.搭建项目基本框架: (1)创建MVC项目,命名为NHShop.Web. (2)依次分 ...

  3. Jenkins结合.net平台工具之Opencover

    首先先介绍一下Opencover是什么,Opencover是.net平台下用于生成单元测试覆盖率报告的一款软件,是.net平台下为数不多的一款免费覆盖率报告工具,类似的工具还有Jetbrains的do ...

  4. mac os下vscode快捷键

    全局 Command + Shift + P / F1 显示命令面板 Command + P 快速打开 Command + Shift + N 打开新窗口 Command + W 关闭窗口 基本 Co ...

  5. [转]php中 curl模拟post发送json并接收json

    本文转自:https://blog.csdn.net/pangchengyong0724/article/details/52103962 本地模拟请求服务器数据,请求数据格式为json,服务器返回数 ...

  6. .NET里面 abstract class和Interface有什么区别以及用法的展现?

    前言 很多新人对这个问题已经看到的厌倦或者是恶心了,有可能是因为比较难理解或者是未理解的情况下对它们的认知不够所以产生的想法是差不多,不用抽奖类和接口我一样能实现我想要的功能. 这句话确实不假,但是实 ...

  7. c#金额转换成中文大写金额

    2018-08-24 转别人 c#金额转换成中文大写金额 /// <summary> /// 金额转换成中文大写金额 /// </summary> /// <param ...

  8. [android] 采用pull解析xml文件

    /***********2016年5月6日 更新**********************/ 知乎:Android 中有哪几种解析 xml 的类,官方推荐哪种 ? 以及它们的原理和区别? 刘吉财: ...

  9. 【Tomcat】上线部署tomcat。常用命令

    ps -ef | grep tomcat-web [查询tomact进程]kill -9 pid [结束tomcat进程]/opt/tomcat-web/bin/startup.sh [启动tomca ...

  10. Win7录制电脑屏幕视频

    在日常生活中,有时候我们需要在电脑上录制视频,那就需要找到一款合适的录像工具,选择迅捷屏幕录像工具就是一个不错的选择,操作简单轻松易上手,美轮美奂的无损画质,教学视频.电影.游戏等都可以进行录制哦! ...