Flask是一个Python实现的Web开发框架, Flask的设计思想为核心尽可能的微小和专能,扩展功能则由独立模块灵活实现.
Flask应用基于jinja2模板引擎和werkzeug WSGI工具集, 若有需要可以阅读它们的文档.
可以使用pip安装flask;
pip install flask
Hello World
首先来让服务器打个招呼:
from flask import Flask
app = Flask('hello')
@app.route('/hello/')
def hello():
return 'Hello World!'
app.run(port=8080, debug=True)
运行这段脚本, 访问localhost:8080/hello/
则可以看到来自服务器的Hello World信息.
@app.route('/hello/')
修饰器用于绑定url和处理函数, 可以将多个url绑定到一个函数上:
@app.route('/hello/')
@app.route('/')
def hello():
return 'Hello World!'
Flask建议使用像/hello/
这样两边含有斜线的url, 这样当访问/hello
时会自动重定向到/hello/
.
而@app.route('/hello')
不会对/hello/
请求进行响应.
app.run(port=8080, debug=True)
用于启动app, port指定监听的端口.
app的参数还可以直接设置:
app.port = 8080
app.run()
debug模式下, 当脚本改变时服务器会自动重启.在需要fork的环境下debug模式无法使用, 即不能用于生产环境下.
编写响应函数
响应函数的返回值将生成response返回给客户端, 上文已经展示用str作为响应.
使用模板
Flask使用jinja2模板引擎, 可以使用模板作为响应:
from flask import render_template
@app.route('/template/')
def show_template():
return render_template('template.html', name='finley')
默认模板文件存放在工作目录的templates
子目录下.
使用符合jinja2规则的模板:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Template</title>
</head>
<body>
{{ name }}
</body>
</html>
视图函数的返回值会被自动转换为一个响应对象,Flask 把返回值转换为响应对象的规则为:
-
合法的响应对象会被直接返回.
-
若返回的是一个字符串,响应对象会用字符串数据和默认参数创建。
-
若返回的是一个元组,则必须是 (response, status, headers) 的形式,且至少包含一个元素. status 值会覆盖状态代码, headers 可以是一个列表或字典,作为额外的消息标头值.
-
若上述条件均不满足, Flask 会假设返回值是一个合法的 WSGI 应用程序,并转换为一个请求对象.
使用静态文件
静态文件存放在static
子目录下, 使用'/static'+文件名进行访问, 或者使用url_for
来获得静态文件url:
url_for('static', filename='jquery.js')
进行重定向
使用redirect可以将请求重定向到指定url:
from flask import redirect, url_for
@app.route('/index/')
def index():
return redirect(url_for('static', filename='index.html'))
redirect(url, code=302)
默认使用302(临时重定向)作为状态码, 也支持其它3开头的状态码: 303, 305, 307.
获得请求参数
获得url匹配
@app.route()
可以将url中匹配的字符串当做位置参数传入响应函数:
@app.route('/user/<username>/')
def user_info(username):
return 'hello, %s' % username
若访问/user/finley/
, 响应函数user_info
会得到值为'finley'的位置参数.
获得query参数
其它包含在HTTP请求中的参数我们需要导入request对象:
from flask import request
在全局request对象中获得query参数:
@app.route('/query/')
def query():
return request.args.get('query')
获得表单与头部参数
在request.form中获得表单提交的参数:
@app.route('/do-login/', methods=['POST'])
def do_login():
if request.method == 'POST':
username = request.form['username']
password = request.form['password']
return '%s , login success' % username
else:
return 'Please use POST method'
@app.route
的methodes参数指定了允许的HTTP方法, 默认仅允许'GET'.
我们可以在request.headers中获得包含在头部的参数:
request.headers['ACCEPT_LANGUAGE']
当然也可以添加或修改headers.
注意上述语句获得的头部参数实际是'HTTP_ACCEPT_LANGUAGE'.
文件上传
app.config是一个可以自定义配置的字典, 我们在里面写入上传文件的保存目录:
app.config['UPLOAD_FOLDER'] = os.path.join(os.path.dirname(__file__), "upload")
编写上传文件的表单记得设置enctype="multipart/form-data"
:
<form action="/do-upload/" method="post" enctype="multipart/form-data">
<input type="file" name="filename">
<input type="submit" value="submit">
</form>
从request.files
中获得文件信息, 并使用save方法保存:
from werkzeug.utils import secure_filename
@app.route('/do-upload/', methods=['POST'])
def do_upload():
if request.method == 'POST':
f = request.files['filename']
f.save(os.path.join(app.config['UPLOAD_FOLDER'], secure_filename(f.filename)))
return 'upload success'
else:
return 'Please use POST method'
secure_filename
方法可以处理文件名中的非法字符和转义字符返回合法文件名.
session与cookie
cookie
使用request可以很方便地获得cookie:
token = request.cookies.get('token')
上文中的响应函数返回值均被Flask转换为response对象, 然而cookie需要设置在response对象上所以我们需要自行建立响应对象:
from flask import make_response
@app.route('/auth/<redirect_uri>')
def auth(redirect_uri):
response = make_response(redirect(redirect_uri))
uid = request.cookies.get('uid')
token = authen(uid)
response.set_cookie('token', token)
return response
session
与cookie将数据保存在客户端不同, session将数据保存在服务端并使用加密的cookie识别客户端身份.
若要使用session首先要为app设置secret_key
用来签名:
app.secret_key = 'thisGGisRRa12secret'
session的是一个保存了相关参数的字典, 可以方便的进行操作:
session['last_login'] = time()
last_login = session['last_login']
session.pop('last_login')
参考资料: