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:/ ...
随机推荐
- Activiti 5.18启动流程到完成所有任务之间的数据库变化(转)
来写一下Activiti 5.18版本从启动流程到整个流程结束之间数据库表的变化 先给出流程图,很简单的流程,就是两个UserTask: 代码如下: DeploymentBuilder builder ...
- [转载]How To Install Nginx And PHP-FPM On CentOS 6 Via Yum
http://www.lifelinux.com/how-to-install-nginx-and-php-fpm-on-centos-6-via-yum/ http://blog.csdn.net/ ...
- Bootstrap的起步
-- Bootstrap的起步部分是对Bootstrap的基本了解,有些细节只是在后面的完善时候需要详细阅读. 最基本点还是Css 和组件部分,这部分应该先进行练习....高级阶段是Javascrip ...
- canvas 实现飘浮桥效果
var canvas = document.getElementById('canvas'); var cxt = canvas.getContext('2d'); var timer; var iS ...
- 一窥kbmmw中的 smart service
在kbmmw 的新版中(还没有发布),将会有一个叫做smart service 的服务.这种服务的属性基于服务器端,并且可以自动注册服务名,下面就是一个简单例子代码.这个服务里面有有三个发布的函数:e ...
- mybatis拦截器案例之获取结果集总条数
最近做的项目前端是外包出去的,所以在做查询分页的时候比较麻烦 我们需要先吧结果集的条数返回给前端,然后由前端根据页面情况(当前页码,每页显示条数)将所需参数传到后端. 由于在项目搭建的时候,是没有考虑 ...
- 2018.11.08 NOIP模拟 景点(倍增+矩阵快速幂优化dp)
传送门 首先按照题意构造出转移矩阵. 然后可以矩阵快速幂求出答案. 但是直接做是O(n3qlogm)O(n^3qlogm)O(n3qlogm)的会TTT掉. 观察要求的东西发现我们只关系一行的答案. ...
- openstack之虚拟机管理命令
在控制节点上建hzb-openrc.sh export OS_PROJECT_DOMAIN_ID=default export OS_USER_DOMAIN_ID=default export OS_ ...
- Linux无法解析gitlib的地址--修改dns
搞的一个js鉴权认证,先跳转到 gitlib,登录后跳转到我们公司测试接口的页面: 公司gitlib地址:gitlab.cmread.com [INFO][2018-12-17 15:29:00,18 ...
- AngularJS实战之cookie的读取
<!DOCTYPE html> <html ng-controller="cookies_controller"> <head> <tit ...