pug模板引擎(原jade)

前面的话

  为什么要引入pug,pug有什么特别之处呢?有一些嵌套层次较深的页面,可能会出现巢状嵌套,如下图所示

  在后期维护和修改时,一不小心少了一个尖括号,或者某个标签的开始和闭合没有对应上,就会导致DOM结构的混乱甚至是错误。所以,有人发明了HAML,它最大的特色就是使用缩进排列来代替成对标签。受HAML的启发,pug进行了javascript的实现。

  Pug原名不叫Pug,是大名鼎鼎的jade,后来由于商标的原因,改为Pug,哈巴狗。其实只是换个名字,语法都与jade一样。丑话说在前面,Pug有它本身的缺点——可移植性差,调试困难,性能并不出色,但使用它可以加快开发效率。本文将详细介绍pug模板引擎

 

安装

  使用npm安装pug

$ npm install pug

  但运行pug命令时,提示pug命令未找到

  这时,需要安装pug命令行工具pug-cli

  [注意]一定要全局安装pug-cli,否则无法正常编译

npm install  pug-cli -g

  再运行pug命令时,正常执行

 

命令行

  在学习pug基础语法之前,首先要了解pug的命令行的使用

【基础编译】

  将如下内容输入文件中,并命名为index.pug

htmlheadtitle aaabody

  在命令行中敲入pug index.pug即可实现基础编译

  在当前目录下生成一个index.html,是index.pug编译后的结果

【sublime两列设置】

  但是,这样查看并不方便。下面将sublime设置为两列放置,将index.pug和index.html分别放置在左右两列,方便查看

【自动编译】

  使用pug -w功能可以实现自动编译

  更改index.pug文件并保存后,index.html文件会实时更新为最新的编译的文件

【标准版HTML】

  如上所示,默认地,pug编译出的HTML文件是压缩版的。如果要编译标准版的HTML文件,需要设置-P参数

pug index.html -P

【路径设置】

  如果并不希望在当前目录下输入编译后的HTML文件,而是有自定义目录的需求,则需要设置-o参数

  如下设置,index.html将输入到a目录下面,如果a目录不存在,则会新建a目录

pug index.pug -o a

【重命名】

  默认地,编译后的HTML与pug文件同名。如果需要重命名,则可以进行如下设置

  通过如下设置,可以同时设置路径和名称

  [注意]这里的路径必须提前建立好,否则不会成功

pug <xx.pug> <xx/xx.html>

  最终,test.html文件被保存到templates目录下

【批量编译】

  假设,编译href目录下所有的pug文件

 

结构语法

  下面介绍关于结构的基础语法

标签

【树状】

  在默认情况下,在每行文本的开头(或者紧跟白字符的部分)书写这个 HTML 标签的名称。使用缩进来表示标签间的嵌套关系,这样可以构建一个 HTML 代码的树状结构  

ulli Item Ali Item Bli Item C

【内联】

  为了节省空间, Pug 嵌套标签提供了一种内联式语法

a: img

【自闭合】

  Pug知道哪些元素是自闭合的,也可以通过在标签后加上 / 来明确声明此标签是自闭合的

img
input
img/
input/

【DOCTYPE】

   HTML5的DOCTYPE书写如下

doctype html

  也可以自定义一个 doctype 字面值 

doctype html PUBLIC "-//W3C//DTD XHTML Basic 1.1//EN"

 

内容

   Pug 提供了三种常用的方式来放置内容

【管道文本】

  这是最简单的向模板添加纯文本的方法。只需要在每行前面加一个 | 字符,这个字符在类 Unix 系统下常用作“管道”功能,因此得名

| 纯文本当然也可以包括 <strong>HTML</strong> 内容。
p| 但它必须单独起一行。

【标签内文本】

  这实际上是最常见的情况,文本只需要和标签名隔开一个空格即可

p 纯文本当然也可以包括 <strong>HTML</strong> 内容。

【嵌入大段文本】

  有时可能想要写一个大段文本块。比如嵌入脚本或者样式。只需在标签后面接一个 .即可

  [注意]不要有空格

script.if (usingPug)console.log('这是明智的选择。')elseconsole.log('请用 Pug。')

 

属性

  标签属性和 HTML 语法非常相似,它们的值就是普通的 JavaScript 表达式。可以用逗号作为属性分隔符,也可以不加逗号

a(href='baidu.com') 百度
= '\n'
a(class='button' href='baidu.com') 百度
= '\n'
a(class='button', href='baidu.com') 百度

