我的编程空间,编程开发者的网络收藏夹
学习永远不晚

类视图 中间件和模板

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

类视图 中间件和模板

模板和类视图

1. 在工程中创建模板目录templates。

然后修改settings.py配置文件中修改TEMPLATES配置项的DIRS值, 如下:

image_thumb

2. 定义模板

在templates新建一个index.html文件

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
    {{ city }}
</body>
</html>

 

3. 类视图的引入

在Django中也可以使用类来定义一个视图,称为类视图

 def register(request):
    """处理注册"""

    # 获取请求方法,判断是GET/POST请求
    if request.method == 'GET':
        # 处理GET请求,返回注册页面
        return render(request, 'index.html')
    else:
        # 处理POST请求,实现注册逻辑
        return HttpResponse('这里实现注册逻辑')

使用类视图可以将视图对应的不同请求方式以类中的不同方法来区别定义。如下所示

from django.views.generic import View

class RegisterView(View):
    """类视图:处理注册"""

    def get(self, request):
        """处理GET请求,返回注册页面"""
        return render(request, 'register.html')

    def post(self, request):
        """处理POST请求,实现注册逻辑"""
        return HttpResponse('这里实现注册逻辑')

 

类视图的好处:

  • 代码可读性好
  • 类视图相对于函数视图有更高的复用性, 如果其他地方需要用到某个类视图的某个特定逻辑,直接继承该类视图即可

 

4. 类视图的使用

定义类视图需要继承自Django提供的父类View,可使用from django.views.generic import View或者from django.views.generic.base import View 导入,定义方式如上所示。

from django.views.generic import View
class RegisterView(View):
    """类视图:处理注册"""
    def get(self, request):
        """处理GET请求,返回注册页面"""
        return render(request, 'register.html')

    def post(self, request):
        return render(request, 'index.html')

配置路由时,使用类视图的as_view()方法来添加

urlpatterns = [
    # 视图函数:注册
    # url(r'^register/$', views.register, name='register'),
    # 类视图:注册
    url(r'^register/$', views.RegisterView.as_view(), name='register'),
]

 

5. 类视图原理

 @classonlymethod
    def as_view(cls, **initkwargs):
        """
        Main entry point for a request-response process.
        """
        ...省略代码...

        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方法,按照不同请求方式调用不同请求方法
            return self.dispatch(request, *args, **kwargs)

        ...省略代码...

        # 返回真正的函数视图
        return view


    def dispatch(self, request, *args, **kwargs):
        # Try to dispatch to the right method; if a method doesn't exist,
        # defer to the error handler. Also defer to the error handler if the
        # request method isn't on the approved list.
        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
        return handler(request, *args, **kwargs)

 

总结:

URL里面调用as_view,调用dispatch方法,按照不同请求方式调用不同请求方法。最后返回真正的函数视图View

6. 定义模板,模板渲染

1. 在templates目录中新建一个模板文件,如test.html

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
   <h1>{{ city }}</h1>
</body>
</html>

2. 调用模板分为两步骤

1) 找到模板 loader.get_template(模板文件在模板目录中的相对路径) -> 返回模板对象

2) 渲染模板 模板对象.render(context=None, request=None) -> 返回渲染后的html文本字符串 context 为模板变量字典,默认值为None request 为请求对象,默认值为None

定义一个视图如下:

from django.http import HttpResponse
from django.template import loader
def test(request):
    # 1.获取模板
    template = loader.get_template('test.html')
    context = {'city': '北京'}
    # 2.渲染模板
    return HttpResponse(template.render(context))

 

返回:

image_thumb[1]

上面代码可以简化,djangi提供了render函数

render(request对象, 模板文件路径, 模板数据字典)

from django.http import HttpResponse
from django.template import loader
# def test(request):
#     # 1.获取模板
#     template = loader.get_template('test.html')
#     context = {'city': '北京'}
#     # 2.渲染模板
#     return HttpResponse(template.render(context))
from django.shortcuts import render
def test(request):
    context = {'city': '广州'}
    return render(request, 'index.html', context)

 

7.定义模板,模板渲染

1. 模板变量

变量名必须由字母、数字、下划线(不能以下划线开头)和点组成。

语法如下:

{{变量}}

模板变量可以使python的内建类型,也可以是对象。

