zoukankan      html  css  js  c++  java
  • 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

        

  • 相关阅读:
    第二轮冲刺-Runner站立会议06
    第二轮冲刺-Runner站立会议05
    第二轮冲刺-Runner站立会议04
    找水王续
    第二轮冲刺-Runner站立会议03
    第二轮冲刺-Runner站立会议02
    用户故事与敏捷开发方法笔记05
    软件需求与分析课堂讨论1
    16秋进度条3
    用户故事与敏捷开发方法笔记04
  • 原文地址:https://www.cnblogs.com/HU-HU/p/9662880.html
Copyright © 2011-2022 走看看