Django——mako的配置与使用方法

article/2025/9/11 6:13:00

一、前言

mako最大的特点就是允许在HTML中随意书写Python代码,挺起就很心动啊!!

二、准备阶段

新建一个项目mako_project,再新建一个app叫app,然后安装mako(要联网安装)

pip install mako

然后再注册app,配置templates,还有static文件,这里就不赘述了。

实际上在配置mako时,并不需要对settings做特别的处理,主要是对render的处理,要重写一下render方法。
在app文件夹下创建一个base_render.py
写入以下代码:

#coding:utf-8from mako.lookup import TemplateLookup  # 引入配置文件
from django.template import RequestContext
from django.conf import settings  # 把django的settings引入进来
from django.template.context import Context
from django.http import HttpResponsedef render_to_response(request, template, c=None):  # 考虑到可能要传入一些参数,这里加一个c,默认是空context_instance = RequestContext(request)  # 一个实例path = settings.TEMPLATES[0]['DIRS'][0]  # 把settings中的TEMPLATES引入,因为TEMPLATES是个数组,我们只需要取[0]就可以了# TEMPLATES[0]是一个字典,取出key = 'DIRS' 的value,是一个列表,然后再取[0],就是templates的地址了lookup = TemplateLookup(directories=[path],output_encoding='utf-8',input_encoding='utf-8')  # template的目录就是path,再设置一下输入输出格式,都是utf-8mako_template = lookup.get_template(template)  # 把模板导入if context_instance:  # 判断实例是否存在context_instance.update(c)else:context_instance = Context(c)  # 如果没有上下文,就在这里创建,并把需要的数据传入data = {}for d in context_instance:data.update(d)# 创建csrf_token,mako里不会自带data['csrf_token'] = '<input type="hidden" name="csrfmiddlewaretoken" value="{0}" />'.format(request.META['CSRF_COOKIE'])return HttpResponse(mako_template.render(**data))

view.py中

#coding:utf-8from django.views.generic import View
from .base_render import render_to_responseclass Test(View):TEMPLATE = 'test.html'def get(self, request):return render_to_response(request, self.TEMPLATE)

然后在urls中注册路由

from app.views import Testurlpatterns = [path('admin/', admin.site.urls),path('test/', Test.as_view())
]

运行一下,报错了。
在这里插入图片描述
other_dict must be a mapping (dictionary-like) object.

主要问题就出现在参数 c 上:context_instance.update(c),c需要是个字典,所以我们可以判断一下,如果c是空的话,就让c = 一个空字典{}。不建议在定义函数那里就让c是一个空字典,会有安全隐患。

    if not c:c = {}

三、Mako模块的编写

在views中加入数据

    def get(self, request):data = {'name': 'cong', 'age': 18}return render_to_response(request, self.TEMPLATE, data)

mako中HTML的书写格式就不同了,这里是**${}**

mako的厉害之处就是可以完全使用Python语言:

<%!from django.conf import settings%>${settings.TEMPLATES[0]['DIRS'][0]}

在这里插入图片描述
这个地址就被拿过来了。

不过依旧要%for %endfor 。。。
再写个for循环

%for i in range(20):<input type="text" value="${i}" />
%endfor

在这里插入图片描述
还可以自己写一个函数

<%def name():return 'my name is cong'
%><input style="display:block" type="text" name="username" value="${name()}" />

在这里插入图片描述
依旧可以继承模板
所有的模板继承都是以函数的形式进行的。
这里self. 是表示这个函数是在当前的HTML里面的。
还可以嵌套调用函数
注意:定义完之后,一定要再调用一下函数才可以使用哦!

<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><title>${self.title()}</title>
</head>
<body>${self.content()}${self.js()}
</body>
</html>
<%def name="content()">${self.main()}
</%def>
<%def name="main()"></%def>
<%def name="title()"></%def>
<%def name="js()"></%def>
<%def name="css()"></%def>

如何在html中继承:

<%inherit file="base.html" />

使用模板

<%def name="main()">
<h1>hello mako</h1>
</%def>

在这里插入图片描述

<%inherit file="base.html" /><%def name="main()">
<h1>hello mako</h1>
</%def><%def name="js()">
<script src="https://cdn.bootcss.com/jquery/2.2.0/jquery.js"></script></%def>
<%def name="title()">test...dazzy</%def>

在html中调用函数的顺序随意,函数的位置是按照base模板定义的来确定。