def index(request):
    context = {
        'city': '北京',
        'adict': {
            'name': '西游记',
            'author': '吴承恩'
        },
        'alist': [1, 2, 3, 4, 5]
    }
    return render(request, 'index.html', context)
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
    <h1>{{ city }}</h1>
    <h1>{{ adict }}</h1>
    <h1>{{ adict.name }}</h1>  注意字典的取值方法
    <h1>{{ alist }}</h1>
    <h1>{{ alist.0 }}</h1>  注意列表的取值方法
</body>
</html>

返回:

image_thumb[2]

 

2. 模板的语言

For循环

{% for item in 列表 %}

循环逻辑
{{forloop.counter}}表示当前是第几次循环,从1开始
{%empty%} 列表为空或不存在时执行此逻辑

{% endfor %}
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
    {% for foo in alist %}
        <h1>{{ foo }}</h1>
        {{forloop.counter}}
    {% endfor %}

</body>
</html>

 

IF条件

{% if ... %}
逻辑1
{% elif ... %}
逻辑2
{% else %}
逻辑3
{% endif %}
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
   {% if city == "北京" %}
       <h1>北京</h1>
   {% elif city == "北2" %}
       <h1>北2</h1>
   {% else %}
       <h1>else</h1>
   {% endif %}

</body>
</html>

 

比较运算符 和 布尔运算符

==
!=
<
>
<=
>=

and
or
not
{% if a == 1 %}  # 正确
{% if a==1 %}  # 错误

 

过滤器

语法如下:

  • 使用管道符号|来应用过滤器,用于进行计算、转换操作,可以使用在变量、标签中。
  • 如果过滤器需要参数,则使用冒号:传递参数。

变量|过滤器:参数

列举几个如下:

safe,禁用转义,告诉模板这个变量是安全的,可以解释执行

length,长度,返回字符串包含字符的个数,或列表、元组、字典的元素个数。

default,默认值,如果变量不存在时则返回默认值。

 

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
   {{ now_date|date:"Y-m-j H:i:s" }}<br/>
</body>
</html>

 

注释

1)单行注释语法如下:

{#...#}

2)多行注释使用comment标签,语法如下:

{% comment %}
...
{% endcomment %}

 

模板继承

父模板

如果发现在多个模板中某些内容相同,那就应该把这段内容定义到父模板中。

标签block:用于在父模板中预留区域,留给子模板填充差异性的内容,名字不能相同。 为了更好的可读性,建议给endblock标签写上名字,这个名字与对应的block名字相同。父模板中也可以使用上下文中传递过来的数据。

{% block 名称 %}
预留区域,可以编写默认内容,也可以没有默认内容
{% endblock  名称 %}

子模板

标签extends:继承,写在子模板文件的第一行。

{% extends "父模板路径"%}

子模版不用填充父模版中的所有预留区域,如果子模版没有填充,则使用父模版定义的默认值。

填充父模板中指定名称的预留区域。

{% block 名称 %}
实际填充内容
{{ block.super }}用于获取父模板中block的内容
{% endblock 名称 %}

 

例:

父模板block 名称

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>

{% block index%}
    <h1>父模板</h1>
    {{ now_date|date:"Y-m-j H:i:s" }}<br/>
{% endblock index %}

</body>
</html>

子模板继承父模板

