Python3.5 学习二十一
本节内容概要:

上节回顾及补充知识点:
一、请求周期:
URL-》路由-》函数或类-》返回字符串或者模板
Form表单提交:
提交-》url-函数或者类中的方法
-....(执行)
HttpResponse('......')
render(request,'index.html')
redirect('/index/')
返回给用户>>>>>用户 永远都是渲染处理完成的字符串
当接收到一个redirect时,自动发起另外一个请求
Ajax:
$.ajax({
url:'/index/',
data:{'k':'v'},$(form对象).serilize()
type:'POST',
dataType:'JSON':
traditional:true,(写了这个,才能将$(form对象).serilize()列表的值拿到)
success:function(d){
}
error:{
}
})
提交-》url-》函数或类中的方法
-....(执行)
HttpResponse('......')
render(request,'index.html')
不可以使用redirect。。。。。。
返回一个字符串可以,只能ajax后面自己做跳转

二、路由系统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. 默认值
/index/ {'web':'root'} 为函数传递一个值的默认值
def func(request,web):
print(name)
return HttpResponse('OK')
g.命名空间 namespace 用于include时定义名字的,和name起名字相似的意义

底下写错了,应为:
v=reverse('author-polls:detail',kwargs={'pk':11})
{% url 'publisher:detail' pk=12 pp=99 %}

三、视图系统
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、MODEL数据库操作
A、创建类 建立数据库表
class User(models.Model):
username = models.CharField(max_length=32)
email=models.EmailField()
(Django Admin:有验证功能)
User.objects.create(username='',email='dfadfasdfasdf')
User.objects.filter(id=1).update(email='666')
(无验证功能)
B、一对多操作
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")
user_list = User.objects.all()
for obj in user_list:
obj.username,obj.email,obj.user_type_id,obj.user_type.id,obj.user_type.name
user=User.objects.get(id=1) 单个对象
user.
User.objects.all().values("username","user_type__name") 跨表取数据的双下划线方式
C、多对多操作:
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")
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,6]) set跟列表时,不加*号,只保留当前这些列出来的关系
obj.m.all()
#多个组的对象,当前用户所有的组
obj.m.filter(name='CTO')
Views模块补充知识点:
请求的其他信息:
不仅发送数据,还要发送请求头
下面我们来看一下请求头中都有些什么内容可以被使用:
请求的东西都存放在request中,所以根据request对象找到创建他的类WSGIRequest进行查看:
print(type(request))
#封装了所有用户请求的信息
print(request.environ) 返回所有原生数据
如果是常用的,则可以调用request.GET或者request.POST请求处理数据
如果不在其中,只能自己通过environ处理原生数据了
for k,v in request.environ.items():
print(k,v)
可以看到所有请求相关的信息,以字典方式存放
print (request.environ['HTTP_USER_AGENT'])
模板Template知识点补充:
模板的继承:
母版:master.html

继承的子网页:extends

母版可以在CSS样式和JS引入的后面分别跟一个block块,为了子页面可以自定义样式和JS脚本的地方。

子页面中写block内容的顺序与显示无关,可以随意写了
一个子页面只能继承一个母版
模板的引入:include


一个页面只能继承一个母版,但可以include多个html
include的文件也是支持渲染的,Django会先拼凑整合起带各种模板语言标签的文件,最终渲染成一个html
OpenStack后台管理中就有大量的include调用
模板语言内置函数了解
自定义Simple tag:步骤
1、在应用中创建一个叫templatetag的目录,不能叫其他名字
2、在目录中创建任意取名的py文件
3、在py文件中写函数,函数名定义前面要加装饰器,先要创建一个template对象,命名必须叫register
register = template.Libary()
4、通过它去生成一个装饰器
@register.simple_tag
def func(a1,a2...)
这两部的步骤代码如图所示:

5、使用自定义函数前需要注册当前APP
6、想在哪个html页面使用这个自定义函数时,需要在html的顶部load一下 {% load xxoo%}
g、调用时只能用{% %}
h、传参使用空格,多个空格也没关系。

调用自带函数

调用自定义函数:

自定义时有两种方式:
@register.simple_tag 优点:可以多个参数,可以带空格 缺点:不能作为if条件
@register.filter 缺点:只能最多两个参数,不能有空格 优点:可以应用于{% if %}的条件

调用方式同自带函数:{{”参数1”|函数名:”参数2”}}
如果要传多个参数,只能拼凑多个参数成一个字符串传给这两个参数中:
{{“参数1”|函数名:“参数2,参数3”}}
{{”参数1”|”函数名:数字}}
*********PS:如果既有用到extends又用到load,在页面顶部先写extends语句,再写load **********
自定义分页:
前置说明 django自带保护,以避免XSS攻击:
如果要将html部分标记语言放到后端生成后返回给前端,不能在前端直接显示成html内容,只会以字符串形式显示出来
如果要想转换成html内容让浏览器解析标记语言并显示结果,需要说明一下:
两种方式:1 前端 写一个filter过滤
前端:{{ content|safe }}
or 2 后端将字符串包装
from django.utils.safestring import mark_safe
page_str = "...."
page_str = mark_safe(page_str)

分页逻辑:

上一个、下一个、跳转:


最后可以把分页代码整合成一个class类,使用的时候初始化并调用类中的方法即可
如果调用对象的方法,不想加括号的办法,在方法的命名上方增加:@property
在后台分页回传字符串的类方法中增加url参数后,可以真正将这部分分页代码做成一个模块,用于各个地方了。
将类提取出来单独存放,以后可以方便的引入调用。

代码已有,可以针对该类进行使用练习。
Cookie:
存储在了客户端浏览器本地文件中的一个与用户有关的键值对,
通过审查元素->network,发一次请求,找到cookies,就能看到请求的cookies内容




