1 CBV的源码分析

#视图
class login (View):
pass
#路由
url(r'^books/$', views.login.as_view())
#阅读源码:
#左侧工程栏--->设置图标-->点击--->show members(能看到py文件,pu下的类,类下的方法)
-Class Base View(基于类的视图)
-Function Base View(基于函数的视图)
-def as_view 类方法 :返回view
-def view:as_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--->分发到不同的函数,执#行函数,拿到结果

2 djangorestframework框架

安装:djangorestframework
   -它是一个app,要在咱的项目中用
   -只是快速的构建resful规范的接口
   -csrf_exempt:局部禁用csrf(csrf是可以局部使用,局部禁用)
   -以后再执行的dispatch方法是APIView的dispatch方法
   -getattr和setattr
   重点掌握这三点:
    -request.data 是个方法,包装成了属性,前台传过来body体中数据的数据,放在里面
    -request.query_params  这个是原来GET中的数据
    -request把原来的request包装进去了

3  APIView源码分析

 @classmethod
def as_view(cls, **initkwargs):
"""
Store the original class on the view function. This allows us to discover information about the view when we do URL
reverse lookups. Used for breadcrumb generation.
"""
if isinstance(getattr(cls, 'queryset', None), models.query.QuerySet):
def force_evaluation():
raise RuntimeError(
'Do not evaluate the `.queryset` attribute directly, '
'as the result will be cached and reused between requests. '
'Use `.all()` or call `.get_queryset()` instead.'
)
cls.queryset._fetch_all = force_evaluation view = super(APIView, cls).as_view(**initkwargs)
view.cls = cls
view.initkwargs = initkwargs # Note: session based authentication is explicitly CSRF validated,
# all other authentication is CSRF exempt.
return csrf_exempt(view)

as_view方法

def dispatch(self, request, *args, **kwargs):
"""
`.dispatch()` is pretty much the same as Django's regular dispatch,
but with extra hooks for startup, finalize, and exception handling.
"""
self.args = args
self.kwargs = kwargs
request = self.initialize_request(request, *args, **kwargs)
self.request = request
self.headers = self.default_response_headers # deprecate? try:
self.initial(request, *args, **kwargs) # Get the appropriate handler method
if request.method.lower() in self.http_method_names:
handler = getattr(self, request.method.lower(),
self.http_method_not_allowed)
else:
handler = self.http_method_not_allowed response = handler(request, *args, **kwargs) except Exception as exc:
response = self.handle_exception(exc) self.response = self.finalize_response(request, response, *args, **kwargs)
return self.response

dispatch

def initialize_request(self, request, *args, **kwargs):
"""
Returns the initial request object.
"""
parser_context = self.get_parser_context(request) return Request(
request,
parsers=self.get_parsers(),
authenticators=self.get_authenticators(),
negotiator=self.get_content_negotiator(),
parser_context=parser_context
)

initialize_request

def initial(self, request, *args, **kwargs):
"""
Runs anything that needs to occur prior to calling the method handler.
"""
self.format_kwarg = self.get_format_suffix(**kwargs) # Perform content negotiation and store the accepted info on the request
neg = self.perform_content_negotiation(request)
request.accepted_renderer, request.accepted_media_type = neg # Determine the API version, if versioning is in use.
version, scheme = self.determine_version(request, *args, **kwargs)
request.version, request.versioning_scheme = version, scheme # Ensure that the incoming request is permitted
self.perform_authentication(request)
self.check_permissions(request)
self.check_throttles(request)

initial方法(内部调用认证,权限,频率)

 总结:*******请求来了--->as_view---->view---->dispatch(apiview的比上面的多做了  包了个request对象生成新的request对象  和调用initial方法 都是apiview自己的方法)--->分发到不同的函数,执#行函数,拿到结果

随机推荐

  1. 【不懂】spring bean生命周期

    完整的生命周期(牢记): 1.spring容器准备 2.实例化bean 3.注入依赖关系 4.初始化bean 5.使用bean 6.销毁bean Bean的完整生命週期可以認為是從容器建立初始化Bea ...

  2. Kettle系列:Pentaho DI (Kettle) 下载地址

    Kettle 8 已经发布, 下载地址还不太好找, 这里记录一下: 注: 所有大型软件升级都需要谨慎,  尤其是大版本的第一个小版本都不推荐在生产环境使用. github 总是有最新版 https:/ ...

  3. MySQL 字符集问题

    MySQL 支持许多字符集及其编码方案, 甚至是不同编码之间的转换. 在使用 MySQL 进行应用程序编程时, 常常会出现乱码现象, 这通常是由于客户端没有声明与 MySQL 服务器通信的字符串编码造 ...

  4. 【由浅入深理解java集合】(一)——集合框架 Collction、Map

    本篇文章主要对java集合的框架进行介绍,使大家对java集合的整体框架有个了解.具体介绍了Collection接口,Map接口以及Collection接口的三个子接口Set,List,Queue. ...

  5. Android手机有的不显示Toast

    解决办法一: 在手机中把该app的通知打开 可以直接设置通知权限:<uses-permission android:name="android.permission.RECEIVE_B ...

  6. FFI

    FFI概念 https://segmentfault.com/t/ffi/info FFI即Foreign Function Interface,外部函数调用接口,是一个语言提供的使用其他语言现有库( ...

  7. pyqt5-QWidget-窗口状态(最大化最小化等)

    setWindowState(state)          #设置窗口状态 Qt.WindowNoState  无状态-正常状态 Qt.WindowMinimized     最小化 Qt.Wind ...

  8. phpcms中set_config和get_sysinfo函数

    /** * 设置config文件 * @param $config 配属信息 * @param $filename 要配置的文件名称 */ function set_config($config, $ ...

  9. 修改输入框placeholder的样式

    1. h5页面: //修改placeholder 样式 (chrome,其余类似加前缀) ::-webkit-input-placeholder { color:rgba(21,30,38,0.35) ...

  10. 函数语法:原生JS获取数组的索引值index

    var lis = document.getElementsByTagName("li"); for(var i=0;i<lis.length;i++) { lis[i].i ...