第十八章:CBV源码分析,resful 10个规范,drf(django rest framework)框架(django的app),APIView源码分析,序列化

1 CBV的源码分析
	-Class Base View(基于类的视图)
	-Function Base View(基于函数的视图)
	-def as_view 类方法
	-def view:类方法内部,闭包函数定义:内层函数包含对外部作用域的引用
	-python中一切皆对象:函数也是对象
	-hasattr(self, 'get')--判断self类中是不是有该(get)方法  
	-反射 setattr(self,get,get_all):相当于把get函数,变成了get_all 
	-getattr(self, 'get'):拿到get函数的内存地址
	- def view(request, *args, **kwargs):
		self = cls(**initkwargs)
		if hasattr(self, 'get') and not hasattr(self, 'head'):
			self.head = self.get
		self.request = request
		self.args = args
		self.kwargs = kwargs
		#执行:dispatch:谁的dispatch方法?写的cbv的那个c,视图中的那个视图类
		#我这个类如果没有写dispatch,会执行View中的dispatch方法
		return self.dispatch(request, *args, **kwargs)
	-def dispatch(self, request, *args, **kwargs):
		#request.method 前台请求的方法,转成了小写
		#http_method_names View中定义的一个列表:是一堆请求方式
        if request.method.lower() in self.http_method_names:
			#getattr的第三个参数是默认值:self.http_method_not_allowed
			#拿到get方法的内存地址
            handler = getattr(self, request.method.lower(), self.http_method_not_allowed)
        else:
            handler = self.http_method_not_allowed
		#get(request,*args, **kwargs)
        return handler(request, *args, **kwargs)
		
	总结:*******请求来了--->as_view---->view---->dispatch--->分发到不同的函数,执行函数,拿到结果,然后返回
	
1.1 阅读源码:
	左侧工程栏--->设置图标-->点击--->show members(能看到py文件,类的方法)
	
2 resful规范(是什么)
	-什么是resful(定义)
		-是一个规范
		-面向资源编程:把网络中所有东西,想象成资源
	-规范:
		-10条规范
		-API与用户的通信协议,总是使用HTTPs协议:https比http安全
		-域名 
			https://api.example.com  尽量将API部署在专用域名(会存在跨域问题)
			https://example.org/api/  API很简单
			例如写一个查询所有图书的api接口:https://api.example.com/books
											https://127.0.0.1/api/books
		-版本:每个接口都应该有版本
			URL,如:https://api.example.com/v1/    https://127.0.0.1/api/v2/books(推荐用这种)
			请求头 跨域时,引发发送多次请求
		-路径,视网络上任何东西都是资源,均使用名词表示(可复数)
			https://api.example.com/v1/books
			https://api.example.com/v1/animals
			https://api.example.com/v1/employees
			不能这么写:
				-获取所有图书:https://127.0.0.1/api/get_all_books
				-新增一本书:https://127.0.0.1/api/add_book
			同一都用这个:
			https://api.example.com/v1/books
		-method
			GET      :从服务器取出资源(一项或多项)
			POST    :在服务器新建一个资源
			PUT      :在服务器更新资源(客户端提供改变后的完整资源)
			PATCH  :在服务器更新资源(客户端提供改变的属性)
			DELETE :从服务器删除资源
		-过滤,通过在url上传参的形式传递搜索条件
			https://api.example.com/v1/zoos?limit=10:指定返回记录的数量
		-状态码
			请求回去,需要有状态码
			自定义状态码
			status: 100表示成功
					101表示用户名密码错误
					102我也不知道什么错误
		-错误处理,应返回错误信息,error当做key。
			-{status:100,error:'错误信息写上'}
		-返回结果,针对不同操作,服务器向用户返回的结果应该符合以下规范。
			GET /books:返回资源对象的列表(数组)
			GET /books/1:返回单个资源对象
			POST /books:返回新生成的资源对象    -新增,传数据,一旦新增完成,把新的资源对象返回
			PUT /books/1:返回完整的资源对象
			PATCH /books/1:返回完整的资源对象
			DELETE /books/1:返回一个空文档
		-Hypermedia API,RESTful API最好做到Hypermedia,即返回结果中提供链接,连向其他API		      方法,使得用户不查文档,也知道下一步应该做什么。
				{
					status:100
					msg:成功
					url:127.0.0.1/books/1
				}
			核心:返回结果中提供链接
			
