Django视图层与模板层实例详解

目录
  • theme: channing-cyan
    • 网页伪静态
  • 视图层
    • 1.视图函数的返回值问题
    • 2.视图函数返回json格式数据
    • 3.form表单携带文件数据
    • 4.FBV与CBV
    • 5.CBV源码分析
  • 模板层
    • 1.模板语法传值
    • 2.模板语法传值的范围
    • 3.模板语法值过滤器
    • 4.模板语法标签(类似于python中的流程控制)
    • 5.自定义标签函数、过滤器、inclusion_tag
    • 6.模板的继承
    • 7.模板的导入

theme: channing-cyan

网页伪静态

将动态网页伪装成静态网页,可以提升网页被搜索引擎检索道德概率

表现形式为:网址看着像是一个具体的文件路径例如:http://127.0.0.1:8001/admin/login/

path('index.html', views.index)

视图层

1.视图函数的返回值问题

当我们在views.py定义的视图函数不设置返回值时,可以看到django报了以下错误:

报错信息:

The view app01.views.home didn't return an HttpResponse object. It returned None instead.

视图app01.views.home没有返回HttpResponse对象。它返回None。

由此我们可以猜测一个结论:视图函数必须返回一个HttpResponse对象 我们ctrl+左键进入HttpResponse可以发现它是一个类:

class HttpResponse(HttpResponseBase):
	pass

可是视图函数还可以返回render和redirect对象啊,我们进入到这两个函数中一探究竟:

def render(...):
    pass
    return HttpResponse(content, content_type, status)

render函数返回值也是HttpResponse对象。 再来看看redirect:

def redirect(to, *args, permanent=False, **kwargs):
    redirect_class = HttpResponsePermanentRedirect if permanent else HttpResponseRedirect
    return redirect_class(resolve_url(to, *args, **kwargs))

redirect函数返回值也是HttpResponse对象。

由此可见,views.py中的视图函数都必须返回一个HttpResponse对象

2.视图函数返回json格式数据

需求:将字典数据序列化成json字符串传给前端::

方法1:利用json模块

def home(request):
    import json
    user_dict = {'name': 'jason老师', 'pwd': 123, 'hobby': ['read', 'run', 'music']}
    json_user_dict = json.dumps(user_dict, ensure_ascii=False)
    return render(request, 'home.html', json_user_dict)

方法2:利用JsonResponse

from django.http import JsonResponse
def home(request):
    JsonResponse(user_dict)  #

只用一行代码就顶替了上述方法三行代码,非常好用。但有个问题,JsonResponse没有ensure_ascii参数,也就意味着我们暂时无法阻止汉字编码。想要解决这个问题,主要我们查看JsonResponse的源码:

class JsonResponse(HttpResponse):
    def __init__(self, data, encoder=DjangoJSONEncoder, safe=True,
                 json_dumps_params=None, **kwargs):
        if json_dumps_params is None:
            json_dumps_params = {}
        kwargs.setdefault('content_type', 'application/json')
        data = json.dumps(data, cls=encoder, **json_dumps_params)
        super().__init__(content=data, **kwargs)

可以看到JsonResponse内部是有json.dumps方法的,但这个方法需要传一些特殊的参数:

**json_dumps_params。这个参数用来接收多余的关键字参数并将其打散成一个个的k:v键值对。而这些关键字需要我们当做json_dumps_params的值,以字典的形式传入。

于是:

JsonResponse(user_dict, json_dumps_params={'ensure_ascii':False})

这就相当于我们设置了**'ensure_ascii':False** 但是设置这个参数的过程属实有点坎坷~~

除了字典类型,其他容器类型也可以被序列化,不过要指定safe参数为False

3.form表单携带文件数据

form表单需要设置的参数:

<form method="post" enctype="multipart/form-data">
</form>

后端获取文件代码:

files = request.FILES  # 后端接收文件数据只能用FILES方法,不能用POST

4.FBV与CBV

FBV:基于函数的视图

# views.py
def home(request):
    return render(request, 'home.html')
