本节内容概要:

上节回顾及补充知识点:

一、请求周期:

  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 学习二十一的更多相关文章

  1. python3.4学习笔记(十一) 列表、数组实例

    python3.4学习笔记(十一) 列表.数组实例 #python列表,数组类型要相同,python不需要指定数据类型,可以把各种类型打包进去#python列表可以包含整数,浮点数,字符串,对象#创建 ...

  2. 【Mac + Appium + Python3.6学习(二)】之Android自动化测试,appium-desktop配置和简易自动化测试脚本

    上一篇文章介绍安装appium测试环境,这一片研究介绍如何测试Android自动化. 上一篇地址:<[Mac + Appium学习(一)]之安装Appium环境> 这一篇参考:<Ma ...

  3. Python3.5 学习二十四

    本节课程大纲: -------------------------------------------------------------------------------------------- ...

  4. Scala学习二十一——隐式转换和隐式参数

    一.本章要点 隐式转换用于类型之间的转换 必须引入隐式转换,并确保它们可以以单个标识符的形式出现在当前作用域 隐式参数列表会要求指定类型的对象.它们可以从当前作用域中以单个标识符定义的隐式对象的获取, ...

  5. JavaWeb学习 (二十一)————基于Servlet+JSP+JavaBean开发模式的用户登录注册

    一.Servlet+JSP+JavaBean开发模式(MVC)介绍 Servlet+JSP+JavaBean模式(MVC)适合开发复杂的web应用,在这种模式下,servlet负责处理用户请求,jsp ...

  6. Python3.5 学习二十二

    回顾: 发送请求时:发送请求头和请求数据 request.META和request.request.body 响应请求时:响应头和响应返回数据 response.HEADER和response.bod ...

  7. Python3.5 学习二十

    学会用三种方法检索数据 1.对象方式 2.字典方式 3.元组方式 models后面,如果是.values() 则为字典方式 如果是value_list() 则为元组方式 跨表操作时,如果是对象,可以用 ...

  8. Python3.5 学习二

    模块/库: Python的强大在于丰富的各种库的存在. 用import方法导入的  分为标准库.第三方库 程序运行时会先从当前目录下寻找import的模块名的文件,如果没有,则去全局环境变量对应的路径 ...

  9. Salesforce LWC学习(二十一) Error浅谈

    本篇参考:https://developer.salesforce.com/docs/component-library/documentation/en/lwc/data_error https:/ ...

随机推荐

  1. Mac 环境通用

    mac 下更新 .bash_profile 文件 1.打开terminal(终端) 2.cd ~ ( 进入当前用户的home目录) 3.open .bash_profile (打开.bash_prof ...

  2. 检测鼠标是否在UI上unity

    public static bool IsCursorOnUI(int inputID=-1){ EventSystem eventSystem = EventSystem.current; retu ...

  3. rails 辅助方法

    rails辅助方法全解: https://ruby-china.github.io/rails-guides/routing.html

  4. 使用Hadoop API 压缩HDFS文件

    下篇解压缩:使用Hadoop API 解压缩 HDFS文件 起因: 集群磁盘剩余空间不足. 删除了存储在HDFS上的,一定时间之前的中间结果,发现并不能释放太多空间,查看计算业务,发现,每天的日志存在 ...

  5. extjs如何使用

    刚学ExtJs 不知道如何使用.. 我的操作步骤如下: 1. 在项目中导入ExtJs 2. 创建了一个one.js 和 helloworld.html 3. one.js中的代码如下: Ext.Mes ...

  6. 2018.11.24 poj3261Milk Patterns(后缀数组)

    传送门 后缀数组经典题. 貌似可以用二分答案+后缀数组? 我自己yyyyyy了一个好写一点的方法. 直接先预处理出heightheightheight数组. 然后对于所有连续的k−1k-1k−1个he ...

  7. sqlserver2008查询性能优化(文摘)

    第1章 sql查询性能调整 第4章 索引分析

  8. ant Design和ant Design mobile的使用,并实现按需加载

    1.全局安装yarn npm install -g create-react-app yarn 2.创建react项目,并用yarn start 运行 3.引入antd/引入antd-mobile y ...

  9. IntelliJ IDEA 2017版 编译器使用学习笔记(七) (图文详尽版);IDE快捷键使用;IDE代码重构(编写高质量代码)

    一.重构 重构变量:将语义模糊的变量名称改为更易理解的名称       修改变量名称,快键键 shift + F6 (输入要改的名字,所有位置相同的名字都会改变)               重构方法 ...

  10. Arria10中的OCT功能

    OCT是什么? 串行(RS)和并行(RT) OCT 提供了 I/O 阻抗匹配和匹配性能.OCT 维持信号质量,节省电路板空 间,并降低外部组件成本. Arria 10 器件支持所有 FPGA 和 HP ...