一、开发模式:  

  1. 普通开发方式(前后端放在一起写)

  2. 前后端分离(前后台通过ajaxo交互)

    后端(django rest framework写的) <----ajaxo--->  前端(vue写的) <----- >  用户

    好处:

 

二、后端开发

    为前端提供url(API的开发或者接口的开发)

    注:永远返回HttpResponse

 

路由

from django.conf.urls import url
from django.contrib import admin


from app01 import views
urlpatterns = [
    url(r'^admin/', admin.site.urls),
    url(r'^users/', views.users),
]

视图   ( FBV:function base view   基于函数的视图 如下)

import json


from django.shortcuts import render,HttpResponse

# Create your views here.

def users(request):
    user_list = ['zgr','oldboy']
    return HttpResponse(json.dumps(user_list))

 

后端的开发   http://127.0.0.1:8000/users/  只要访问这个URL就返回所有用户列表如下: 这就是接口的开发!

Django Rest framework 框架

三、Django中的FBV和CBV

  FBV:function base view   基于函数的视图

    函数作为视图函数

    当访问URL时,函数执行了

  CBV:class base view       基于类的视图    基于反射实现根据请求方式不同,执行不同的方法。

    当访问URL的时候,这个类里面还可以写很多方法,这个类里那个方法被执行了?先.这个类再点这个方法。函数嵌套类里面。如果以GET 方式请求,就会执行get方法就会自动会被执行。

视图:

# 这个类必须继承django的这个View
from django.views import View

class StudentsView(View):
    def get(self, request, *args, **kwargs):
        return HttpResponse('GET')

    def post(self, request, *args, **kwargs):
        return HttpResponse('POST')

    def delete(self, request, *args, **kwargs):
        return HttpResponse('DELETE')

    def put(self, request, *args, **kwargs):
        return HttpResponse('PUT')

    def putch(self, request, *args, **kwargs):
        return HttpResponse('PUTCH')

路由:

from app01 import views
urlpatterns = [
    url(r'^admin/', admin.site.urls),# 路由这里必须是类.as_view()   这是固定搭配
    url(r'^students/', views.StudentsView.as_view()),
]

这样一个CBV就写完了。以不同的方式来执行,就会有不同的函数自动帮你执行了。

 

 

HTTP请求的本质基于socket来做的,浏览器发一个请求本质上发了一堆字符串/r/n分割 ,做路由匹配,匹配成功,如果是FBV的话执行它对应的函数。但是如果是CBV怎么找到方法?通过反射!

反射

什么是反射?

  用在属性操作,之前是通过点操作属性。

  在python3中,统一了类与类型的概念(定义一个类就是一个类型,基本的数据类型字符串,列表。。。都是类)。

  通过字符串来反射到真正的属性身上,来进行属性操作。---->通过字符串来操作类或对象的属性。

  让客户自己输入要执行的操作,输入的是字符串,就要用字符串来反射到真正的属性(数据属性,函数属性...)身上.

python中的反射功能是由以下四个内置函数提供:hasattr、getattr、setattr、delattr,这四个函数分别用于对对象内部执行:检查是否含有某成员、获取成员、设置成员、删除成员。

isinstance 用它来判断是否是一个实例。也可以用来判断数据类型

issubclass 判断一个类是否是另一个类的子类。

在python3中,统一了类与类型的概念(定义一个类就是一个类型,基本的数据类型字符串,列表。。。都是类)。

Python中一切皆对象。

class Foo(object):
 
    def __init__(self):
        self.name = 'wupeiqi'
 
    def func(self):
        return 'func'
 
obj = Foo()
 
# #### 检查是否含有成员 ####
hasattr(obj, 'name')
hasattr(obj, 'func')
 
# #### 获取成员 ####
getattr(obj, 'name')
getattr(obj, 'func')
 
# #### 设置成员 ####
setattr(obj, 'age', 18)
setattr(obj, 'show', lambda num: num + 1)
 
# #### 删除成员 ####
delattr(obj, 'name')
delattr(obj, 'func')

 

那么问题来了?
a、上述访问对象成员的 name 和 func 是什么? 
答:是变量名
b、obj.xxx 是什么意思? 
答:obj.xxx 表示去obj中或类中寻找变量名 xxx,并获取对应内存地址中的内容。
c、需求:请使用其他方式获取obj对象中的name变量指向内存中的值 “alex”

d、比较三种访问方式

  • obj.name
  • obj.__dict__['name']
  • getattr(obj, 'name')

 

 

四、列表生成式 

class Foo:
    pass

class Bar:
    pass

v=[item() for item in [Foo,Bar]]
print(v)

v就是对象列表里面,就是Foo的对象和Bar的对象。

打印结果:
[<__main__.Foo object at 0x1029d1358>, <__main__.Bar object at 0x1029d1320>]
v=[]
for i in [Foo,Bar]:
    obj=i()
    v.append(obj)

 

五、面向对象编程   类    封装

  • 面向对象:对函数进行分类和封装,让开发“更快更好更强...”

  面向对象编程是一种编程方式,此编程方式的落地需要使用 “类” 和 “对象” 来实现,所以,面向对象编程其实就是对 “类” 和 “对象” 的使用。

  类就是一个模板,模板里可以包含多个函数,函数里实现一些功能

  对象则是根据模板创建的实例,通过实例对象可以执行类中的函数

 

Django Rest framework 框架

  • class是关键字,表示类
  • 创建对象,类名称后加括号即可

 

 

面向对象三大特性

一、封装

封装,顾名思义就是将内容封装到某个地方,以后再去调用被封装在某处的内容。

所以,在使用面向对象的封装特性时,需要:

  • 将内容封装到某处
  • 从某处调用被封装的内容

第一步:将内容封装到某处

Django Rest framework 框架

# 对同一类方法封装到了同一类里面
class File:
    文件的增删改查


class DB:
    数据库的增删改查


# 将数据封装到对象中(一个类实例化就是执行类的init方法得到一个对象)
class File:
    def __init__(self,a1,a2):  #  self=obj
        self.a1=a1   #obj.a1=a1
        self.xxx=a2   #obj.xxx=a2
    def get..
    def put..
    def delete..
    def post..

obj1 = File(123,234)

self 是一个形式参数,当执行 obj1 = Foo('wupeiqi', 18 ) 时,self 等于 obj1

                              当执行 obj2 = Foo('alex', 78 ) 时,self 等于 obj2

所以,内容其实被封装到了对象 obj1 和 obj2 中,每个对象中都有 name 和 age 属性,在内存里类似于下图来保存。

 

 1 class Foo:
 2  
 3     def __init__(self, name, age):
 4         self.name = name
 5         self.age = age
 6  
 7 obj1 = Foo('wupeiqi', 18)
 8 print obj1.name    # 直接调用obj1对象的name属性
 9 print obj1.age     # 直接调用obj1对象的age属性
10  
11 obj2 = Foo('alex', 73)
12 print obj2.name    # 直接调用obj2对象的name属性
13 print obj2.age     # 直接调用obj2对象的age属性

View Code