# urls.py
path('home/', views.home)

CBV:基于类的视图 CBV会根据请求方式的不同自动匹配类中定义的方法并自动执行

# views.py
from django impost views
class MyView(views.View):
    def get(self, request):
        return HttpResponse('我是CBV的get方法')
    def post(self, request):
        return HttpResponse('我是CBV的post方法')
# urls.py
path('func/', views.MyView.as_view())

5.CBV源码分析

源码分析入口:

path('func/', views.MyView.as_view())

1.绑定给类的as_view()方法

    def as_view(...):
          def view(...):
              pass
          return view

此时路由匹配代码的本质:path('func/', views.view())

由此可见,CBV与FBV路由匹配的原理是一样的

2.path('func/', views.view())

这句代码的意思是:只要我们访问了func地址,会立即执行后面的views.view()

3.进入view()函数:

    def view(request, *args, **kwargs):
        self = cls(**initkwargs)    # 这里的cls使我们自己写的类MyView  self是MyView实例化出来的

对象obj   这一句相当于 obj = MyView()

return self.dispatch(request, *args, **kwargs)  # 这一句相当于obj.dispatch()

4.进入dispatch函数

    def dispatch(self, request, *args, **kwargs):
    # dispatch是绑定给对象的方法,self相当于是我们前文提到的obj
        if request.method.lower() in self.http_method_names:
            handler = getattr(self, request.method.lower(),self.http_method_not_allowed)
           # 反射  通过请求字符串去调用真正的请求方法   这里的请求是post所以handler是post
        else:
            handler = self.http_method_not_allowed
        return handler(request, *args, **kwargs)  # 即post(request, *args, **kwargs)
        # 此时 view()函数的返回值为:
         #  def view(request, *args, **kwargs):
         #        return self.post(request, *args, **kwargs)

模板层

1.模板语法传值

方式1:指名道姓地传值。好处是不浪费资源,坏处是值过多时不方便

def home(request):
    name = 'kevin'
    age = 19
    return render(request, 'home.html', {'name':name, 'age': age})

方式2:关键字locals()。可以将整个视图函数名称空间中所有的名字全部传入,简单快捷,坏处是有冗余

def home(request):
    name = 'kevin'
    age = 19
    return render(request, 'home.html', locals())

2.模板语法传值的范围

1.基本数据类型都可以传递

2.函数名的传递会自动加括号执行并将结果展示到页面上(注意函数如果有参数则不会执行也不会展示,模板语法不支持参数)

3.类名的传递也会自动加括号调用并将实例化出的对象展示到页面上(模板语法会自动判断每一个名字是否能被加括号调用,如果可以则自动调用)

4.对象的传递可以直接用句点符点出对象的属性

5.django的模板语法在操作容器类型时只能用句点符操作(操作列表用 .数字 的形式)

3.模板语法值过滤器

过滤器类似于python中的内置函数

    <p>统计长度:{{ s|length }}</p>
    <p>加法运算:{{ s|add:'NB' }}</p>
    <p>文件大小:{{ file_size|filesizeformat }}</p>
    <p>数据切片:{{ s|slice:'3' }}</p>
    <p>字符截取:{{ s|truncatechars:3 }}</p>		# 以字符为单位 多出的部分用...代替
    <p>单词截取:{{ words|truncatewords:3 }}</p>    #以单词为单位 多出的部分用...代替
    <p>语法转义:{{ html_tag|safe }}</p>		# 识别字符串中的html标签 并渲染(默认是不识别)
#html默认不识别后端传过来的字符串标签,指定safe可以让其识别并渲染
#除了在传给前端之后让前端识别 我们也可以在后端处理之后再传给前端,这样前端就不用识别了(意味着html页面上的数据不一定非要在html文件中编写了 也可以通过后端传入)
    from django.utils.safestring import mark_safe
        script_tag1 = '<script>alert(666)</script>'
        res = mark_safe(script_tag1)  # 直接把res传给前端

