直接看代码吧,非常容易上手:
# 创建flask应用
app = Flask(__name__)
# 路由
@app.route("/index", methods=['GET'])
def index():
return "FLASK:欢迎访问主页!"
if __name__ == "__main__":
app.run()
jinja2 是 Flask 作者开发的一个模板系统,起初是仿 Django 模板的一个模板引擎,为 Flask 提供模板支持,由于其灵活,快速和安全等优点被广泛使用。当我们开发 Web 应用程序时,通常需要将数据动态地渲染到 HTML 模板中,而 Python jinja2 模版技术正是为此而生的。该引擎在一定程度上实现了前后端分离(前后端代码层面的分离)。
创建templates文件夹,用于存放模板文件(HTML模板),flask默认会在templates目录下寻找对应的html文件
模板中可以通过形如 {{obj.name}} 的形式访问后端的普通数据,例如变量、对象、列表等。
<p>
{{ name }}
{{ obj.name }}
{{ obj["name"] }}
p>
通过如下形式,实现遍历的效果:
{% for item in students %}
<tr>
<td>{{item.name}}td><td>{{item.age}}td><td>{{item.sex}}td>
tr>
{% endfor %}
支持类似于if、else的表达式
{% if count > 10 %}
<p>There are too many items.p>
{% else %}
<p>There are {{ count }} items.p>
{% endif %}
{% for i in [1,2,3] %}
{% if i == 1 %}
{{ i }}
{% continue %}
{% else %}
{% break %}
{% endif %}
{% endfor %}
在模板中,支持python的表达式语法,例如:
过滤器就是函数,把当前的变量传入过滤器,过滤器根据自己的功能对变量进行相应的处理,再返回对应的值,并将结果渲染到网页中,起到了数据处理的作用。例如:
django中的模板引擎,就具备模板的继承和包含功能。同样,jinjia2,也具备这样的功能,起到了模板复用、模块化开发的效果。
继承:
-----父亲-----
{% block title %} {# 声明一个名为 title 的block #}
<p>This is title</p>
{% block content %} {# title 内部嵌套了一个名为 content 的block #}
{% endblock %}
{% endblock %}
{% block foot %}
<span>This is foot</span>
{% endblock %}
它里面定义了很多的 block
, 每个 block 都有自己的名字(block的名字不能重复): {% block blok_name %}...{% endblock %}
,在 block 中,我们可以写入一些 html 代码,让子模板继承。
各个 block 之间是可以嵌套的
注意每个 block 要有一个 {% endblock %}
-----孩子-----
{% extends "mother.html" %} {# 继承母版 #}
{% block content %} {# 重写某个block #}
<span>This is content, and the mother.html doesn't have this.</span>
{% endblock %}
{% block foot %}
{{ super() }} {# 继承母版中的 foot block 的内容 #}
<span>New foot content</span>
{% endblock %}
{% extend %}
非常关键:它告诉模板要继承另一个模板。并且这个标签要放在模板的最上面。
当然,继承的标签可以写路径: {% extends "layout/default.html" %}
如果子模板没有重写母版中的某个block,则会默认使用母版中的block。
包含:
{% include 'header.html' %}
{% include "sidebar.html" ignore missing %} {# ignore missing:如果找不到模板,可以忽略 #}
{% include ['special_sidebar.html', 'sidebar.html'] ignore missing %} {# 可以导入列表 #}
{% include "sidebar.html" ignore missing without context %} {# without context 可以不携带上下文 #}
{% include "sidebar.html" ignore missing with context %} {# with context 可以携带上下文 #}
上下文:其实就是模板中定义的变量,我们渲染时会将上下文传递给模板:template.render(context) ,而我们嵌套其他模板时,也可以将它们中的上下文包含进来,这样在当前模板中也可以使用被嵌套模板中的上下文。(因为目前相关的实战经验较少,暂时不知道什么样的场景会用到模板上下文)
场景分析:
根据之前的经验,VUE、react均有相关代码复用、模块化开发相关的支持。
无论是django还是flask的模板引擎,他们都是在一定程度上实现了前后端分离,但是还不是完全的前后端分离。
其中前后端分离体现在:
分离不完全体现在:
目前,前后端分离,是一种WEB开发的主流趋势。那么,在python web开发中,何时使用vue、react等前端框架?何时使用自带的模板引擎?
我认为:
from flask import Flask, jsonify
from flask import render_template
from flask_cors import CORS
# 创建flask应用
app = Flask(__name__)
# 配置跨域请求。r'/*' 是通配符,让本服务器所有的 URL 都允许跨域请求
CORS(app, resources=r'/*')
# 路由
@app.route("/", methods=['GET'])
@app.route("/index", methods=['GET'])
def index():
return "FLASK:欢迎访问主页!"
# 返回json数据
@app.route("/getOneData", methods=['GET'])
def getOneData():
student = {
"age": 15,
"name": "zhangsan",
"sex": "man"
}
return jsonify(student)
# 返回网页
# 利用jinjia2渲染引擎,向模板中渲染数据
@app.route("/studentInfo", methods=['GET'])
def studentInfo():
student = {
"age": 15,
"name": "zhangsan",
"sex": "man"
}
students = [
{
"age": 101,
"name": "zhangsan",
"sex": "man"
},
{
"age": 123,
"name": "lisi",
"sex": "man"
},
{
"age": 336,
"name": "wangwu",
"sex": "man"
}
]
hello = "欢迎来到flask项目!"
return render_template('student.html', title='学生信息', hello=hello, student=student, students=students)
if __name__ == "__main__":
# 0.0.0.0代表所有主机均可以访问,开启之后可通过服务器的IP地址访问网站
# 默认端口为5000
# app.run(port=5001, debug=True)
app.run(host='0.0.0.0', port=5001, debug=True)
<html>
<style>
/* Table Head */
table{
border-spacing: 0;
}
#table-6 thead th {
background-color: rgb(128, 102, 160);
color: #fff;
border-bottom-width: 0;
}
/* Column Style */
#table-6 td {
color: #000;
}
/* Heading and Column Style */
#table-6 tr, #table-6 th {
border: 1px solid rgb(128, 102, 160);
}
/* Padding and font style */
#table-6 td, #table-6 th {
padding: 5px 10px;
font-size:30px;
font-family: Verdana;
font-weight: bold;
}
td{
border:1px solid rgb(128, 102, 160) ;
}
style>
<head>
<title>{{ title }}title>
head>
<body>
<h1>{{hello}}h1>
<h1>姓名:{{student.name}}h1>
<h1>年龄:{{student.age}}h1>
<h1>性别:{{student.sex}}h1>
<br>
<br>
<br>
<table id="table-6">
<thead>
<tr>
<th>姓名th><th>年龄th><th>性别th>
tr>
thead>
<tbody>
<tr>
<td>item.nametd><td>item.agetd><td>item.sextd>
tr>
<tr>
<td>item.nametd><td>item.agetd><td>item.sextd>
tr>
{% for item in students %}
<tr>
<td>{{item.name}}td><td>{{item.age}}
{{item.age}}td><td>{{item.sex}}td>
tr>
{% endfor %}
tbody>
table>
body>
html>
某个jinjia2的教程
http://docs.jinkan.org/docs/jinja2/index.html
博客园某博主
https://www.cnblogs.com/wztshine/p/16054582.html