2.1 django写resful规范的接口
2.2 postman软件:模拟发请求的软件
2.3 格式化json格式数据
	-https://www.json.cn/
2.4 put请求,django不会帮我解析body内的数据,需要自己处理
			
3 drf(django rest framework)框架(django的app)
	安装:djangorestframework
	-它是一个app,要在咱的项目中用
	-只是快速的构建resful规范的接口
	-csrf_exempt:局部禁用csrf(csrf是可以局部使用,局部禁用)
	-以后再执行的dispatch方法是APIView的dispatch方法
	-getattr和setattr
	-重点掌握这三点:
		-request.data 是个方法,包装成了属性,前台传过来body体中数据的数据,放在里面
		-request.query_params  这个是原来GET中的数据
		-request把原来的request包装进去了
4 APIView源码分析
	
5 序列化
	-1 自己写for循环来处理(麻烦)
	-2 django提供的序列化组件(不可控)
		from django.core import serializers
		ret=serializers.serialize('json','queryset对象')
		ret就是序列化之后的字符串了,不需要再序列化了
	-3 drf给咱提供的序列化组件
		-1 先导入
			from rest_framework.serializers import Serializer
			from rest_framework import serializers
		-2 写一个类,继承Serializer
		-3 在类内部写属性:
			name=serializers.CharField()
		-4 使用:
			-先生成对象,需要传参数 instance:要序列化的对象(可能是queryset,也可能是单个对象)    
			many:如果是queryset---True,,如果是单个对象--False
		-5 对象.data --->是一个字典

部分代码 示范
from django.conf.urls import url
from django.contrib import admin
from app01 import views
urlpatterns = [
url(r'^admin/', admin.site.urls),
# as_view一定要加括号,as_view()哪里来的?从View中继承过来的
# as_view用类来调用的,它是一个类方法
# 猜:as_view这个方法执行完成以后,应该是个函数的内存地址
# 如果是get请求,会响应到类内部,执行get方法post请求,一样
# as_view 类方法,自动把自己传过来
url(r'^login/', views.Test.as_view()),
url(r'^books/$', views.Books.as_view()),
url(r'^books/(?P<pk>\d+)', views.Books.as_view()),
]







# def test(age):
# tt=age
# print(age)


# print(test)
# test(13)
# 一切皆对象
# test.age=13
# 执行一堆代码

# print(test.age)


class Student:
name = 'lqz'

def __init__(self, age):
self.age = age
def __getattr__(self, item):

return '你傻逼啊,没有这个属性'
def __setattr__(self, key, value):
pass

# def __getitem__(self, item):
# pass
# def __setitem__(self, key, value):
# pass

student = Student(18)
# print(student.age)
# print(student.name)

# print(student.sex)
student.sex='男'
print(student.sex)





#!/usr/bin/env python
import os
import sys

if __name__ == "__main__":
os.environ.setdefault("DJANGO_SETTINGS_MODULE", "day96.settings")
try:
from django.core.management import execute_from_command_line
except ImportError:
# The above import may fail for some other reason. Ensure that the
# issue is really that Django is missing to avoid masking other
# exceptions on Python 2.
try:
import django
except ImportError:
raise ImportError(
"Couldn't import Django. Are you sure it's installed and "
"available on your PYTHONPATH environment variable? Did you "
"forget to activate a virtual environment?"
)
raise
execute_from_command_line(sys.argv)
 
posted @ 2018-12-10 17:15  不沉之月  阅读(138)  评论(0编辑  收藏  举报