【多行属性】

  如果有很多属性,可以把它们分几行写

input(type='checkbox'name='agreement'checked
)

【长属性】

  如果有一个很长的属性,并且JavaScript运行时引擎支持ES2015模板字符串,可以使用它来写属性值

input(data-json=`{"非常": "长的","数据": true}
`)

【特殊字符】

  如果属性名称中含有某些奇怪的字符,可能会与 JavaScript 语法产生冲突的话,可以将它们使用 "" 或者 '' 括起来。还可以使用逗号来分割不同的属性

div(class='div-class', (click)='play()')
div(class='div-class' '(click)'='play()')

【转义属性】

  默认情况下,所有的属性都经过转义(即把特殊字符转换成转义序列)来防止诸如跨站脚本攻击之类的攻击方式。如果要使用特殊符号,需要使用 != 而不是 =

  [注意]未经转义的缓存代码十分危险。必须正确处理和过滤用户的输入来避免跨站脚本攻击

div(escaped="<code>")
div(unescaped!="<code>")

【布尔值】

  在Pug中,布尔值属性是经过映射的,这样布尔值(truefalse)就能接受了。没有指定值时,默认是true

input(type='checkbox' checked)
= '\n'
input(type='checkbox' checked=true)
= '\n'
input(type='checkbox' checked=false)
= '\n'
input(type='checkbox' checked=true.toString())

【行内样式】

  style(样式)属性可以是一个字符串(就像其他普通的属性一样)还可以是一个对象

a(style={color: 'red', background: 'green'})

【类和ID】

  类可以使用 .classname 语法来定义,ID 可以使用 #idname 语法来定义

  考虑到使用 div 作为标签名这种行为实在是太常见了,所以如果省略掉标签名称的话,它就是默认值

a.button
.content
="\n"
a#main-link
#content

 

标签嵌入

  标签支持一种标签嵌入的写法,形式如下

#[标签名(标签属性)  标签内容]

  对于内联标签来说,这种写法比较简单

p.这是一个很长很长而且还很无聊的段落,还没有结束,是的,非常非常地长。突然出现了一个 #[strong 充满力量感的单词],这确实让人难以 #[em 忽视]。

【空格调整】

  Pug 默认会去除一个标签前后的所有空格,而标签嵌入功能可以在需要嵌入的位置上处理前后空格

p| 如果我不用嵌入功能来书写,一些标签比如strong strong| 和em em| 可能会产生意外的结果。
p.如果用了嵌入,在 #[strong strong] 和 #[em em] 旁的空格就会让我舒服多了。

  

注释

【单行注释】

  单行注释和 JavaScript 类似,但是必须独立一行

// 一些内容
p foo
p bar

【不输出注释】

  只需要加上一个横杠,就可以使用不输出注释

//- 这行不会出现在结果里
p foo
p bar

【块注释】

body//
    随便写多少字都没关系。

【条件注释】

  Pug 没有特殊的语法来表示条件注释(conditional comments)。不过因为所有以 < 开头的行都会被当作纯文本,因此直接写一个 HTML 风格的条件注释也是没问题的

<!--[if IE 8]>
<html lang="en" class="lt-ie9">
<![endif]-->
<!--[if gt IE 8]><!-->
<html lang="en">
<!--<![endif]-->

 

逻辑语法

  以下是关于模板逻辑的语法

JS代码

【不输出的代码】

  用 - 开始一段不直接进行输出的代码

- for (var x = 0; x < 3; x++)li item

【输出的代码】

  用=开始一段带有输出的代码,它应该是可以被求值的一个JavaScript表达式。为安全起见,它将被HTML转义

p= '这个代码被 <转义> 了!'
p= '这个代码被 <转义> 了!'

【不转义的输出代码】

  用 != 开始一段不转义的,带有输出的代码。这将不会做任何转义,所以用于执行用户的输入将会不安全

p!= '这段文字 <strong>没有</strong> 被转义!'
p!= '这段文字' + ' <strong>没有</strong> 被转义!'

 

变量

【内容变量】

  使用=或#{}来进行变量的真实值替换

- var title = "On Dogs: Man's Best Friend";
- var author = "enlore";
- var theGreat = "<span>转义!</span>";h1= title
p #{author} 笔下源于真情的创作。
p 这是安全的:#{theGreat}

  在 #{ 和 } 里面的代码也会被求值、转义,并最终嵌入到模板的渲染输出中