四、HTML嵌套,以及传值

新建一个extend.html文件

<%page args="local_content" /><textarea>${local_content}
</textarea>

通过这种方式,就可以在其他页面找到一个local_content,然后把值传入进来,再显示出来。

然后在index.html的main函数中,给local_content传入值:

<%def name="main()">
<%include file="extend.html" args="local_content='你好 mako'" /><h1>hello mako</h1>
</%def>

在这里插入图片描述
使用情景:发布信息时,许多HTML文件中都要用到,不同HTML传过来的文件也不一样。
这样就可以公用一个HTML模板,并且随意传入值。

五、静态文件导入

static文件夹下新建test.css

* {background-color: pink;
}

html中

<%def name="css()">
<link rel="stylesheet" href="/static/test.css" />
</%def>

在这里插入图片描述
如果有公用的css文件,就可以在base.html中直接传入进去。
通过继承base模板,每个HTML就都会有最原始的css样式了。


http://chatgpt.dhexx.cn/article/CVxr69ur.shtml

相关文章

Xen新特性

4.0 为了增强主机层面的性能和可扩展性&#xff0c;新的Xen 4.0虚拟机管理程序现在横跨主机服务器上的128(之前64 )个物理处理器&#xff0c;最多可以处理1TB的物理主系统内存。在访客环境中&#xff0c;基于Xen 4.0运行的虚拟机现在可以分配给多达128个虚拟处理器/VCPU(不过…

Xen - Networking

Xen - Networking Step 0 : Xen底下的網路架構 Step 1 : 虛擬還是實體 Step 2 : network-bridge Step 3 : network-nat Step 4 : network-route Step 5 : 參考網頁 Step 0 : Xen底下的網路架構 在虛擬化下的環境就屬網路裝置最為複雜難懂,不過模式大致可以畫分成 3 種 1.netw…

Xen虚拟化之一:Xen环境组件详解