{% extends "index.html" %}  {# 继承父模板 #}
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
    {% block index %}
        <h1>子模板</h1>  {# 子模板实际填充内容 #}
        {{ block.super }} {# 父模板,block里的内容 #}
    {% endblock index %}
</body>
</html>

 

返回:

1558507824(1)_thumb

 

8.中间件

1. 中间件定义

定义一个中间件工厂函数,然后返回一个可以别调用的中间件。

中间件工厂函数需要接收一个可以调用的get_response对象。

返回的中间件也是一个可以被调用的对象,并且像视图一样需要接收一个request对象参数,返回一个response对象。

def simple_middleware(get_response):
    # 此处编写的代码仅在Django第一次配置和初始化的时候执行一次。

    def middleware(request):
        # 此处编写的代码会在每个请求处理视图前被调用。

        response = get_response(request)

        # 此处编写的代码会在每个请求处理视图之后被调用。

        return response

    return middleware

例如:

我们在users应用中新建一个middleware.py文件

image

 

def my_middleware(get_response):
    print('init 被调用')
    def middleware(request):
        print('before request 被调用')
        response = get_response(request)
        print('after response 被调用')
        return response
    return middleware

2 . 我们需要在setting.py中注册中间件,如下:

image

3. 定义一个视图

def demo_view(request):
    print('view 视图被调用')
    return HttpResponse('OK')

 

返回:

image

init被调用了两次

原因:

Django运行在调试模式下,中间件init部分有可能被调用两次。

4. 执行流程

image

 

5. 多个中间件执行顺序

  • 在请求视图被处理,中间件由上至下依次执行
  • 在请求视图被处理,中间件由下至上依次执行

image

def my_middleware(get_response):
    print('init 被调用')
    def middleware(request):
        print('before request 被调用......1')
        response = get_response(request)
        print('after response 被调用.....1')
        return response
    return middleware


def my_middleware2(get_response):
    print('init2 被调用')
    def middleware(request):
        print('before request 被调用.......2')
        response = get_response(request)
        print('after response 被调用......2')
        return response
    return middleware

注册两个中间件

MIDDLEWARE = [
    'django.middleware.security.SecurityMiddleware',
    'django.contrib.sessions.middleware.SessionMiddleware',
    'django.middleware.common.CommonMiddleware',
    # 'django.middleware.csrf.CsrfViewMiddleware',
    'django.contrib.auth.middleware.AuthenticationMiddleware',
    'django.contrib.messages.middleware.MessageMiddleware',
    'django.middleware.clickjacking.XFrameOptionsMiddleware',
    'users.middleware.my_middleware',  # 添加
    'users.middleware.my_middleware2',  # 添加
]

 

 

返回

image

 

 

总结:

中间件在请求视图被处理,中间件由上至下依次执行

在请求视图被处理,中间件由下至上依次执行

 

注意:如果在manage同级下创建了middleware那么每个APP都会调用这个中间件,意思就是全局的。大笑

 

扩展类方法写中间件:

导入from django.utils.deprecation import MiddlewareMixin, 继承MiddlewareMixin这个类

from django.utils.deprecation import MiddlewareMixin

class my_middleware(MiddlewareMixin):
    def process_request(self, request):
        print("middle_ware1.process_request......111")
    def process_response(self, request, response):
        print("middle_ware1.process_response.......2222")
        return response

返回

image

添加两个中间件试试

返回

image

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

类视图 中间件和模板

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

类视图 中间件和模板

模板和类视图 1. 在工程中创建模板目录templates。 然后修改settings.py配置文件中修改TEMPLATES配置项的DIRS值, 如下: 2. 定义模板 在templates新建一个index.html文件
2023-01-31

怎么解析Django的视图和模板

怎么解析Django的视图和模板,针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。一、视图和模板1、函数视图以函数的方式定义的视图称为函数视图,函数视图便于理解。但是遇到一个视
2023-06-02

DEDECMS解析模板之灵活应用视图类

下面我们就简单的创建一个属于自己的php页面处理文件,在文件里,用织梦自身的模板引擎和视图,去解析我预先创建好的静态html文件。在此,我简单的写了如下几段代码: 第一步,创建自己的php页面处理文件,在这里,我在根目录
2022-06-12

关于:url、视图函数、模板3者之间参数

url获取参数的途径有2个:1、url中的变量,设置在URL地址中。2、url中添加字典,设置在URL地址外。urlpatterns = [ path('//', views
2023-01-31

C++ 中模板类和模板函数的应用场景?

模板类和模板函数在 c++++ 中通过参数化类型提供代码重用性。模板类允许创建通用类,如容器类,适用于各种数据类型。模板函数允许创建处理不同数据类型的函数,如排序算法和数学函数。通过使用模板,可以编写更通用和可扩展的代码,简化开发并提高效率
C++ 中模板类和模板函数的应用场景?
2024-04-24

Xamarin XAML语言中如何实现模板视图TemplatedView

这篇文章给大家分享的是有关Xamarin XAML语言中如何实现模板视图TemplatedView的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。模板视图TemplatedView与模板页面相对的是Template
2023-06-04

C++中单向链表类模板和iterator迭代器类的示例分析

这篇文章主要介绍了C++中单向链表类模板和iterator迭代器类的示例分析,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。链表用来构建许多其它数据结构,如堆栈,队列和他们的派
2023-06-29

统一Win7文件夹模板显示让所有的文件夹遵从一个规则显示视图

本文介绍如何统一设置Window 7文件夹模板视图方法,也就是如何让所有的文件夹遵从一个规则显示视图,比如按照列表、缩略图、修改日期显示详细列表等形式显示,而Windows 7的默认显示模式则是每个文件夹需要单独设置,天缘使用Windows
2023-06-04

JavaScript MVC架构中的数据绑定:实现视图和模型之间的无缝交互

JavaScript MVC架构中的数据绑定是实现视图和模型之间无缝交互的关键,通过双向数据绑定,视图中的变化可以自动更新模型,而模型的变化也可以自动更新视图,从而让开发人员无需手动操作即可保持数据的一致性。
JavaScript MVC架构中的数据绑定:实现视图和模型之间的无缝交互
2024-02-12

解释 SQL 中表、视图和同义词之间的区别

让我们了解一下结构化查询语言 (SQL) 中的表、视图和同义词是什么。表、视图和同义词表是数据的存储库,其中在表中它是一个物理实体。表物理上驻留在数据库中。视图不是数据库物理表示的一部分。它经过预编译,因此数据检索速度更快,并且还提供安全的
2023-10-22

PHP MVC架构中的控制器、模型和视图分工详解

PHP架构中的控制器、模型和视图分工详解,它们之间的关系以及如何使用它们来构建Web应用程序。
PHP MVC架构中的控制器、模型和视图分工详解
2024-02-05

如何在Cacti系统中创建自定义数据源和图表模板

在Cacti系统中创建自定义数据源和图表模板需要按照以下步骤进行:登录Cacti系统,进入管理界面。在左侧导航栏中选择“管理”下的“数据源”,点击“添加”按钮。在新建数据源页面中填写相关信息,包括数据源名称、数据源类型、数据源参数等。数
如何在Cacti系统中创建自定义数据源和图表模板
2024-03-15

浅析C++模板类型中的原样转发和可变参数的实现

可变参数模板(variadictemplates)是C++11新增的强大的特性之一,它对模板参数进行了高度泛化,能表示0到任意个数、任意类型的参数,这篇文章主要介绍了C++可变参数模板的展开方式,需要的朋友可以参考下
2022-11-13

thinkphp中将模板文件和缓存目录分离出来的案例

这篇文章主要介绍了thinkphp中将模板文件和缓存目录分离出来的案例,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。thinkphp中将模板文件和缓存目录分离出来直接在入口文
2023-06-08

怎么更好地理解中间件和洋葱模型

这篇文章主要介绍“怎么更好地理解中间件和洋葱模型”,在日常操作中,相信很多人在怎么更好地理解中间件和洋葱模型问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”怎么更好地理解中间件和洋葱模型”的疑惑有所帮助!接下来
2023-06-16

iOS开发中视图的下拉放大和上拉模糊的效果实现

把"秘密"的Cell效果整体视图都放到scrollView中,基本是和secret app 一模一样的效果了. 代码如下:(模糊效果的类就不写了,大家可以搜"UIImage+ImageEffects",还要导入Accelerate.fram
2022-05-29

编程热搜

  • Python 学习之路 - Python
    一、安装Python34Windows在Python官网(https://www.python.org/downloads/)下载安装包并安装。Python的默认安装路径是:C:\Python34配置环境变量:【右键计算机】--》【属性】-
    Python 学习之路 - Python
  • chatgpt的中文全称是什么
    chatgpt的中文全称是生成型预训练变换模型。ChatGPT是什么ChatGPT是美国人工智能研究实验室OpenAI开发的一种全新聊天机器人模型,它能够通过学习和理解人类的语言来进行对话,还能根据聊天的上下文进行互动,并协助人类完成一系列
    chatgpt的中文全称是什么
  • C/C++中extern函数使用详解
  • C/C++可变参数的使用
    可变参数的使用方法远远不止以下几种,不过在C,C++中使用可变参数时要小心,在使用printf()等函数时传入的参数个数一定不能比前面的格式化字符串中的’%’符号个数少,否则会产生访问越界,运气不好的话还会导致程序崩溃
    C/C++可变参数的使用
  • css样式文件该放在哪里
  • php中数组下标必须是连续的吗
  • Python 3 教程
    Python 3 教程 Python 的 3.0 版本,常被称为 Python 3000,或简称 Py3k。相对于 Python 的早期版本,这是一个较大的升级。为了不带入过多的累赘,Python 3.0 在设计的时候没有考虑向下兼容。 Python
    Python 3 教程
  • Python pip包管理
    一、前言    在Python中, 安装第三方模块是通过 setuptools 这个工具完成的。 Python有两个封装了 setuptools的包管理工具: easy_install  和  pip , 目前官方推荐使用 pip。    
    Python pip包管理
  • ubuntu如何重新编译内核
  • 改善Java代码之慎用java动态编译

目录