[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):
# 获取当前请求并判断是否属于正常的请求(8个)
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到底是谁。

[Django框架之视图层]的更多相关文章

  1. 微信小程序学习笔记(5)--------框架之视图层

    这一系列转载:http://blog.csdn.net/zsp45212/article/details/53518238 视图层 框架的视图层由wxml与wxss编写,由组件进行展示.将逻辑层的数据 ...

  2. 小程序框架之视图层 View~事件系统~WXS响应事件

    WXS响应事件 基础库 2.4.4 开始支持,低版本需做兼容处理. 背景 有频繁用户交互的效果在小程序上表现是比较卡顿的,例如页面有 2 个元素 A 和 B,用户在 A 上做 touchmove 手势 ...

  3. 小程序框架之视图层 View

    (1)视图层View 框架的视图层由 WXML 与 WXSS 编写,由组件来进行展示. 将逻辑层的数据反应成视图,同时将视图层的事件发送给逻辑层. WXML(WeiXin Markup languag ...

  4. Django 学习 之 视图层(views)

    一个视图函数,简称视图,是一个简单的Python 函数,它接受Web请求并且返回Web响应.响应可以是一张网页的HTML内容,一个重定向,一个404错误,一个XML文档,或者一张图片. . . 是任何 ...

  5. 小程序框架之视图层 View~基础组件

    框架为开发者提供了一系列基础组件,开发者可以通过组合这些基础组件进行快速开发.详细介绍请参考组件文档. 什么是组件: 组件是视图层的基本组成单元. 组件自带一些功能与微信风格一致的样式. 一个组件通常 ...

  6. Django的日常-视图层

    目录 Django的日常-3 JsonResponse form表单上传文件 CBV的源码分析 视图层 模板传值 过滤器 标签 自定义过滤器和标签 Django的日常-3 JsonResponse 在 ...

  7. Django学习之视图层

    视图层 小白必会三板斧 HttpResponse render redirect django视图函数必须要给返回一个HttpResponse对象(render和redirect内部返回的也是一个Ht ...

  8. Django基础之视图层

    内容概要 小白必会三板斧 request对象方法初识 form表单上传文件 Jsonresponse FBV与CBV 内容详细 1 小白必会三板斧 HttpResponse render redire ...

  9. 小程序框架之视图层 View~获取界面节点信息

    获取界面上的节点信息 WXML节点信息 节点信息查询 API 可以用于获取节点属性.样式.在界面上的位置等信息. 最常见的用法是使用这个接口来查询某个节点的当前位置,以及界面的滚动位置. 示例代码: ...

随机推荐

  1. Git - 使用命令和P4Merge进行diff

    P4Merge P4Merge是Git的一个第三发Diff和Merge工具(可视化冲突解决工具). 下载地址: https://www.perforce.com/downloads/visual-me ...

  2. PAT (Basic Level) Practice (中文) 1050 螺旋矩阵 (25 分) 凌宸1642

    PAT (Basic Level) Practice (中文) 1050 螺旋矩阵 (25 分) 目录 PAT (Basic Level) Practice (中文) 1050 螺旋矩阵 (25 分) ...

  3. 解决send-mail: fatal: parameter inet_interfaces: no local interface found for ::1

    1:检查sendmail服务的状态 service sendmail status 2:开启sendmail服务 service sendmail start3:关闭sendmail服务 servic ...

  4. .NET 6 Preview 3 中 ASP.NET Core 的更新和改进

    原文:bit.ly/2Qb56NP 作者:Daniel Roth 译者:精致码农-王亮 .NET 6 预览版 3 现已推出,其中包括许多对新的 ASP.NET Core 改进.以下是本次预览版的新内容 ...

  5. DBeaver、Navicat、MySQL高频报错及解决方法,此文持续更新

    目录 第一坑,没有用管理员身份 第二坑,MySQL 服务无法启动 第三坑,报错:ERROR 1045 (28000): Access denied for user 'root'@'localhost ...

  6. 【Flutter 3-5】Flutter进阶教程——在Flutter中使用Lottie动画

    作者 | 弗拉德 来源 | 弗拉德(公众号:fulade_me) Lottie动画 在移动开发中总是需要展示一些动画特效,作为程序员的我们并不是很擅长用代码做动画,即便是有些动画可以实现,在跨平台的过 ...

  7. 如何讲一个网页转换为jpg?(图片!)

    不需要安装插件!!! 打开网页,打开开发者工具 快捷键: ctrl+shift+p输入>full即可自动下载!

  8. [Python]import使用的疑难杂症与包管理

    概念:模块与包 模块module:一般是以.py为后缀的文件,也包括.pyo..pyc..pyd..so和.dll后缀的文件,模块内定义了函数.类以及变量 包package:包是含有若干个模块的文件夹 ...

  9. 100天搞定机器学习:PyYAML基础教程

    编程中免不了要写配置文件,今天我们继续Python网络编程,学习一个比 JSON 更简洁和强大的语言----YAML .本文老胡简单介绍 YAML 的语法和用法,以及 YAML 在机器学习项目中的应用 ...

  10. Kubernetes部署metrics-server提示健康检测报错500,简单解决方式

    为什么写? 最近有项目要用到HPA(Horizontal Pod Autoscaler)依赖了k8s的 metrics 指标才能做出自动缩扩容的动作,我这边用官方GitHub v0.4.2版本启动不起 ...