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

    

原文地址:https://www.cnblogs.com/HU-HU/p/9662880.html