- var msg = "not my inside voice";
p This is #{msg.toUpperCase()}

  Pug 足够聪明来分辨到底哪里才是嵌入表达式的结束,所以不用担心表达式中有 },也不需要额外的转义

p 不要转义 #{'}'}!

  如果需要表示一个 #{ 文本,可以转义它,也可以用嵌入功能来生成

p Escaping works with \#{interpolation}
p Interpolation works with #{'#{interpolation}'} too!

  使用!{}嵌入没有转义的文本进入模板中

- var riskyBusiness = "<em>我希望通过外籍教师 Peter 找一位英语笔友。</em>";
.quotep 李华:!{riskyBusiness}

  [注意]如果直接使用用户提供的数据,未进行转义的内容可能会带来安全风险

【属性变量】

  如果要在属性当中使用变量的话,需要进行如下操作

- var url = 'pug-test.html';
a(href='/' + url) 链接
= '\n'
- url = 'https://example.com/'
a(href=url) 另一个链接

  如果JavaScript运行时支持 ECMAScript 2015 模板字符串,还可以使用下列方式来简化属性值

- var btnType = 'info'
- var btnSize = 'lg'
button(type='button' class='btn btn-' + btnType + ' btn-' + btnSize)
= '\n'
button(type='button' class=`btn btn-${btnType} btn-${btnSize}`)

  &attributes 语法可以将一个对象转化为一个元素的属性列表

div#foo(data-bar="foo")&attributes({'data-foo': 'bar'})
- var attributes = {};
- attributes.class = 'baz';
div#foo(data-bar="foo")&attributes(attributes)

【变量来源】

  变量来源有三种,分别是pug文件内部、命令行参数和外部JSON文件

  1、pug文件内部

  2、命令行参数

  使用--obj参数,就可以跟随一个对象形式的参数

  3、外部JSON文件

  使用-O,跟随一个JSON文件的路径即可

  这三种方式,pug文件内部的变量优先级最多,而外部JSON文件和命令行传参优先级相同

  如下所示,外部JSON文件和命令行传参两种方式都存在,由于--obj写在-w后面,最终以命令行传参为准

 

条件

  Pug 的条件判断的一般形式的括号是可选的,所以可以省略掉开头的 -,效果完全相同。类似一个常规的 JavaScript 语法形式

【if else】

- var user = { description: 'foo bar baz' }
- var authorised = false
#userif user.descriptionh2.green 描述p.description= user.descriptionelse if authorisedh2.blue 描述p.description.用户没有添加描述。不写点什么吗……elseh2.red 描述p.description 用户没有描述

  Pug 同样也提供了它的反义版本 unless

unless user.isAnonymousp 您已经以 #{user.name} 的身份登录。

【switch】

  case 是 JavaScript 的 switch 指令的缩写,并且它接受如下的形式

- var friends = 10
case friendswhen 0p 您没有朋友when 1p 您有一个朋友defaultp 您有 #{friends} 个朋友

  在某些情况下,如果不想输出任何东西的话,可以明确地加上一个原生的 break 语句

- var friends = 0
case friendswhen 0- breakwhen 1p 您的朋友很少defaultp 您有 #{friends} 个朋友

  也可以使用块展开的语法

- var friends = 1
case friendswhen 0: p 您没有朋友when 1: p 您有一个朋友default: p 您有 #{friends} 个朋友

 

循环

  Pug 目前支持两种主要的迭代方式: eachwhile

【each】

  这是 Pug 的首选迭代方式

uleach val in [1, 2, 3, 4, 5]li= val

  可以在迭代时获得索引值

uleach val, index in ['', '', '']li= index + ': ' + val

  能够迭代对象中的键值

uleach val, index in {1:'',2:'',3:''}li= index + ': ' + val

  用于迭代的对象或数组仅仅是个 JavaScript 表达式,因此它可以是变量、函数调用的结果,又或者其他

- var values = [];
uleach val in values.length ? values : ['没有内容']li= val

  还能添加一个 else 块,这个语句块将会在数组与对象没有可供迭代的值时被执行

- var values = [];
uleach val in valuesli= valelseli 没有内容

  [注意]也可以使用 for 作为 each 的别称

【while】

  也可以使用 while 来创建一个循环

- var n = 0;
ulwhile n < 4li= n++

 

混入

  混入是一种允许在 Pug 中重复使用一整个代码块的方法

//- 定义
mixin listulli fooli barli baz
//- 使用
+list
+list

  混入可以被编译成函数形式,并传递一些参数

mixin pet(name)li.pet= name
ul+pet('')+pet('')+pet('')

  混入也可以把一整个代码块像内容一样传递进来

