day3:模板引擎jinja2

  • 在pycharm中新建项目
  • 配置并运行项目的三个方法
  • 模板引擎
    • 基础
      • JsonResponse
      • 页面中的url_for(重点,常用)
    • 控制语句
    • 模版过滤器

在pycharm中新建项目

  1. 新建flask项目
  2. 选择文件目录和虚拟环境目录,创建项目
  3. 配置run/debug,输入如下选项

配置并运行项目的三个方法

  1. 如上述在pycharm中进行host,port,debug等设置,然后点击右上角三角形运行
  2. 在app.py中作如下配置,在终端中运行python app.py
app.run(debug=True,host="127.0.0.1",port=8081,threaded=True)
  1. 新建config.py文件,将配置内容写入:
DEBUG = True
HOST = "0.0.0.0"
PORT = 5001

在app.py中导入config和配置内容,在终端运行python app.py.当项目配置多的时候,一般使用此方法,但没测试成功

import config
app.config.from_object(config) #让配置文件生效

模板引擎

基础

在template文件夹中新建variable.html
在app中使用render_template方法渲染variable.html,可以增加值如username=“ryan”:

@app.route("/variable")
def variable():return render_template("variable.html",username="ryan")

variable.html 可接收app的变量username,格式是{{username}}

<h1>你的名字是{{ username }}</h1>

一般将值写在字典里:

def variable():context = {'username': 'ryan','age': 38,'height': 183,'children': {'name': 'xiaoyu','age': 10,'hobby': ['drawing', 'playingGame']}}return render_template("variable.html",**context)

对于字典context嵌套的数据children用{{children.name}}或{{children[‘name’]}},嵌套列表hobby则用{{children.hobby[0]}}表示:

   <h1>你的名字是{{ username }}</h1><h1>你的年龄是{{ age }}</h1><h1>你的孩子名字是{{ children.name }}</h1><h1>你的孩子年龄是{{ children['age']}}</h1><h1>你的孩子名字是{{ children.hobby[0] }}</h1>

