[Django架构之主视图层]

[Django架构之主视图层]

主视图层

Django主视图层, 主视图便是Django新项目下的views.py文件,它的內部是一系列的涵数或是是类,用于专业解决手机客户端浏览要求后处理工艺要求而且回到相对应的数据信息,等同于一个中央情报解决系统软件

新手必会三板斧

  • HttpResponse

    • 回到字符串类型的数据信息
  • render

    • 回到html网页页面,还能够应用模版英语的语法
  • redirect

    • 跳转

三板斧实质

django主视图涵数务必要回到一个HttpResponse目标? 恰当!

django主视图涵数务必有一个传参,而且传参的基本数据类型务必是HttpResponse目标

# 科学研究三者源代码能够下结论
# HttpResponse
class HttpResponse(HttpResponseBase):
    """
    An HTTP response class with a string as content.
    # 以字符串数组做为內容的HTTP回应类
    This content that can be read, appended to or replaced.
    # 能够载入、加上或更换的內容
    """
    streaming = False

    def __init__(self, content=b'', *args, **kwargs):
        super(HttpResponse, self).__init__(*args, **kwargs)
        # 內容是一个字节串。参照' content '特性方式 
        # Content is a bytestring. See the `content` property methods.
        self.content = content 
# render        
def render(request, template_name, context=None, content_type=None, status=None, using=None):
        """
        Returns a HttpResponse whose content is filled with the result of calling
        django.template.loader.render_to_string() with the passed arguments.
        # 回到一个HttpResponse,它的內容中添充了启用的結果
		# django.template.loader.render_to_string()和传送的主要参数
        """
        content = loader.render_to_string(template_name, context, request, using=using)
        return HttpResponse(content, content_type, status)
# redirect內部是承继了HttpRespone类

JsonResponse

给前面回到json文件格式的字符串数组

方法1:自身实例化

import json
def func(request):
    d = {'user':'jason超帅','password':123}    
    res = json.dumps(d,ensure_ascii=False)
    return HttpResponse(res)

方法2: JsonResponse

from django.http import JsonResponse
def func(request):
    d = {'user':'jason超帅','password':123}
    return JsonResponse(d)
 #  return JsonResponse(d,json_dumps_params={'ensure_ascii':False} )
ps:附加主要参数填补
    json_dumps_params={'ensure_ascii':False}  # 看源代码
    safe=False  # 读报错信息内容
# JsonResponse回到的也是HttpResponse目标

文件上传

前面form表格文件上传常见问题
      1.method务必是post
      2.enctype主要参数必须改动为multipart/form-data

后端开发临时必须留意的是
      1.环境变量中注解掉csrfmiddleware分布式数据库
      2.根据request.FILES获得客户提交的post文档数据信息       
def func3(request):
    if request.method == 'POST':
        print(request.POST)
        file_obj = request.FILES.get('myfile')
        print(file_obj.name)  # 获得文件目录
        with open(r'%s'%file_obj.name,'wb') as f:
            for chunks in file_obj.chunks():
                f.write(chunks)
    return render(request,'func3.html')

FBV与CBV

FBV		根据涵数的主视图
	FBV应用頻率较低(基本环节)
CBV		根据类的主视图
	CBV具体开发设计新项目应用頻率较高(普及化)
views.py主视图层
	主视图涵数
    	不仅能够是涵数还可以是类
        	1.面向对象方法式程序编写
            2.面向对象编程式程序编写

FBV根据涵数的主视图(Function base view)大家前边写的主视图涵数全是FBV
CBV根据类的主视图(Class base view)

主视图文档中除开用一系列的涵数来相匹配解决手机客户端要求的数据信息逻辑性外,还能够根据界定类来解决相对应的逻辑性

CBV基本上应用

# views.py
from django.shortcuts import render,HttpResponse,redirect
from django.views import View
class MyView(View):
    def get(self,request):
        return HttpResponse("get方式 ")
    def post(self,request):
        return HttpResponse("post方式 ")
# urls.py    
url(r'^func4',views.MyView.as_view())
"""为何可以全自动依据要求方式 的不一样实行不一样的方式 """

1. CBV与FBV路由器配对实质

# urls.py  
urlpatterns = [
    url(r'^func4',views.MyView.as_view()) # CBV书写
    # 等额的  CBV路由器配备实质跟FBV一样
    url(r'^func4',views.view) # FBV书写
] 

2. CBV与FBV差别之突破点

知识要点:涵数名/方式 名:加括弧实行优先最大

CBV写的是 as_view() 加括弧代表着在新项目运行便会实行
那麼大家胆大猜想:
	 要不是被@staicmethod装饰的静态方法,便是个一般涵数沒有形参
 	 要不是被@classmethod装饰的类方法,类来调全自动将类作为第一个主要参数传到

3. 科学研究一下源代码

@classonlymethod  # 类方法,就把它当做@classmethod
def as_view(cls, **initkwargs):
    def view(request, *args, **kwargs): # view是as_view的闭包
        self = cls(**initkwargs)  # self = MyView()转化成一个我们自己写的类的目标
        """
        创建对象出一个View类的目标,回到一个dispatch()涵数,看见跟大家以前写的
        主视图涵数基本上一毛一样,那麼大家找一下涵数的上级领导涵数沒有这一方式 ,最终在类
        里发觉了这一dispatch()涵数
        """
        return self.dispatch(request, *args, **kwargs)
    return view # 回到一个涵数的内存地址

def dispatch(self, request, *args, **kwargs):
        # 获得当今要求并分辨是不是归属于一切正常的要求(八个)
        if request.method.lower() in self.http_method_names:
            # get请求  getattr(目标,'get')   handler = 我们自己写的get方式 
            handler = getattr(self, request.method.lower(), self.http_method_not_allowed)
        else:
            handler = self.http_method_not_allowed
        return handler(request, *args, **kwargs)  # 实行大家写的get方式 并回到该方式 的传参
# 结果:as_view()最后干的事儿便是依据request要求方法来实行主视图类的不一样要求方式 

汇总:之后会常常必须看源代码,可是在看Python源代码的情况下,一定要時刻提示自身面向对象编程特性方式 搜索次序,先从目标自身找,再去造成目标的类里边去找,以后再去父类找,看源代码只需看到了self点一个物品,一定要问一下自己当今这一self究竟是谁。

评论(0条)

刀客源码 游客评论