mixin article(title).article.article-wrapperh1= titleif blockblockelsep 没有提供任何内容。+article('Hello world')+article('Hello world')p 这是我p 随便写的文章

  混入也可以隐式地,从“标签属性”得到一个参数 attributes

  也可以直接用 &attributes 方法来传递 attributes 参数

mixin link(href, name)a(class!=attributes.class href=href)= name+link('/foo', 'foo')(class="btn")

  [注意]+link(class="btn") 等价于 +link()(class="btn"),因为 Pug 会判断括号内的内容是属性还是参数。但最好使用后面的写法,明确地传递空的参数,确保第一对括号内始终都是参数列表

  可以用剩余参数(rest arguments)语法来表示参数列表最后传入若干个长度不定的参数

mixin list(id, ...items)ul(id=id)each item in itemsli= item+list('my-list', 1, 2, 3, 4)

 

文件包含

  包含(include)功能允许把另外的文件内容插入进来

//- index.pug
doctype html
htmlinclude includes/head.pugbodyh1 我的网站p 欢迎来到我这简陋得不能再简陋的网站。include includes/foot.pug
//- includes/head.pug
headtitle 我的网站script(src='/javascripts/jquery.js')script(src='/javascripts/app.js')
//- includes/foot.pug
footer#footerp Copyright (c) foobar

  被包含的如果不是 Pug 文件,那么就只会当作文本内容来引入

//- index.pug
doctype html
htmlheadstyleinclude style.cssbodyh1 我的网站p 欢迎来到我这简陋得不能再简陋的网站。scriptinclude script.js
/* style.css */
h1 {color: red;
}
// script.js
console.log('真了不起!');

 

文件继承

【覆盖】

  Pug 支持使用 blockextends 关键字进行模板的继承。一个称之为“块”(block)的代码块,可以被子模板覆盖、替换。这个过程是递归的。

  Pug 的块可以提供一份默认内容,当然这是可选的

//- layout.pug
htmlhead
   meta(charset="UTF-8")title 我的站点
- #{title}block scriptsscript(src='/jquery.js')bodyblock contentblock foot#footerp 一些页脚的内容

  现在来扩展这个布局:只需要简单地创建一个新文件,并如下所示用一句 extends 来指出这个被继承的模板的路径。现在可以定义若干个新的块来覆盖父模板里对应的“父块”。值得注意的是,因为这里的 foot没有 被重定义,所以会依然输出“一些页脚的内容”

//- pet.pug
p= petName
//- page-a.pug
extends layout.pugblock scriptsscript(src='/jquery.js')script(src='/pets.js')block contenth1= title- var pets = ['猫', '狗']each petName in petsinclude pet.pug

  同样,也可以覆盖一个块并在其中提供一些新的块。如下所示,content 块现在暴露出两个新的块 sidebarprimary 用来被扩展。当然,它的子模板也可以把整个 content 给覆盖掉

//- sub-layout.pug
extends layout.pugblock content.sidebarblock sidebarp 什么都没有.primaryblock primaryp 什么都没有
//- page-b.pug
extends sub-layout.pugblock content.sidebarblock sidebarp 什么都没有.primaryblock primaryp 什么都没有

【扩展】

  Pug 允许去替换(默认的行为)、prepend(向头部添加内容),或者 append(向尾部添加内容)一个块。 假设有一份默认的脚本要放在 head 块中,而且希望将它应用到 每一个页面,可以进行如下操作

//- layout.pug
htmlheadblock headscript(src='/vendor/jquery.js')script(src='/vendor/caustic.js')bodyblock content

  现在假设有一个页面,那是一个 JavaScript 编写的游戏。希望把一些游戏相关的脚本也像默认的那些脚本一样放进去,那么只要简单地 append 这个块:

//- page.pug
extends layout.pugblock prepend headscript(src='/vendor/three.js')block append headscript(src='/game.js')

  当使用 block append 或者 block prepend 时,block 关键字是可省略的:

//- page.pug
extends layout.pugprepend headscript(src='/vendor/three.js')append headscript(src='/game.js')

 

简易模板

