整合营销服务商

电脑端+手机端+微信端=数据同步管理

免费咨询热线:

Django 模板系统解析

jango的模板系统是Web应用开发中重要的一环,它使我们能够将动态数据与静态模板进行分离,从而实现更好的代码维护性和可重用性。本文将解析Django模板系统实现机制,以及一些性能优化策略,帮助你更好地理解和使用Django的模板系统。

1. 模板系统概述

Django模板系统允许我们在模板中嵌入动态数据,并通过模板引擎将模板与数据进行渲染,最终生成HTML等格式的静态页面。模板系统使用特定的标记和语法来表示动态数据的插入和控制逻辑。

下面是一个简单的Django模板示例:

<!DOCTYPE html>
<html>
<head>
    <title>{{ title }}</title>
</head>
<body>
    <h1>Hello, {{ user.username }}!</h1>
    <ul>
        {% for item in items %}
        <li>{{ item }}</li>
        {% endfor %}
    </ul>
</body>
</html>

在上面的例子中,我们使用双花括号{{ }}来表示要插入的动态数据,使用{% %}来表示控制逻辑(如循环、条件判断等)。

2. 模板渲染的实现机制

Django模板渲染的实现机制可以分为以下几个步骤:

  1. 加载模板文件:Django从文件系统或缓存中加载模板文件,获取模板内容。
  2. 解析模板:Django解析模板内容,识别模板标签和变量。
  3. 生成模板对象:Django根据解析结果生成模板对象,它是一个Python可执行的对象。
  4. 传入上下文数据:在渲染模板时,我们需要传入一个上下文数据字典,其中包含了动态数据的值。
  5. 渲染模板:Django模板引擎根据模板对象和上下文数据,将动态数据插入到模板中,生成最终的HTML文本。
  6. 生成静态页面:渲染完成后,Django将生成的HTML文本作为响应返回给客户端,生成静态页面。

3. 模板渲染性能优化策略

模板渲染涉及对模板内容的解析和动态数据的替换,因此在性能方面需要考虑一些优化策略。

3.1. 缓存模板对象

为了避免在每次渲染时都重新解析模板,我们可以将模板对象缓存起来。Django的模板引擎会自动进行模板对象的缓存,默认情况下使用内存缓存。这样可以显著提高模板渲染的性能,特别是当模板较大或模板加载频繁时。

3.2. 使用select_related和prefetch_related优化数据库查询

在渲染模板时,可能需要从数据库中获取动态数据。在进行数据库查询时,我们可以使用select_relatedprefetch_related方法来优化查询性能。这些方法可以减少数据库查询的次数,提高查询效率。

3.3. 减少不必要的模板标签和逻辑

在模板中,尽量避免复杂的逻辑和嵌套,因为模板标签和逻辑会增加解析和渲染的时间。简化模板结构有助于提高模板渲染的效率。

3.4. 使用缓存机制

对于一些计算量较大或数据更新不频繁的动态数据,可以使用缓存机制来缓存渲染结果,从而避免重复渲染。Django提供了缓存框架,可以方便地实现缓存策略。

4. 结论

本文解析了Django模板系统的实现机制,并介绍了一些性能优化策略。通过了解模板渲染的流程和性能优化方法,我们可以更好地利用Django模板系统来开发高效的Web应用。

在前面

昨晚应该是睡的最好一天吧,最近一个月睡眠好差,睡不着不说,而且半夜总醒,搞的我第二天就会超没精神。

昨天下午去姐姐家,我刚进屋,小外甥直接就问我说:

老舅,你都很长时间没来啦,**(前女友)哪去了, 我们都好久没出溜溜了!

我顿了下说,她不喜欢我们了,等以后天暖和,我们再去溜溜。

才发现,忘掉一个人真的很难,明知道没结果,还是没法轻易做到波澜不惊,不去想念。

模板的使用

1、视图与html页面

视图: 浏览器窗口展示出来的页面内容,就是视图。 html页面: 在页面上展示出的纯文本内容,打开的浏览器页面,就是html页面

2、创建应用

python manage.py startapp mycontent

3、配置setting

setting.py文件中,找到INSTALLED_APPS,并在最后一行添加如下内容:

INSTALLED_APPS = [
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
    'mycontent',
]

4、添加模板templates

