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:/ ...
随机推荐
- php emoji mysql保存和搜索
MySQL版本>=5.5.3 表字符集: utf8mb4 解决保存 排序规格: utf8mb4_bin 解决搜索 PHP: set names utf8mb4 操作系统: WIN10 MAC
- python输出格式对齐问题
采用.format打印输出时,可以定义输出字符串的输出宽度,在 ':' 后传入一个整数, 可以保证该域至少有这么多的宽度. 用于美化表格时很有用. >>> table = {'Goo ...
- 【搜索】Fliptile
#include<stdio.h> #include<stdlib.h> #include<string.h> ; ; typedef long long ll; ...
- Windows 平台 (UWP)应用设计
Make Your Apps Cooperate with Cross-App Communication : https://rewards.msdn.microsoft.com/Challeng ...
- [js]获取网页屏幕可见区域高度
document.body.clientWidth ==> BODY对象宽度 document.body.clientHeight ==> BODY对象高度 document.docume ...
- Cantor表(NOIP1999)
题目链接:Cantor表 这道题很水,但有的人没看懂题意,这不怪大家,怪题目没说清楚. 给张图: 看到这,你应该明白题目意思了. 先看看有什么规律. 我把这个数列写出来: 1/1,1/2,2/1,3/ ...
- Django之url定义和ORM框架的使用
前言,Django安装 pip install django # 官网安装最新版本 pip install django -i "https://pypi.doubanio.com/simp ...
- Win7 VS2015及MinGW环境编译FFMPEG-20160326
因为又要弄MinGW了,所以顺便把FFMPEG编译了,文章主要参考这篇,防抽所以复制一遍,顺便加些自己的内容 http://blog.csdn.net/finewind/article/details ...
- related work
Traditional approaches, e.g., genetic algorithm (GA) [2] and ant colony optimization (ACO) [3], can ...
- android-基础编程-democoderjoy-架构篇
设计这个demo很简单,针对每个控件放到一个listitem中去,主activity继承之listActivity,这样再override其单击效果进入到每个控件. 主界面流程 1.继承 MainAc ...