Python3.5 学习二十一

 

 

 

 

本节内容概要:html

 

上节回顾及补充知识点:前端

1、请求周期:web

  URL-》路由-》函数或类-》返回字符串或者模板ajax

  Form表单提交:数据库

  提交-》url-函数或者类中的方法django

          -....(执行)后端

          HttpResponse('......')浏览器

          render(request,'index.html')服务器

          redirect('/index/')cookie

  返回给用户>>>>>用户 永远都是渲染处理完成的字符串

  当接收到一个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后面本身作跳转

  

2、路由系统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 %}

 

3、视图系统

  def func(request):

  request.POST

  request.GET

  request.FILES

  request.getlist

  request.method

  request.path_info

  

  return render,HttpResponse,redirect

 

四、模板引擎

  render(request,'index.html')

  # for

  # if

  # 索引.  keys  values  items  all  都不加括号

 

五、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:步骤

一、在应用中建立一个叫templatetag的目录,不能叫其余名字

二、在目录中建立任意取名的py文件

三、在py文件中写函数,函数名定义前面要加装饰器,先要建立一个template对象,命名必须叫register

register = template.Libary()

四、经过它去生成一个装饰器

@register.simple_tag

def func(a1,a2...)

这两部的步骤代码如图所示:

 

五、使用自定义函数前须要注册当前APP

六、想在哪一个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装饰器写法:

 

 或

 

 

类中装饰器能够在函数方法名前写,更能够直接在类名前写

 

做业题:

  主机管理:

  一、单表操做

  二、一对多

  三、多对多

  要求:

    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

相关文章
相关标签/搜索