//- index.pug
doctype html
htmlheadmeta(charset="UTF-8")title= documentTitleeach val in srcStyleslink(href= baseStyle +'/' + val)bodyheader.hdnav.hd-navbar.m-navbar.m-navbar_primary.hd-navbar-tel 联系方式: #{tel}ul.hd-navbar-naveach val in mainNavItemli.Hnn-item.m-btn.m-btn_infoa(href="#")= valsection.mainh1.main-title 我的文档p.main-content.这是一个很长很长而且还很无聊的段落,还没有结束,是的,非常非常地长。突然出现了一个 #[strong 充满力量感的单词],这确实让人难以 #[em 忽视]。footer.ftp Copyright (c) 小火柴的蓝色理想each val in srcScriptsscript(src=baseScript + '/' + val)
//- data.json
{"documentTitle":"测试文档","tel":"400-888-8888","mainNavItem":['登录','注册','关于','帮助'],"baseStyle":'style',"srcStyles":['bootstrap.css','main.css'],"baseScript":'/js',"srcScripts":['jquery.js','app.js']
}

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/455666.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

python安装环境傻瓜式安装_前后端分离——前端开发环境傻瓜式一步到位 nodejs ruby python nginx 安装搭建配置...

前端开发环境一步到位 一、准备工作 nodejs安装 安装&#xff1a;next->next.... Ruby安装 安装&#xff1a;next->next.... 需要配置到path&#xff1a;将安装目录复制到环境变量中&#xff0c;跟jdk环境变量配置一样。 注意下一步&#xff1a;Python安装 安装&#xff…

【Python】Python学到什么程度可以面试工作?------持续更新 ...

前言&#xff1a; 从事python学习&#xff0c;有爬虫、web后台、深度学习相关经验&#xff0c; 坐标北京欢迎骚扰。 本答案力求简洁和直击重点&#xff0c;代码部分使用Python3&#xff0c;更详细的解释请Google&#xff0c;回答有误请务必提醒答主&#xff0c;我将及时改正。…

H.264的码率控制算法

H&#xff0e;264的码率控制算法采用了多种技术&#xff0c;其中包括自适应基本单元层(Adaptive Basic Unit Layer)、流量往返模型(Fluid Traffic Model)、线性MAD模型、二次率失真模型等。并且采用了分层码率控制策略&#xff0c;共分为三层&#xff1a;GOP层、帧层和基本单元…

消息中间件Client模块划分

上图是之间讨论确定的系统架构&#xff08;后续内容会按照这个架构来叙述&#xff09;&#xff0c;其中&#xff1a; 客户端包含Producer和Consumer两大块 客户端需要和NameServer交互来获取元数据 客户端需要和Broker交互来读写消息 Client模块划分 1. 网络模块 第一个仍然是…

详解HashMap数据结构实现

HashMap的设计是由数组加链表的符合数据结构&#xff0c;在这里用自己的语言以及结合源码去总结一下&#xff0c;如果有不对的地方希望评论指正&#xff0c;先拱手谢谢。 HashMap是日常中非常常用的一种数据结构&#xff0c;我们要想深入了解学习任何一门技术&#xff0c;都是要…

java web开发学习手册_Java 人必备学习手册开发下载!

今天给大家分享一套 5000 页的 Java 学习手册&#xff0c;新鲜出炉&#xff01;此手册内容专注 Java技术&#xff0c;包括 JavaWeb&#xff0c;SSM&#xff0c;Linux&#xff0c;Spring Boot&#xff0c;MyBatis&#xff0c;MySQL&#xff0c;Nginx&#xff0c;Git&#xff0c;…

Django初次体验

Django初次体验 关于django的安装&#xff0c;宝宝们可以参考django简介以及安装 Django框架的搭建 在终端中进入需要建立项目的目录 执行&#xff1a; django-admin startproject mysite其中&#xff0c;mysite是项目目录名&#xff0c;可以自定义 我们来看看startprojec…

【LeetCode-面试算法经典-Java实现】【002-Add Two Numbers (单链表表示的两个数相加)】...

【002-Add Two Numbers (单链表表示的两个数相加)】 原题 You are given two linked lists representing two non-negative numbers. The digits are stored in reverse order and each of their nodes contain a single digit. Add the two numbers and return it as a linked…

不出现php version网页_php冷知识 - 从命令行参数列表中获取选项

分享一个php的冷知识 - &#xff0c;从命令行参数列表中获取选项用到的函数是getopt 说明函数签名是这样的getopt ( string $options [, array $longopts [, int &$optind ]] ) : array|bool false解析传入脚本的选项&#xff0c;成功返回数组&#xff0c;解析失败返回fals…

[计算机视觉][神经网络与深度学习]Faster R-CNN配置及其训练教程2