在新建的应用下创建templates模板文件夹,在模板下创建content.html,代码如下:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>content demo</title>
</head>
<body>
<h3>this is a content</h3>
</body>
</html>

5、url与视图绑定

接下来,需要将htmlurl绑定,啥意思,就是你访问url连接可以看到你刚才的html文件内容。 我们需要在mycontent/views.py里写视图函数添加如下代码:

from django.shortcuts import render

# Create your views here.
from django.shortcuts import render
from django.http import HttpResponse


# Create your views here.

def index(request):
    return HttpResponse("Hello world !  django ~~")


def my_content(request):
    return render(request, 'content.html')

django_project/urls.py里添加url访问路径,示例代码如下:

from django.conf.urls import url

from mycontent import views

urlpatterns = [
    url('^$', views.index),
    url('^my_content', views.my_content())
]


访问http://127.0.0.1:8000/my_content可以看到效果如下:

6、urls.py配置规则

主要有三个:path、re_path、url

  • path 只能绝对匹配路径地址,不支持正则匹配
  • re_path 支持正则匹配,django 1.x版本常用
  • url 支持正则匹配,实际上就是return re_path, django2.x版本推荐

path()re_path()源码看,path()的匹配规则是RoutePatternre_path()匹配规则是RegexPattern

path = partial(_path, Pattern=RoutePattern)
re_path = partial(_path, Pattern=RegexPattern)

url()源码,也是使用的re_path()

def url(regex, view, kwargs=None, name=None):
    return re_path(regex, view, kwargs, name)

7、动态url的处理

沿用博主的案例吧,就是分页跳转的例子,不能动态写死,只需要用正则表达式匹配数字即可,匹配任意数字,可以用正则\d+匹配,如下所示:

url('^pagehelper=\d+$', views.pagehelper)

模拟场景就是,传入非数字类型参数返回404 Not Found,在mycontent/views.py修改代码如下:

# Create your views here.
from django.http import HttpResponse, Http404
from django.shortcuts import render


# Create your views here.

def index(request):
    return HttpResponse("Hello world !  django ~~")


def my_content(request):
    return render(request, 'content.html')

def pagehelper(request,num):
    try:
        num=int(num)
        return render(request, 'content.html')
    except:
        raise Http404



django_project/urls.py里添加url访问路径,示例代码如下:

from django.conf.urls import url
from django.urls import re_path, path

from mycontent import views

urlpatterns = [
    path("index/", views.index),
    re_path('^$', views.index),
    url('^$', views.index),
    url('^my_content/$', views.my_content),
    url('^my_content/page=(\d+)$', views.pagehelper),
]

效果:

这个报错,主要是因为Django设置文件setting.py里面有个参数 DEBUG = True,将其更改为FalseDjango将显示标准的404页面。

默认显示如下:

知识点:

  • DEBUG=True:表示处于开发阶段,默认为True
  • DEBUG = False:表示开发完成正式发布产品上线
  • ALLOWED_HOSTS:域名访问权限,设置可以访问的域名,默认值为空\[], 只允许localhost127.0.0.1在浏览器上访问。
  • 修改DEBUG = False后,,必须重新启动服务,同时需要加个ALLOWED_HOSTS 地址,如果想让所以的域名都能访问,可以设置为:ALLOWED_HOSTS = ["*"]
  • 修改后使用如下命令重启:python manage.py runserver

效果如下:

写在最后

一段感情开始容易,结束却很难,它不是今天和明天的一刀切,分开了就是两条路,它是过往习惯的终结,是爱过但也不再爱的承认,是一个人面对未知的勇气,是从此一别两宽、各生欢喜。

如果可以,我也想这么释然,放过自己,不再这么内耗自己了。

个销售管理系统,由基础数据、员工信息、客户管理、产品管理、销售统计等功能组成,你若想一个人轻轻松松地开发完成,那我建议你采用Django3.0。

Django3.0用命令即可生成麻雀虽小五脏俱全的项目文件sales(系统架构),还可用命令生成功能模块(base),程序员可通过配置项目文件,将功能模块组合在一起。欲开发功能,先熟悉项目文件。

2.1 项目文件

两个sales文件,外层的sales,是存放项目内容的文件夹,这个名称可以随意更改,只要你喜欢就行。内层sales包含的settings.py、urls.py等文件,加上manage.py,便是Django的系统框架了。

