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:/ ...
随机推荐
- ListView item中有button或EditText时 点击事件失效问题的解决
加入:android:descendantFocusability="blocksDescendants" 代码如下: <LinearLayout xmlns:android ...
- 20175316盛茂淞-Java第1周学习总结
20175316盛茂淞 2018-2019-2 <Java程序设计>第1周学习总结 教材学习内容总结 Java入门 1.Java简介(地位,特点) 2.安装JDK,设置系统环境 3.编译J ...
- 2018.01.04 bzoj5291: [Bjoi2018]链上二次求和(线段树)
传送门 线段树基础题. 题意:给出一个序列,要求支持区间加,查询序列中所有满足区间长度在[L,R][L,R][L,R]之间的区间的权值之和(区间的权值即区间内所有数的和). 想题555分钟,写题202 ...
- 2018.10.29 bzoj4564: [Haoi2016]地图(仙人掌+莫队)
传送门 根据原图建一棵新的树. 把原图每一个环上除了深度最浅的点以外的点全部向深度最浅的点连边. 然后可以搞出来一个dfsdfsdfs. 这个时候我们就成功把问题转换成了对子树的询问. 然后就可以对权 ...
- asp.net core跨平台开发从入门到实战文摘
第1章 .NET Core 第2章 dotnet命令 第3章 VS Code安装及介绍 第4章 VS2015开发.NET Core 第5章 ASP.NET Core 第6章 EF Core 第7章 A ...
- hashable/iterable与orderable
################ # hashable协议 # ################ # 一个对象能被称为hashable,它必须实现__hash__与_eq__方法: >>& ...
- Router pipeline
from 2013-HPCA-Breaking the On-Chip Latency Barrier Using SMART book_Principles and Practices of Int ...
- A-论文一些好的句子
Using our techniques, task set transformation is performed by modifying the parameters related to ea ...
- vs2015转到定义没反应
开始菜单 -->所有程序-->Visual Studio 文件夹 --> Visual Studio Tools -->VS2015开发人员命令提示输入DOS命令: CD Co ...
- idea intellij对Spring进行单元测试
1.加入Junit4及SpringJUnit4支持 <!-- junit --> <dependency> <groupId>junit</groupId&g ...