正对着门的,居然是一面巨大的落地窗,窗外巨大夕阳正在坠落。黯淡的阳光在地面上投下窗格的阴影,跟黑色的牢笼似的。金属窗框锈蚀得很厉害,好几块玻璃碎了,晚风灌进来,游走在屋子的每个角落。

作为Python的轻量级框架,日后难免会需要使用,这里先开一个坑,以后慢慢在Flask里面遨游~

初次使用

第一次使用的时候不需要安装一些乱七八糟的拓展,只需要安装flask库即可,后面的拓展文件等需要的时候再逐一安装即可。

pip install flask

快速使用

# coding:utf-8
from flask import Flask,request
# Flask是初始化库,request是接受数据并处理库

app = Flask(__name__)
# 初始化一个对象,命名为app

@app.route('/')
# Python中的装饰器,关于装饰器概念参考之前的文章
# 设定一个路由,地址为/,这么解释:解释两个重要的概念——路由和视图函数。客户端把请求发给 Web 服务器, Web 服务器再把请求发给 Flask 程序实例, Flask 程序实例需要知道每个 URL 请求要运行哪些代码,所以保存了一个 URL 到 Python 函数的映射关系。处理 URL 和函数之间关系的程序称为路由,这个函数称为视图函数
# 熟悉MVC框架的同学可能好奇,c部分是哪儿,其实control控制部分就是下面的index()函数,不过在这里叫视图函数。
def index():
    return 'hello word'
# 访问http://127.0.0.1:5000,页面回显hello word

@app.route('/userinfo')
# 这个URL是http://127.0.0.1:5000/userinfo
def userinfo_():
    return request.headers.get('Host')
    # 返回服务器的地址,改成User-Agent则获取浏览器头部信息

@app.route('/post/<id>')
# 此URL对应http://127.0.0.1:5000/post/
def post_(id):
    return id
    # 如果访问http://127.0.0.1:5000/post/浪子好帅,则页面返回浪子好帅(这不是废话吗)

@app.route('/login',methods=['GET','POST'])
# 此URL对应http://127.0.0.1:5000/login,其中methods是访问方式
def login_():
    if request.method=='POST':
    # 判断访问方式,注意这里大小写敏感,必须要使用大写POST
        return 'Post Success'
    else:
        return 'Get success'


if __name__ == '__main__':
    app.run(debug=True,host='0.0.0.0')
    # 运行项目,debug=True为开启调试模式,host='0.0.0.0'表示任意一台电脑都可以访问我的flask项目

如上注释,列举了一些常用的方法,比如设定路由,判断请求方式,获取传递参数,获取返回内容响应信息等等。

获取参数

在获取参数的时候,先判断传入方式是get or post,然后在使用Python中字典获取键值的方法获取表单数据。

说教无益,撸上一串代码:

from flask import request
# 导入接受并处理响应内容的request库
@app.route('/login', methods=['POST', 'GET'])
# 设定URL地址为http://127.0.0.1:5000/login,请求方式有两种
def login():
    if request.method == 'POST':
    # 若请求方式是POST方式
        if valid_login(request.form['username'],request.form['password']):
        # 如果传入的表单中有username与password的值
            return log_the_user_in(request.form['username'])
            # 那么就打印输出username的值
        else:
            return 'Invalid username/password'
            # 没有的话就返回没有输入账号密码

POST获取参数

request.form['username']

GET获取参数

request.args.get('username')

文件上传

利用Flask也可以方便的获取表单中上传的文件,只需要利用 request 的files属性即可,这也是一个字典,包含了被上传的文件。如果想获取上传的文件名,可以使用filename属性,不过需要注意这个属性可以被客户端更改,所以并不可靠。更好的办法是利用werkzeug提供的secure_filename方法来获取安全的文件名。确保在 HTML 表单中设置 enctype=”multipart/form-data” 属性

from flask import request
from werkzeug.utils import secure_filename

@app.route('/upload', methods=['GET', 'POST'])
def upload_file():
    if request.method == 'POST':
        f = request.files['the_file']
        f.save('/var/www/uploads/' + secure_filename(f.filename))

获取Cookie

from flask import request

@app.route('/')
def index():
    username = request.cookies.get('username')
    # 使用 cookies.get(key) 代替 cookies[key] 避免
    # 得到 KeyError 如果cookie不存在

如果需要发送cookie给客户端,参考下面的例子。

from flask import make_response

@app.route('/')
def index():
    resp = make_response(render_template(...))
    resp.set_cookie('username', 'the username')
    return resp

重定向和错误

redirect和abort函数用于重定向和返回错误页面。

from flask import abort, redirect, url_for

@app.route('/')
def index():
    return redirect(url_for('login'))

@app.route('/login')
def login():
    abort(401)
    this_is_never_executed()

默认的错误页面是一个空页面,如果需要自定义错误页面,可以使用errorhandler装饰器。

from flask import render_template

@app.errorhandler(404)
def page_not_found(error):
    return render_template('page_not_found.html'), 404

响应处理

默认情况下,Flask会根据函数的返回值自动决定如何处理响应:如果返回值是响应对象,则直接传递给客户端;如果返回值是字符串,那么就会将字符串转换为合适的响应对象。我们也可以自己决定如何设置响应对象,方法也很简单,使用make_response函数即可。

@app.errorhandler(404)
def not_found(error):
    resp = make_response(render_template('error.html'), 404)
    resp.headers['X-Something'] = 'A value'
    return resp

控制访问频率

依赖flask_limiter

pip install flask_limiter

使用方法如下:

from flask import Flask
from flask_limiter import Limiter
from flask_limiter.util import get_remote_address

app = Flask(__name__)
limiter = Limiter(
    app,
    key_func=get_remote_address,   #根据访问者的IP记录访问次数
    default_limits=["200 per day", "50 per hour"]  #默认限制,一天最多访问200次,一小时最多访问50次
)
@app.route("/slow")
@limiter.limit("1 per day")  #自定义访问速率
def slow():
    return "24"

@app.route("/fast")        #默认访问速率
def fast():
    return "42"

@app.route("/ping")
@limiter.exempt      #无访问速率限制
def ping():
    return "PONG"

模板

返回页面的时候不可能自己手写html,使用jinja2的模版生成后再渲染一下一样能达到炫酷的效果,所以说还要去jinja2的语法…这里稍微概述一下jija2的使用方法

模板渲染

使用 render_template() 方法来渲染模板。你需要做的一切就是将模板名和你想作为关键字的参数传入模板的变量。这里有一个展示如何渲染模板的简例:

from flask import render_template

@app.route('/hello/')
@app.route('/hello/<name>')
def hello(name=None):
    return render_template('hello.html', name=name)

Flask 会在 templates 文件夹里寻找模板。所以,如果你的应用是个模块,这个文件夹应该与模块同级;如果它是一个包,那么这个文件夹作为包的子目录:

情况 1: 模块:

/application.py
/templates
    /hello.html

情况 2: 包:

/application
    /__init__.py
    /templates
        /hello.html

模板标签

`{% extends 'layout.html' %}`
`{% block title %}`主页`{% endblock %}`
	`{% block body %}`
	        `

主页

` `