'''
django模板语法中的符号就两个 一个{{}} 一个{%%}
	需要使用数据的时候 {{}}
	需要使用方法的时候 {%%}
'''

4.模板语法标签(类似于python中的流程控制)

if 标签:

{% if 条件 %}  条件一般是后端传过来的数据  直接写名字使用即可
    条件成立执行的代码
{% elif 条件1 %}
    条件1成立执行的代码    
{% else %}
    条件都不成立执行的代码
{% endif %}

for 标签

{% for i in f %}
    {% if forloop.first %}
        <p>这是第一次</p>
    {% elif forloop.last %}
        <p>这是最后一次</p>
    {% else %}
        <p>啥也不是{{ i }}</p>
    {% endif %}
    {% empty %}
        <p>你给我的是个空 怎么for循环呢</p>
{% endfor %}

for循环可用的一些参数

Variable Description
forloop.counter 当前循环的索引值(从1开始)
forloop.counter0 当前循环的索引值(从0开始)
forloop.revcounter 当前循环的倒序索引值(从1开始)
forloop.revcounter0 当前循环的倒序索引值(从0开始)
forloop.first 当前循环是不是第一次循环(布尔值)
forloop.last 当前循环是不是最后一次循环(布尔值)
forloop.parentloop 本层循环的外层循环

5.自定义标签函数、过滤器、inclusion_tag

如果想实现自定义,必须先做以下几件事

1.在应用下创建一个名为templatetags的文件夹 2.在该文件夹下创建任意名称的.py文件 3.在该py文件内编写自定义相关代码

from django.template import Library
	register = Library()

自定义过滤器

@register.filter(name='myfilter')
    def my_add(a, b):
        return a + b

自定义标签函数

@register.simple_tag(name='mt')
    def func(a, b, c, d):
        return a + b + c + d

自定义inclusion_tag

@register.inclusion_tag(filename='it.html')
    def index(n):
        html = []
        for i in range(n):
            html.append('第%s页'%i)
        return locals()

自定义标签的使用

{% load mytag %}
{{ i|myfilter:1 }}
{% mt 1 2 3 4 %}
{% index 10 %}

6.模板的继承

{% extends 'html文件名' %}

{% block 名字 %}
    模板内容(将要被继承的部分)            
{% endblock %}

{% block 名字 %}
    子板内容
{% endblock %}
一般情况下母板中至少应该有三个区域使得扩展性更高!!!      css content js
{% block css %}
{% endblock %}

{% block content %}
{% endblock %}

{% block js %}
{% endblock %}

子板中还可以使用母板的内容  {{ block.super }}

7.模板的导入

将html页面的某个部分以模块的形式导入

{% include 'menu.html' %}

以上就是Django视图层与模板层实例详解的详细内容,更多关于Django视图层模板层的资料请关注我们其它相关文章!

(0)