注销时,可以重新设置Cookie的超时时间,让退出后失效。
设置Cookie:response.set_cookie("")
读取Cookie:request.cookies.get("")
基于Cookie的数据显示条目:
Cookie在服务器端、客户端都可以读写
可以使用jQuery的插件Jquery.cookie简单调用,代码如下:

Cookie 加密:

加密加盐类似hashlib加密方式:

用装饰器实现用户认证:
多页面中不需要单独每个页面再认证了
FBV装饰器写法:

CBV装饰器写法:

或

类中装饰器可以在函数方法名前写,更可以直接在类名前写
作业题:
主机管理:
1、单表操作
2、一对多
3、多对多
要求:
a.删除对话框
b.修改、添加时,使用新URL的方式
c.基于cookie进行用户认证(自己写装饰器)
d.定制显示数据条数
e.分页
预习:
Form组件:http://www.cnblogs.com/wupeiqi/articles/6144178.html
Models操作:http://www.cnblogs.com/wupeiqi/articles/6216618.html
Python3.5 学习二十一的更多相关文章
- python3.4学习笔记(十一) 列表、数组实例
python3.4学习笔记(十一) 列表.数组实例 #python列表,数组类型要相同,python不需要指定数据类型,可以把各种类型打包进去#python列表可以包含整数,浮点数,字符串,对象#创建 ...
- 【Mac + Appium + Python3.6学习(二)】之Android自动化测试,appium-desktop配置和简易自动化测试脚本
上一篇文章介绍安装appium测试环境,这一片研究介绍如何测试Android自动化. 上一篇地址:<[Mac + Appium学习(一)]之安装Appium环境> 这一篇参考:<Ma ...
- Python3.5 学习二十四
本节课程大纲: -------------------------------------------------------------------------------------------- ...
- Scala学习二十一——隐式转换和隐式参数
一.本章要点 隐式转换用于类型之间的转换 必须引入隐式转换,并确保它们可以以单个标识符的形式出现在当前作用域 隐式参数列表会要求指定类型的对象.它们可以从当前作用域中以单个标识符定义的隐式对象的获取, ...
- JavaWeb学习 (二十一)————基于Servlet+JSP+JavaBean开发模式的用户登录注册
一.Servlet+JSP+JavaBean开发模式(MVC)介绍 Servlet+JSP+JavaBean模式(MVC)适合开发复杂的web应用,在这种模式下,servlet负责处理用户请求,jsp ...
- Python3.5 学习二十二
回顾: 发送请求时:发送请求头和请求数据 request.META和request.request.body 响应请求时:响应头和响应返回数据 response.HEADER和response.bod ...
- Python3.5 学习二十
学会用三种方法检索数据 1.对象方式 2.字典方式 3.元组方式 models后面,如果是.values() 则为字典方式 如果是value_list() 则为元组方式 跨表操作时,如果是对象,可以用 ...
- Python3.5 学习二
模块/库: Python的强大在于丰富的各种库的存在. 用import方法导入的 分为标准库.第三方库 程序运行时会先从当前目录下寻找import的模块名的文件,如果没有,则去全局环境变量对应的路径 ...
- Salesforce LWC学习(二十一) Error浅谈
本篇参考:https://developer.salesforce.com/docs/component-library/documentation/en/lwc/data_error https:/ ...
随机推荐
- Android Camera后台拍照
http://item.congci.com/item/android-camera-houtai-paizhao 有许多人希望在不让用户知道的情况下,使用Android后台Service调用摄像头拍 ...
- 为什么要使用日志管理?syslog和Windows事件日志
为什么要使用日志管理?syslog和Windows事件日志 日志管理 - 确保网络安全的先决条件 日志给予您有关网络活动的第一手信息.日志管理确保日志中隐藏的网络活动数据转换为有意义的可操作的安全信息 ...
- Scrapy框架爬虫
一.sprapy爬虫框架 pip install pypiwin32 1) 创建爬虫框架 scrapy startproject Project # 创建爬虫项目 You can start your ...
- Mysql 数据库修改datadir和调整默认引擎要注意的问题
数据库更改 datadir 默认位置: 首先前面的基础操作我就不多说了,无非是复制mysqldata目录,然后修改 my.conf 配置文件 datadir 的 路径地址.然后重启mysql.这里可能 ...
- my.ini优化mysql数据库性能的十个参数(推荐)
(1).max_connections:允许的同时客户的数量.增加该值增加 mysqld 要求的文件描述符的数量.这个数字应该增加,否则,你将经常看到 too many connections 错误. ...
- 2018.06.26 NOIP模拟 号码(数位dp)
题目背景 SOURCE:NOIP2015-GDZSJNZX(难) 题目描述 Mike 正在在忙碌地发着各种各样的的短信.旁边的同学 Tom 注意到,Mike 发出短信的接收方手机号码似乎都满足着特别的 ...
- 创建视图&新建表按照视图结构
create view V_tableTemp as select a.* from TEMPCLIENT a ,TEMPCLIENTSTUFF b where a.CORNO<>' ...
- SQL语句or查询,union all查询,分页查询,分组,AND查询
一.OR查询 1.在AND多个筛选条件和一个or条件时,如果没有括号包裹,or会就近原则包裹之后的所有and条件,也就是同级的多个and条件只能对,or条件的一边起作用 2.如果or条件两边的筛选条件 ...
- Tomcat架构解析(一)-----Tomcat总体架构
Tomcat是非常常用的应用服务器,了解Tomcat的总体架构以及实现细节,对于理解整个java web也是有非常大的帮助. 一.Server 1.最简单的服务器结构 最简单的服务器结构如图所示: ...
- Router types
Inq-n. Flits are stored at the input of the router. Each input unit is connected to the switch by as ...