Xen是一个开放源代码虚拟机监视器(Virtual Machine Monitor&#xff0c;简称为VMM)&#xff0c;由剑桥大学开发&#xff0c;它致力于实现在单个计算机上运行多达128个有完全功能的操作系统。Xen通过一种叫做半虚拟化(paravirtualization)的技术获得高效能的表现&#xff08;较少…

浅谈Xen和半虚拟化技术

研究生入学的时候&#xff0c;看了一篇论文——《Xen and the art of virtualization》。现在时隔一年&#xff0c;准备对此进行一番整理。下文是我Xen为例的半虚拟化技术的理解&#xff1a; 虚拟机概况 首先从虚拟机说起&#xff0c;虚拟机技术最早由IBM于上世纪六七十年代提…

xen架构

Xen是一个虚拟机监视器&#xff08;Virtual machine monitor&#xff09;&#xff0c;针对X86系列计算机设计&#xff0c;它能够支持多个客户计算机的同时运行&#xff0c;并且能够达到较好的一个性能水平和资源隔离。Xen是一个开放源代码软件&#xff0c;在GNU General Public…

Xen概述

http://my.oschina.net/davehe/blog/94039 1 Xen概述 1.1 简介 Xen是由剑桥大学计算机实验室开发的一个开源项目。是一个直接运行在计算机硬件之上的用以替代操作系统的软件层&#xff0c;它能够在计算机硬件上并发的运行多个客户操作系统&#xff08;Guest OS&#xff…

KVM和Xen虚拟化有什么区别?Xen和KVM优缺点对比

KVM和Xen是两大虚拟化技术&#xff0c;KVM和Xen又是免费开源的管理程序&#xff0c;新手站长网分享虚拟化技术KVM和Xen的区别优势对比&#xff1a; KVM和Xen的区别 KVM&#xff1a;KVM是轻量级的虚拟化管理程序模块&#xff0c;该模块主要来自Linux内核&#xff1b;KVM的虚拟…

Xen与XenServer的区别

说到XenServer&#xff0c;总是离不开Xen&#xff0c;所以我要说他们的区别&#xff0c;得首先从Xen开始说起&#xff01; Xen体系架构 Xen hypervisor体系架构 Xen 的 VMM ( Xen Hypervisor ) 位于操作系统和硬件之间&#xff0c;负责为上层运行的操作系统内核提供虚拟化的硬件…

xen的安装

一、 Xen介绍 : 在虚拟化软件的部份&#xff0c;可分为VMWare、Xen、KVM、VritualBox是较为常见的。在Xen这到自由软件上主要可分为半虚拟化(Para-virtualization) 及全虚拟化 (Full virtualization) 两种&#xff0c;其中半虚拟化主要是透过修改 Linux 核心来达成的虚拟技术。…

虚拟机体验之 Xen 篇 —— 令人脑洞大开的奇异架构

转载于https://www.cnblogs.com/youxia/p/linux022.html#_label0 阅读目录 总结&#xff1a; 这一篇我要体验的虚拟机系统是 Xen。在虚拟机领域&#xff0c;Xen 具有非常高的知名度&#xff0c;其名字经常在各类文章中出现。同时 Xen 也具有非常高的难度&#xff0c;别说玩转…

xen基础

xen结构概述 一个 Xen 虚拟化环境包括一组项目&#xff0c;它们一起工作来提供虚拟化环境&#xff1a;Xen hypervisor&#xff1b;dom0&#xff1b;domain management and control&#xff0c;域的管理和控制&#xff1b;domU PV 客户机&#xff1b;domU HVM 客户机。 它们之间…

Xen 简介

---------------------------------同样来自 IBM ------------------------------------ Xen 是一种类型 1 虚拟机管理程序&#xff0c;它创建系统资源的逻辑池&#xff0c;使许多虚拟机可共享相同的物理资源。 Xen 是一个直接在系统硬件上运行的虚拟机管理程序。Xen 在系统硬…

全面详解Python与Ruby,到底哪款更优秀

今天,我和大家讨论一下是Python开发语言web好还是Ruby开发语言web好,有需要的小伙伴,可以参考一下。对这方面有自己见解的大神,可以交流一下。希望大家可以认真阅读哦! Python 和 Ruby 都是目前用来开发 websites、web-based apps 和 web services 的流行编程语言之一。 …

Ruby入门级示例代码

【实例简介】 针对入门级的新手参考 【实例截图】 目录结构&#xff1a; 文件&#xff1a;590m.com/f/25127180-494436327-f5ef7f&#xff08;访问密码&#xff1a;551685&#xff09; 【核心代码】class ItemController < ApplicationControllerscaffold :itemdef creat…

Ruby基础教程(Day1)—— Ruby初探

前提&#xff1a;自行安装ruby 一、Ruby初探 最常见的方法是使用ruby命令执行&#xff08;在helloruby.rb中输入print("Hello,Ruby.\n")&#xff09; 在命令行输入ruby helloruby.rb irb命令&#xff0c;以交互命令行方式来执行 在控制台执行irb如下图所示 对象 …

RubyPloticus

原文&#xff1a; RubyPloticus ruby 2006年6月19日 Bliki 索引 译注&#xff1a;代码和生成的图片示例可从这里下载。 在最近的帖子“ 评估Ruby”中&#xff0c;我提到一位同事曾在一个Web应用中加入了一些漂亮的数据图表&#xff0c;有人email问我是…

Ruby(一)

Ruby 是一种开源的面向对象程序设计的服务器端脚本语言&#xff0c;可运行于多种平台&#xff0c;如 Windows、MAC OS 和 UNIX 的各种版本。Ruby流行起来的根本原因是因为基于Ruby的Web开发框架Rails的广泛使。 1、ruby环境 windows&#xff1a;Downloads (rubyinstaller.org…

Python 和 Ruby 的对比

&#xff08;点击上方公众号&#xff0c;可快速关注&#xff09; 来源&#xff1a;js信仰者 segmentfault.com/a/1190000010756033 如有好文章投稿&#xff0c;请点击 → 这里了解详情 最近在考虑学习一门后端语言&#xff0c;在ruby和python直接犹豫&#xff0c;然后自己做了…

【Python】Pyyaml和ruamel.yaml

目录 PYYAML 读取yaml 保存yaml 读取保存的yaml文件 yaml文件规则 yaml文件数据结构 ruamel.yaml 格式化保存yaml 使用ruamel.yaml读取yaml 使用ruamel.yaml时python中符号对应于yaml中符号 PYYAML config.yaml文件 username: zxx age: 18 orther:height: 175CMwei…

Ruby教程(基础篇)

1. Print和puts的区别 puts输出内容独立成行、自动换行&#xff0c;而print会把输出的内容打印在同一行。 2. 变量和常量 character_name "Kevin" #variable name变量character_age "21"puts ("name:" character_name)puts (character_a…