flask-day3:模板引擎jinja2|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代替
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值