faster-rcnn分为matlab版本和python版本,首先记录弄python版本的环境搭建过程.matlab版本见另一篇&#xff1a;faster-rcnn(testing): ubuntu14.04caffecuda7.5cudnn5.1.3opencv3.0matlabR2014a环境搭建记录 首先,进入官方github网站:https://github.com/rbgirshick/py-faster-…

modbus从站模拟软件_作为工控电气人,你知道我们必备的软件有哪些吗?

作为工控电气人&#xff0c;你知道我们必备的软件有哪些吗&#xff1f;今天我就来给大家介绍一下&#xff0c;工控电气人常用的几款软件&#xff0c;有了它们&#xff0c;我们的工作学习将会更易上手&#xff0c;效率翻倍。以下介绍主要是分为电工常用软件&#xff0c;PLC编程软…

【数据分析】豆瓣电影Top250爬取的数据的可视化分析

豆瓣Top250网址 将之前爬取到的豆瓣电影进行简单的可视化&#xff1a; 数据列表保存为CSV格式&#xff0c;如图 导入数据 做好准备 #!-*- coding:utf-8 -*- import pandas as pd import numpy as np import matplotlib.pylab as plt import re from numpy import rank from bu…

sqlmap的二次开发

1、sqlmapapi的帮助信息。 -s 启动sqlmap作为服务器 -h 指定sqlmap作为服务器的IP地址&#xff0c;默认127.0.0.1 -p 指定sqlmap服务器的端口&#xff0c;默认端口为8775 2、启动服务 浏览器访问&#xff1a; 3、api介绍&#xff1a;sqlmap项目下的api.py文件含有所有的api adm…

docker nginx配置_docker随手笔记第十二节 jenkins+docker+nginx+纯静态页面配置

docker随手笔记第一节 docker概念及安装docker随手笔记第二节 docker常用命令解析docker随手笔记第三节 docker构建java镜像docker随手笔记第四节 docker安装mysql5.7docker随手笔记第五节 docker安装redis4.0docker随手笔记第六节 docker安装jenkinsdocker随手笔记第七节 jenk…

【机器学习】逻辑斯蒂回归原理

逻辑斯蒂函数 引入&#xff1a; 在线性感知器算法中&#xff0c;我们使用了一个f(x)x函数&#xff0c;作为激励函数&#xff0c;而在逻辑斯蒂回归中&#xff0c;我们将会采用sigmoid函数作为激励函数&#xff0c;所以它被称为sigmoid回归也叫对数几率回归&#xff08;logistic …

手机影音第十一天,显示视频缓冲,显示卡顿时的网速,播放系统视频时调用播放器的选择...

代码已经托管到码云&#xff0c;有兴趣的小伙伴可以下载看看https://git.oschina.net/joy_yuan/MobilePlayer一、设置视频缓冲进度显示视频播放进度的效果图如下&#xff1a;灰色的是缓冲的进度。原理&#xff1a;只有播放网络视频时&#xff0c;才有缓冲这个说法&#xff0c;所…

Django之创建应用以及配置路由

Django之创建应用以及配置路由 配置所有IP都可以访问你的项目 1.进入manage.py同级的my_web里面的settings.py的文件 2.在文件的第28行把ALLOWED_HOSTS []改成ALLOWED_HOSTS [*] 注意&#xff1a;*代表的是所有IP都可以访问 创建一个app应用 在终端中&#xff0c;结束项目…

python中opencv是什么_python-opencv的用法

#!/usr/bin/env python # -*- coding:utf-8 -*- # author:love_cat import cv2 # 接收两个参数&#xff0c;一个是文件名&#xff0c;一个值&#xff0c;如果值为1&#xff0c;接收的是彩色图片&#xff0c;如果值为零&#xff0c;接受的是灰度图片。会有一个返回值&#xff0c…

【Tensorflow】卷积神经网络实现艺术风格化通过Vgg16实现

卷积神经网络实现艺术风格化 基于卷积神经网络实现图片风格的迁移&#xff0c;可以用于大学生毕业设计基于python&#xff0c;深度学习&#xff0c;tensorflow卷积神经网络&#xff0c; 通过Vgg16实现&#xff0c;一幅图片内容特征的基础上添加另一幅图片的风格特征从而生成一幅…

抗误码技术

抗误码技术&#xff1a; 视频传输过程中的错误是不可避免的&#xff0c;抗误码技术历来都足视频领域一个研究的热点。H264标准继承r以前视频编码标准中某些优秀的错误恢复工具&#xff0c;同时也改进和创新了多种错误恢复丁具。这些错误恢复的工具主要有&#xff1a;参数集、数…