总结下flask中的宏、Jinjia2语法

这几天学的东西比较多,时间又有点不够用,趁着快吃饭了,赶紧总结总结。

00x1 宏:

  如果学过C语言的童鞋,可能知道宏在C语言里面是一个定义一个固定参数的变量。在flask里面,宏是相当于一个函数的作用。不是像C语言的一个变量,而是定义了一个函数。这个函数是html的函数,霍霍,html还能有函数?是的呀,之前我也布吉鸟。知道之后先是嗯嗯嗯····,然后想了想,好像没啥用啊,我还不如直接写一个循环多方便。。。其实是我懒了,不想学这个东西了。并且这个宏,在我们项目中,我翻了一下,用在哪个地方呢?就是导入文件不是有一个url_for('static', filename = 'xxx'),我们只是把filename给省略了,其他地方就再也见不到宏了·····

   刚才已经说过了,宏是一个函数,那我们先写一个简单的宏。

  

{% macro input(name = '', value = '' , type = 'text',class = 'class')  %}

<input type="{{ type }}" name = "{{ name }}" ,value = "{{ value }}" ,class = "{{ class }}">
{% endmacro %}

  其中先开始一个宏,然后再结束一个宏。并且想要引用这个宏的时候,只能是在宏的代码块中,其他地方再进行用的时候,就只能是再写一个了。

  详细解析
      宏里面定义了一个是input(),不是<input>。这个input(),里面定义的name和value····。然后下面的<input>标签相当于引用了,不过意义不大,这是我感觉的····

  具体的效果可以运行一遍看看(其实没啥效果)。

  宏的地方,还要知道宏是如何导入的

    这里引用的是一位(身高可能都比我高····)小姐姐的博客

  (1)import "宏文件的路径"as xxx(需要导入的宏的名字)
  (2)from “宏文件的路径” import 宏的名字 [as 宏的别名]([ ]中的可以不要)
  示例:

  

{% from "macro.html" import input as input_filed %}
<p>{{input_filed("username")}}</p>
<p>{{input_filed("password",type="password")}}</p>


  注意:(1)宏的路径不要以相对路径去寻找,要以’templates’作为绝对路径去寻找。
     (2)如果想要在导入宏的时候,就把当前模板的一些参数传入给宏所在的模板,那么就应该在导入的时候使用’with context’。
示例:from xxx.html import input with context

  

00x2 jinjia2语法:

  jinjia2是flask框架中一个特有的语法。jinjia2语法跟jsp里面的语法类似(我只会那么一丢丢jsp,木的办法,java比python难多了)。可以先看下flask手册里面的jinjia2,flask手册里面的还是比较简单的,如果是看jinjia2手册的话,估计一看就懵逼了。jinjia2是在前端里面用到的,如果想要在html中写入python代码的吧,就需要用到jinjia2。

  flask 手册地址:http://docs.jinkan.org/docs/flask/templating.html#jinja

jinjia2基础语法中:
  {% xxx %} 这样只有一个{}并且里面有一个%的,一般都是语句,比如for ,if extends....。这样的语句一般都是有始有终,都是成双入对的,除了extends,set,include.....

  {{}},这样两个括号放一块的地方,一般都是变量。比如{{ username }} ,username是变量。

if 判断 :
  比如我要判断一个username是否为'abcd',那么我应该是写。

  { % if username == 'avcd' %}

  {% #先开始,再结束啦# %}

  {% endif % }

for 循环:

  { % for循环 %}

  {% endfor %}

set:

  set是定义一个变量的。如果前端没有传入一个lights这个变量,但是我还想要用。这时候就需要 {% set lights = 'xx' %} 。这样的话这个lights变量就能够在前端里面就能用了,这个地方可以观察下我在豆瓣那篇博客中的具体运用。

include:
  include翻译过来是包括、包含的意思。如果说我们需要包含一个页面的话,就可以用一个{% include '要包含的html'%}。include用的不多,并且在include中可能会发生样式冲突(这个在有css的时候更明显),其实是包括的内容里面有重复的,html的解释器不知道该解释哪一个了,所以就会有冲突。

extends:

  继承,这个在前端里面用到的相当多,可谓是一个重点的语法,但是用着是炒鸡简单的。比如我先写一个base.html,再新建一个Html,把html中里面的东西都给删了,直接一个{% extends 'base.html' %} ,这样就会把base.html里面的东西都拿过来了。需要注意的是,继承要写在第一行,不能随便乱写的。

 block:

   模块,block是和extends(继承)配合着用的,比如我要继承的里面,不想全部都是一个页面,这个时候我们可以用一个block,这个地方比较容易哦,{% block 命名 % } {% endblock %}。这样block代码块中的东西就不会是base.html中的了。

附加:

  因为jinjia2的基础语法,比较容易,所以我没有是贴上演示代码和演示效果。想百尺竿头更进一步的,可以看看我写的那个微信小demo

  

 

原文地址:https://www.cnblogs.com/Triangle-security/p/11362719.html