当return的数据是字典时,浏览器会自动将之解释成json.json是类似字典的数据结构,区别是key和value都要用双引号包起来.
如(app.py):return {“name”:"zhangsan,“age”:18}
(variable.html)显示是json形式

return {“name”:“zhangsan”} 相当于return Response({“name”:“zhangsan”}),Response要事先导入.增加Response后,就可以以更灵活地响应用户请求了,如:

def response():return Response("this is from Response",status=333,mimetype="text/json")

在浏览器按F12-network-response可以看到返回状态栏和header的变化:


JsonResponse

=JsonResponse是转换符合要求的数据格式(如字典)为Json格式返回的类,flask默认此规则,可不用额外设置,在视频1:27:30左右=

页面中的url_for(重点,常用)

1.模板中的 url_for 跟 视图函数中的 url_for 使用起来一模一样,参数是视图函数的名字 登录
2.也可以传递参数 登录 #多个变量用,号隔开
————————————————————————————————————————
例1:通过页面index.html的链接(a href={{url_for(“login”)}})跳转到login.html:

index.html:

<h1>这是首页,请<a href="{{ url_for("login") }}">登录</a></h1>

app.py:

@app.route("/index")
def index():return render_template("index.html")@app.route("/login")
def login():return render_template("login.html")

例2:index.html中的url_for传值,app.py接收

index.html:

<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><title>Title</title>
</head>
<body><h1>这是首页,请<a href="{{ url_for("login_para",id="666")}}">登录</a></h1> <!--url_for("函数名",值)会将值(id="666")传到login_para函数-->
</body>
</html>

app.py:

@app.route("/login_para/<id>")
def login_para(id):context = {"id":id}return render_template("login.html",**context)# 如果只要接收request的url_for的id值,不需要返回则如下即可
from flask import Flask, render_template, Response, request, redirect, url_for
app = Flask(__name__)
@app.route("/login_para/<id>")
def login_para(id):return render_template("login.html")

控制语句

所有的控制语句都是放在{% ... %}中,并且有一个语句{% endxxx %}来进行结束,Jinja中常用的控制语句有if/for..in..,现对他们进行讲解:

  1. if:if语句和python中的类似,可以使用>,<,<=,>=,==,!=来进行判断,也可以通过and,or,not,()来进行逻辑合并操作,以下看例子(if.html通过response的值进行判断,三种情况:kenny.sick,kenny.death,other:

if.html

<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><title>Title</title>
</head>
<body>
{% if kenny.sick %}    <!--接收到app response的值context,如果kenny.sick为真,则显示Kenny is sick-->
<h1>Kenny is sick</h1>
{% elif kenny.dead %}
<h1>Kenny is dead</h1>
{% else %}
<h1>Kenny is out</h1>
{% endif %}
</body>
</html>

app.py:

from flask import Flask, render_template, Response, request, redirect, url_for
app = Flask(__name__)
@app.route("/ifs")
def ifs():context = {                        #context是response的值"kenny":{"sick":True,            #kenny.sick为True"dead": False}}return render_template("if.html", **context)if __name__ == '__main__':app.run(debug=True,host="127.0.0.1",port=8081,threaded=True)

访问:http://127.0.0.1:8081/ifs,会显示if.html,根据context值判断kenny.sick是否存在,如存在则在页面显示 Kenny is sick.

  1. for…endfor

for.html

from flask import Flask, render_template, Response, request, redirect, url_for
app = Flask(__name__)
@app.route("/for")
def fors():context = {"users":["name1","name2","name3"]}return render_template("for.html",**context)if __name__ == '__main__':app.run(debug=True,host="127.0.0.1",port=8081,threaded=True)

访问http://127.0.0.1:8081/for会加载for.html,遍历users,显示name1,name2,name3

例子-用表格显示四大名著

books.html

<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><title>Title</title>
</head>
<body><table border="1"><caption> 四大名著</caption><thead ><tr><td>书名</td><td>作者</td><td>价格</td></tr></thead><tbody>{% for book in books %}<tr><td>{{ book.name }}</td>  #这里易用成{%book.name%},应该是变量,而非if,else,for等控制语句 <td>{{ book.author }}</td><td>{{  book.price }}</td></tr>{% endfor %}</tbody>
</table>
</body>
</html>
from flask import Flask, render_template, Response, request, redirect, url_for
app = Flask(__name__)@app.route("/books")
def book():context = {"books": [{"name": "西游记","author": "吴承恩","price": 35},{"name": "三国演义","author": "罗贯中","price": 33},{"name": "水浒传","author": "施耐庵","price": 39},{"name": "红楼梦","author": "曹雪芹","price": 41}]}return render_template("books.html", **context)if __name__ == '__main__':app.run(debug=True, host="127.0.0.1", port=8081, threaded=True)

访问http://127.0.0.1:8081/books,会渲染网页books.html,页面将context的值遍历显示.

并且Jinja中的for循环还包含以下变量,可以用来获取当前的遍历状态:

| 变量 | 描述 | — | — | | loop.index | 当前迭代的索引(从1开始) | | loop.index0 | 当前迭代的索引(从0开始) | | loop.first | 是否是第一次迭代,返回True或False | | loop.last | 是否是最后一次迭代,返回True或False | | loop.length | 序列的长度 |
如:

{% for book in books %}{% if loop.first %}   #如果是遍历的第一个元素<tr bgcolor="aqua">{% elif loop.last %}  #如果是遍历最后一个元素<tr bgcolor="#2f4f4f">{% else  %}<tr bgcolor="red">  # 如果是其他元素{% endif %}<td>{{ loop.index }}</td>  <!--loop.index从1开始的序号 -->{#<td>{{ loop.index0 }}</td>  <!--loop.index0 序号从0开始-->#}{#<td>{{  loop.revindex }}</td>   <!--loop.index 序号倒序从大到小,以1结束 -->#}{#<td>{{  loop.revindex0 }}</td>   <!--loop.index0 序号倒序从大到小,以0结束-->#}{#<td>{{ loop.length }}</td>  <!--loop.length是元素个数-->#}<td>{{  book.name }}</td><td>{{ book.author }}</td><td>{{  book.price }}</td></tr>{% endfor %}
</table>

九九乘法表:

<table border="1">{% for i in range(1,10) %}<tr>{% for j in range(1,i+1) %}<td>{{ j }}*{{ i }} = {{ j*i }}</td>{% endfor %}{% endfor %}
</table>

另外,不可以使用continuebreak表达式来控制循环的执行。

模版过滤器

过滤器是通过管道符号(|)进行使用的,例如:{{ name|length }},将返回name的长度。过滤器相当于是一个函数,把当前的变量传入到过滤器中,然后过滤器根据自己的功能,再返回相应的值,之后再将结果渲染到页面中。Jinja2中内置了许多过滤器,在这里可以看到所有的过滤器,现对一些常用的过滤器进行讲解:

app.py:

context = {"postion" : -1
}

books.html:

{{ position|abs }}  # 过滤器,将response的position值转化成绝对值
{{ sex|default("male") }}  #app.py中没sex这一key,就会用缺省值male代替

flask-day3:模板引擎jinja2|JsonResponse|页面url_for|相关推荐

  1. Flask模板引擎——Jinja2

    模板是一个包含响应文本的文件,其中包含用占位变量表示的动态部分,其具体指只在请求的上下文中才能知道.使用真是只替换变量,再返回最终得到的响应字符串,这一过程称为渲染.为了渲染模板,Flask使用了一个 ...

  2. Python Flask Web 第四课 —— 模板引擎Jinja2

    1. 基本介绍 形式最为简单的 Jinja2 模板是一个包含响应文本的文件. templates/index.html <h1>Hello World!</h1> 既然是模板, ...

  3. Flask HTML模板引擎详解

    模板引擎说明: 模板文件就是按照一定的规则书写的展示效果的HTML文件模板引擎就是负责按照指定规则进行替换的工具模板引擎选择jinja2. 一.渲染模板的方法 1.将渲染的模板进行返回 1 rende ...

  4. 【python】Flask之模板引擎

    一.模板介绍 1.1 视图函数 视图函数的主要作用是生成请求的响应,实际上视图函数有两个作用: 处理业务逻辑 返回响应内容 在大型应用中,把业务逻辑和表现内容放在一起,会增加代码的复杂度和维护成本 1 ...

  5. mac下安装前端模板引擎Jinja2

    在mac本上安装Jinja2,搜索网上介绍的经验,都是说使用easy_install或者pip安装,比如 #sudo easy_install Jinja2  #sudo pip install Ji ...

  6. handlebar.js模板引擎(轻页面小工程可用)

    介绍 Handlebars 让你能够有能力高效地容易地创立语义化的模版.Handlebars兼容Mustache语法,在大多数情况下它可以读取Mustache的语法并在你当前模板中使用.具体点击这里 ...

  7. Flask 中的Jinja2模板引擎

    Flask 中的Jinja2模板引擎 在 Web 项目中,前端的显示效果是通过 HTML 语言来实现的,后端的视图函数将数据或模板文件返回给前端. 前端接收到后端返回的结果后,需要通过模板引擎来渲染页 ...

  8. 从零开始学 Python 之 Web 开发 Jinja2 模板引擎

    被之前的文章中,简单介绍了 Python Web 开发框架 Flask,知道了如何写个 Hello World,但是距离用 Flask 开发真正的项目,还有段距离,现在我们目标更靠近一些 -- 学习下 ...

  9. flask html 模板继承,Flask框架模板继承实现方法分析

    Flask框架模板继承实现方法分析 本文实例讲述了Flask框架模板继承实现方法.分享给大家供大家参考,具体如下: 在模板中,可能会遇到以下情况: 多个模板具有完全相同的顶部和底部内容 多个模板中具有 ...

最新文章

  1. Qt嵌入外部EXE程序,并显示在主界面中!
  2. 【 Verilog HDL 】清晰的时序逻辑描述方法之计数器的描述范例
  3. Bat 多个执行操作选择
  4. 2020年python工资一般多少钱-2020年Python的就业薪资有多少?前景如何?
  5. wxWidgets:拖动一个 wxWindow
  6. s3c2440启动文件详细分析
  7. opencv 读写XML YML
  8. Redis中的过期策略
  9. 快速傅里叶变换(FFT)——按时间抽取DIT的基
  10. Makefile中 变量赋值含义
  11. html5鼠标下拉浮窗固定,【前端技术】vue-floating-menu可拖拽吸附的浮窗菜单
  12. ApacheCN Pandas 教程集
  13. 深化代理模式,Mybaits如何做到调用接口
  14. 补全缺失的64位dll,0xc000007b
  15. 骚操作——Word批量修改图片大小
  16. 看台湾制造业目前发展概况如何?
  17. win10停止更新_你的win10即将终止!各大版本服务终止日期大全,准备好了吗?...
  18. [Error] ADC.SchDoc Compiler Net NetU1_AD1_14 contains floating input pins (Pin U1_AD1-14) 19:27:
  19. vue实现一键换肤效果(白天晚上模式切换)
  20. java中什么是接口代码详解

热门文章

  1. 企业做大的秘笈:知识升级,人才贬值
  2. linux系统shell讲解实验报告,《操作系统》课程实验报告 SHELL编程.doc
  3. 跟领导关系再好,敬酒时也要说这3句话术,不讨好上司也受重用
  4. slax9Linux中文,湖湘杯-WriteUp | CN-SEC 中文网
  5. 电商4.0项目【三】: 用户模块(8081)
  6. CSS3快速入门:五、浮动
  7. Spark开发注意: collect_list、collect_set会去除Null值
  8. 苹果手机壳_换种方式秀恩爱,苹果情侣手机壳让你甜到掉牙
  9. 一个女生骂男生不带脏字。。强得很
  10. Windows 10 电脑在播放声音后突然增大的解决办法