__init__.py:内容一般是空的,常用来声明(它)所在之处的文件夹(sales)是个包;

settings.py:包括了项目的初始化设置,对整个项目进行相关配置,比如数据库连接参数、添加应用等;

asgi.py:构建异步Web界面和处理双向协议的新方式,是Django3.0版本新出的异步功能;

urls.py:url地址秀,网站目录,配置简单容易理解,可把用户在浏览器中发出的请求,映射到指定的应用程序上;

wsgi.py:告诉中间件(Apache或nginx):帮我运行Django开发的项目吧,我滴乖乖。开发过程中很少用到;

templates:存放HTML模板文件;

manage.py:Django的任务管理命令行工具。可用来生成数据库迁移文件,同步表结构,生成App等,是项目中的管家。

2.2 应用文件

在项目(sales)中的应用base,实际上是我们接下来要开发实现的销售管理系统中的基础数据功能模块来的。在base下的文件,无论你想不想都要搞清楚。

migration:存放数据表结构的指令文件,通过它们可以修改和创建数据库,从而在models.py模型类和数据库表之间进行迁移;

__init__.py:内容有时不是空的,它来声明base文件夹是个包;

admin.py:应用的连接,配置model,连接Form,声明在Django自带的后台管理系统;

apps.py:通常里面包含对应用的配置,如应用名称;

models.py:实体类定义,会生成对应的数据库表结构。同时还具备操作数据库的能力(API),省去手动编写增删改查的重复工作;

tests.py:单元测试工具,可以编写测试文档来测试所建立的应用;

views.py:虽然从名字上看是视图的意思,实际上是逻辑控制用的,同web页面交互,与models交流,协调整个系统有条不紊的动作。

2.3 MVC和MVT

一个软件产品,在进入开发阶段时,会先进行系统分析,分析的结果,最少包含3方面的内容(实际上肯定不止),有数据库表结构(或实体类)、有业务流程图,还有界面效果图,而这三方面一般是由不同的人负责的。

专业的人做专业的事,才能提高工作效率,才能把活干得更好。再说,一个人拿一份工资,也不愿意干几份活呀。正因为此,MVC, 模型(model)-视图(view)-控制器(controller)模式运势而生。

M(模型,Model):对数据逻辑内容进行处理,对数据库表中的数据进行增删改查操作。一般由程序猿负责开发实现,不一般的话,由老板自己完成,那还请你做什么?实体类(或表结构)由DBA设计,如果有这个岗位的话。

V(视图,View):处理数据显示(在界面上)的职责。由设计师负责,他们经常会对界面进行设计、设计、再设计。

C(控制器, controller):从视图读取数据,控制用户输入,向模型发送数据并最终导向视图(进行展示)。也是程序猿负责,这就是导致他们秃顶的原因之一。

现在几乎所有Web框架都基于MVC模式而设计,Django也不例外。只是为了彰显不同的地位,Django特意采用了MVT模式。

MVT实际上和MVC是一致的,其中M是Model(模型),V(Views)是控制器,而T(templates)相当月MVC中的V,换汤不换药,只是叫法不同而已。

2.4 Django运行

在Django框架中,文件虽然不多,但完全有必要搞清楚它们的运行机制,否则开发了大半天的功能,还说不清道不明子丑寅卯的话,是会被人笑掉大牙的。

用户通过浏览器访问应用系统,中间件接受到请求之后,判断其访问的地址,接着:

1. 调用Django通过在ROOT_URLCONF配置来决定根URLconf;
2. Django在URLconf中的所有URL模式中,查找第一个匹配/地址/的条目;
3. 如果找到匹配,将调用相应的视图函数;
4. 视图函数返回一个HttpResponse;
5. Django转换HttpResponse为一个适合的HTTP response,以Web page显示出来。

好了,有关Djangon3.0项目详解的内容,老陈讲完了,下一节进入Django开发流程。如果觉得对你有所帮助,希望老铁能转发点赞,让更多的人看到这篇文章。你的转发和点赞,就是对老陈继续创作和分享最大的鼓励。

一个当了10年技术总监的老家伙,分享多年的编程经验。想学编程的朋友,可关注:老陈说编程。我在分享Python,前端、Java和App方面的干货。关注我,没错的。

#Python##Django##程序员##Web##项目实战#