python-flask入门学习笔记

2017-02-04 15:12

说明

基于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 会将其渲染成'&lt;h1&gt;Hello&lt;/
h1&gt;'
,浏览器能显示这个 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' %}