在pycharm中新建项目
- 新建flask项目
- 选择文件目录和虚拟环境目录,创建项目
- 配置run/debug,输入如下选项
配置并运行项目的三个方法
- 如上述在pycharm中进行host,port,debug等设置,然后点击右上角三角形运行
- 在app.py中作如下配置,在终端中运行python app.py
app.run(debug=True,host="127.0.0.1",port=8081,threaded=True)
- 新建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..
,现对他们进行讲解:
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.
- 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>
另外,不可以使用continue
和break
表达式来控制循环的执行。
模版过滤器
过滤器是通过管道符号(|
)进行使用的,例如:{{ name|length }}
,将返回name的长度。过滤器相当于是一个函数,把当前的变量传入到过滤器中,然后过滤器根据自己的功能,再返回相应的值,之后再将结果渲染到页面中。Jinja2
中内置了许多过滤器,在这里可以看到所有的过滤器,现对一些常用的过滤器进行讲解:
app.py:
context = {
"postion" : -1
}
books.html:
{{ position|abs }} # 过滤器,将response的position值转化成绝对值
{{ sex|default("male") }} #app.py中没sex这一key,就会用缺省值male代替