相关推荐

  • Go压缩位图库roaring安装使用详解

    目录 简介 安装 使用 基本操作 迭代 并行操作 写入与读取 64 位版本 存储格式 概览 Cookie Header Descriptive Header Offset Header Container array bitmap/bitset run 手撸解析代码 总结 简介 集合是软件中的基本抽象.实现集合的方法有很多,例如 hash set.tree等.要实现一个整数集合,位图(bitmap,也称为 bitset 位集合,bitvector 位向量)是个不错的方法.使用 n 个位(bit)

  • 利用golang进行OpenCV学习和开发的步骤

    前言 记得开始使用 OpenCV 的时候是在大学时期,当时用的是 C 语言,OpenCV 版本好像是1.1,随着时间的推移,后面 C++逐渐代替了 C,iOS 也有整合好的 lib 可以使用 OpenCV,现在Python, go 等语言进行开发,今天主要是说一说如何使用 go 语言配置开发 OpenCV. OpenCV这一名称包含了Open和 Computer Vision两者的意思.实际上,Open指Open Source(开源,即开放源代码),Computer Vision则指计算机视觉.

  • Go 实战单队列到优先级队列实现图文示例

    目录 优先级队列概述 为什么需要优先级队列 优先级队列实现原理 01 四个角色 02 队列-消费者模式 03 单队列-单消费者模式实现 3.1 队列的实现 3.2 工作单元--Job的实现 3.3 消费者Worker的实现 04 多队列-单消费者模式 05 多队列-多消费者模式 总结 优先级队列概述 队列,是数据结构中实现先进先出策略的一种数据结构.而优先队列则是带有优先级的队列,即先按优先级分类,然后相同优先级的再 进行排队.优先级高的队列中的元素会优先被消费.如下图所示: 在Go中,可以定义

  • golang 开启opencv图形化编程

    目录 正文 环境配置 API编程 常用API OpenVideoCapture VideoCaptureDevice VideoCaptureFile NewWindow SetWindowTitle NewMat NewMatWithSize NewMatFromScalar NewCascadeClassifier Load 正文 最近在国外一个嵌入式编程网站上看到其平台支持Opencv库,出于好奇在其说明文档上看到gocv.io Opencv golang库的官网.就是下面这个. 在开启编

  • go语言编程学习实现图的广度与深度优先搜索

    目录 图的实现 BFS DFS 图的实现 所谓图就是节点及其连接关系的集合.所以可以通过一个一维数组表示节点,外加一个二维数组表示节点之间的关系. //图的矩阵实现 typedef struct MGRAPH{ nodes int[]; //节点 edges int[][]; //边 }mGraph; 然而对于一些实际问题,其邻接矩阵中可能存在大量的0值,此时可以通过邻接链表来表示稀疏图,其数据结构如图所示 其左侧为图的示意图,右侧为图的邻接链表.红字表示节点序号,链表中为与这个节点相连的节点,

  • 如何在C#中使用OpenCV(GOCW使用教程)

    1.什么是GOCW 为了解决在Csharp下编写OpenCV程序的问题,我做过比较深入的研究,并且实现了高效可用的方法GreenOpenCsharpWrapper(GOCW).通过这种方法,能够分离界面和算法业务,高效率完成算法调用,而且非常方便进行算法维护.应该说是我在多年项目实践中不断总结提炼出来的一点东西.        GOCW的发布地址为:https://gitee.com/jsxyhelu2020/gocw 2.GOCW有什么特点 分离界面和算法业务 图像数据直接通过内存传值,高效率

  • golang开发安装go-torch火焰图操作步骤

    目录 安装 使用 另一种自定义显示方式 代码修改 使用 查看 安装 1. 安装go-torch go get github.com/uber/go-torch 2.安装FlameGraph cd $GOPATH && git clone  https://github.com/brendangregg/FlameGraph.git export PATH=$PATH:$GOPATH/FlameGraph [这步一定要设置,生成火焰图时会用到] 3.安装graphviz (CentOS, R

  • 业务层hooks封装useSessionStorage实例详解

    目录 封装原因: 建议: 工具库封装模式: 工具库目录: API设计: 代码实践: Hooks设计方式 useSessionStorage.js 简介: 注意点 Api Params Options Result 总结: 封装原因: 名称:useSessionStorage 功能开发过程中,需要进行数据的临时存储,正常情况下,使用localStorage或者 sessionStorage,存在于 window 对象中,使用场景不一样. sessionStorage的生命周期是在浏览器关闭前,浏览

  • Android开发之Android.mk模板的实例详解

    Android开发之Android.mk模板的实例详解 关于Android NDK开发的文章已经比较多了,我的博客中也分享了很多NDK开发相关经验和技巧,今天简单写了一个 Android.mk 的示例模板,供初学者参考. 本模板主要给大家示例 Android NDK 开发中的如下几个问题: 1. 如何自动添加需要编译的源文件列表   2. 如何添加第三方静态库.动态库的依赖   3. 如何构造一个完整的NDK工程框架 假设我们的项目依赖 libmath.a, libjson.a, libffmp

  • django ManyToManyField多对多关系的实例详解

    Django 的 ORM 有多种关系:一对一,多对一,多对多 各自定义的方式为 : 一对一: OneToOneField 多对一: ForeignKey 多对多: ManyToManyField 上边的描述太过数据而缺乏人性化,我们来更人性化一些: 多个属于一个,即 belong to : ForeignKey,多个属于一个 一个有一个,即 has one: OneToOneField 一个有很多个,即 has many: lots of A belong to B 与 B has many A

  • Python 中开发pattern的string模板(template) 实例详解

    定制pattern的string模板(template) 详解 string.Template的pattern是一个正则表达式, 可以通过覆盖pattern属性, 定义新的正则表达式. 如: 使用新的定界符"{{", 把{{var}}作为变量语法. 代码: # -*- coding: utf-8 -*- ''''' Created on 2014.6.5 @author: Administrator @edition : python 3.3.0, eclipse pydev '''

  • Flask框架学习笔记之模板操作实例详解

    本文实例讲述了Flask框架学习笔记之模板操作.分享给大家供大家参考,具体如下: flask的模板引擎是Jinja2. 引入模板的好处是增加程序的可读性和易维护性,从而不用将一堆html代码塞在视图函数中. 还是以hello world为例.最基础的调用模板修饰文本. # 根网址 @app.route('/') def index(): # return render_template("index.html") # 可以给模板传入文本content修饰 content = "

  • Django CBV与FBV原理及实例详解

    一.FBV FBV(function base views) 就是在视图里使用函数处理请求. 二.CBV CBV(class base views) 就是在视图里使用类处理请求. Python是一个面向对象的编程语言,如果只用函数来开发,有很多面向对象的优点就错失了(继承.封装.多态).所以Django在后来加入了Class-Based-View.可以让我们用类写View.这样做的优点主要下面两种: 提高了代码的复用性,可以使用面向对象的技术,比如Mixin(多继承) 可以用不同的函数针对不同的

  • Symfony2框架创建项目与模板设置实例详解

    本文实例讲述了Symfony2框架创建项目与模板设置的方法.分享给大家供大家参考,具体如下: 环境准备与概览 习惯于在windows使用netbean编辑器并使用virtualbox虚拟centos系统, 预将nginx+php-fpm+mysql,  当然apache也是不错的选择,   使用http://symfony在windows与centos上作为开发域名. 一.下载与环境设置 1. 如何于centos上面建立开发环境不再详述, 当然也可以在windows上面建立开发环境. 2. 关于

  • Django中间件拦截未登录url实例详解

    1.利用装饰器在视图中拦截未登录的url @login_required(login_url='/user/login/') def homepage(request): pass 这种方法适合于程序中只有少数几个需要登录拦截的url. 2. 利用中间件技术拦截未登录的url 2.1 在settings.py添加MIDDLEWARE设置:middleware.LoginCheckMiddleware MIDDLEWARE = [ 'django.middleware.security.Secur

  • django框架cookie和session用法实例详解

    本文实例讲述了django框架cookie和session用法.分享给大家供大家参考,具体如下: 首先知道http协议 http协议它是无状态的协议,验证的信息不会保留 基于请求响应,短连接 cookie 指一段小信息,内部是一组组的键值对,保存在客户端 访问一个地址时,服务器生成一个cookie,由浏览器保留在本地,再次访问地址时就会携带这个cookie,一般用于用户信息的验证 cookie的设置: obj.set_cookie(key,value,...) 下面来看一个简单的例子 #设置co

  • 只有 20 行的 JavaScript 模板引擎实例详解

    本文实例讲述了 JavaScript 模板引擎.分享给大家供大家参考,具体如下: 原文链接:JavaScript template engine in just 20 lines (译者吐槽:只收藏不点赞都是耍流氓) 前言 我仍旧在为我的JS预处理器AbsurdJS进行开发工作.它原本是一个CSS预处理器,但之后它扩展成为了CSS/HTML预处理器,很快它将支持JS到CSS/HTML的转换.它就像一个模板引擎一样能够生成HTML代码,也就是说它能够用数据填充模板当中的标识片段. 因此,我希望去写

随机推荐