python-flask入门学习笔记
说明
基于python3.4 pycharm
安装
pip install flask
完整的实例
from flask import Flask
app = Flask(__name__)
@app.route('/')
def index():# 网站根目录
return '<h1>Hello World!</h1>'
@app.route('/user/<name>')
def user(name): # user/XX目录
return '<h1>Hello, %s!</h1>' % name
if __name__ == '__main__':
app.run(debug=True)
Flask上下文全局变量
变量名 | 上下文 | 说 明 |
---|---|---|
current_app | 程序上下文 | 当前激活程序的程序实例 |
g | 程序上下文 | 处理请求时用作临时存储的对象。每次请求都会重设这个变量 |
request | 请求上下文 | 请求对象,封装了客户端发出的 HTTP 请求中的内容 |
session | 请求上下文 | 用户会话,用于存储请求之间需要“记住”的值的词典 |
实例如下:
from flask import request
@app.route('/')
def index():
user_agent = request.headers.get('User-Agent')
return '<p>Your browser is %s</p>' % user_agent
请求钩子
有时在处理请求之前或之后执行代码会很有用。例如,在请求开始时,我们可能需要创
建数据库连接或者认证发起请求的用户。为了避免在每个视图函数中都使用重复的代码,
Flask 提供了注册通用函数的功能,注册的函数可在请求被分发到视图函数之前或之后
调用。
请求钩子使用修饰器实现。Flask 支持以下 4 种钩子:
- before_first_request • :注册一个函数,在处理第一个请求之前运行。
- before_request • :注册一个函数,在每次请求之前运行。
- after_request • :注册一个函数,如果没有未处理的异常抛出,在每次请求之后运行。
- teardown_request • :注册一个函数,即使有未处理的异常抛出,也在每次请求之后运行。
在请求钩子函数和视图函数之间共享数据一般使用上下文全局变量 g 。例如, before_
request 处理程序可以从数据库中加载已登录用户,并将其保存到 g.user 中。随后调用视
图函数时,视图函数再使用 g.user 获取用户
Jinja2模板引擎
准备如下两个文件:
templates/index.html
-内容:<h1>Hello World!</h1>
templates/user.html
- 内容:
<h1>Hello, {{name}}!</h1>
- 内容:
渲染模板
from flask import Flask, render_template
app = Flask(__name__)
@app.route('/')
def index():
return render_template("index.html")
@app.route('/user/<name>')
def user(name):
return render_template("user.html", name=name)
if __name__ == "__main__":
app.run(debug=True)
在模板中使用变量
Jinja2 能识别所有类型的变量,甚至是一些复杂的类型,例如列表、字典和对象。在模板
中使用变量的一些示例如下:
<p>A value from a dictionary: {{ mydict['key'] }}.</p>
<p>A value from a list: {{ mylist[3] }}.</p>
<p>A value from a list, with a variable index: {{ mylist[myintvar] }}.</p>
<p>A value from an object's method: {{ myobj.somemethod() }}.</p>
可以使用过滤器修改变量,过滤器名添加在变量名之后,中间使用竖线分隔。例如,下述
模板以首字母大写形式显示变量 name 的值:
Hello, {{ name|capitalize }}
表 列出了 Jinja2 提供的部分常用过滤器。
过滤器名 | 说 明 |
---|---|
safe | 渲染值时不转义 |
capitalize | 把值的首字母转换成大写,其他字母转换成小写 |
lower | 把值转换成小写形式 |
upper | 把值转换成大写形式 |
title | 把值中每个单词的首字母都转换成大写 |
trim | 把值的首尾空格去掉 |
striptags | 渲染之前把值中所有的 HTML 标签都删掉 |
safe 过滤器值得特别说明一下。默认情况下,出于安全考虑,Jinja2 会转义所有变量。例
如,如果一个变量的值为 <h1>Hello</h1>
,Jinja2 会将其渲染成'<h1>Hello</
,浏览器能显示这个 h1 元素,但不会进行解释。很多情况下需要显示变量中存储
h1>'
的 HTML 代码,这时就可使用 safe 过滤器。
在模板中使用控制结构
- 下面这个例子展示了如何在模板中使用条件控制语句:
{% if user %}
Hello, {{ user }}!
{% else %}
Hello, Stranger!
{% endif %}
- 另一种常见需求是在模板中渲染一组元素。下例展示了如何使用 for 循环实现这一需求:
<ul>
{% for comment in comments %}
<li>{{ comment }}</li>
{% endfor %}
</ul>
支持使用宏
- 导入重复的模板文件
{% include 'common.html' %}
- 更多关于宏以及jinja运用查看官网