搭建一个基本flask进程
- 安装虚拟环境
python -m venv venv
然后运行activate,进入虚拟环境;
- 在虚拟环境里安装flask
(venv) pip install flask
- 编写基本的helloworld程序
# main.py
from flask import Flask
app = Flask(__name__)
@app.route('/')
def hello_world():
return "hello world!"
- 设置FLASK_APP环境变量(windows)并运行
(venv) set FLASK_APP=main.py
python -m flask run # 或flask run
之后访问 localhost:5000,就可以看到返回的内容。
基本操作
将方法绑定到URL
- 直接绑定
@app.route('/test')
def func():
return 1
- 带参数
@app.route('/test/<variable>')
def func():
return variable
处理表单数据
首先引入请求对象(见概念一节)
- 操作URL参数,使用args属性
request.args.get('key')
- 操作form-data,使用form属性
request.form['username']
重定向与错误
使用redirect来重定向请求
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
操作响应(response)
视图函数的返回值会根据一定规则自动转换为一个响应对象。
例子:not_found返回的html页面(字符串)会生成一个404状态码的响应对象。
@app.errorhandler(404)
def not_found(error):
return render_template('error.html'), 404
若返回dict,会自动转换为JSON响应
@app.route("/me")
def me_api():
user = get_current_user()
return {
"username": user.username,
"theme": user.theme,
"image": url_for("user_image", filename=user.image),
}
session与cookies
from flask import Flask,request,session
app = Flask(__name__)
app.secret_key = b'sdafdddd\x]\x'
@app.route('/login', methods=['GET', 'POST'])
def login():
if request.method == 'POST':
session['username'] = request.form['username']
概念与问题
WSGI是什么
- WSGI全称Python Web Server Gateway Interface,指定了web服务器和Python web应用或web框架之间的标准接口,以提高web应用在一系列web服务器间的移植性
- WSGI的标准是,Web程序需要有能接受两个参数的可调用对象(函数),第一个参数是environ字典,第二个参数是可调用对象调用的函数,用来发起响应。
- 通过environ可以获取http请求的所有信息,http响应的数据都可以通过start_response加上函数的返回值作为body。
def hello(environ, start_response):
status = "200 OK"
response_headers = [('Content-Type', 'text/html')]
start_response(status, response_headers)
path = environ['PATH_INFO'][1:] or 'hello'
return [b'<h1> %s </h1>' % path.encode()]
如何handle请求
flask中用全局对象request来处理客户端的请求。