1. 最简单的Flask程序
from flask import Flask
# 创建Flask对象
app = Flask(__name__)
@app.route('/')
def hello_world():
return 'hello world'
if __name__ == '__main__':
app.run()
运行程序
测试,测试地址
http://127.0.0.1:5000
2. 修改app的run
from flask import Flask
# 创建Flask对象
app = Flask(__name__)
@app.route('/')
def hello_world():
return 'hello world'
if __name__ == '__main__':
app.run(debug=True, port=8080, host='0.0.0.0')
修改了三个参数
第一个参数是debug,是否开启调试模式
第二个参数是port,是打开的端口地址
第三个参数是host,是开启的IP地址,默认是127.0.0.1(只允许本机访问),修改为0.0.0.0(允许其他机器进行访问)
运行程序
3. 修改请求方式
默认是支持GET请求,现在添加支持POST请求
from flask import Flask, request
# 创建Flask对象
app = Flask(__name__)
@app.route('/', methods=['GET', 'POST'])
def hello_world():
# 判断请求方式
if request.method == 'GET':
return 'request method is get'
elif request.method == 'POST':
return 'request method is post'
if __name__ == '__main__':
app.run(debug=True, port=8080, host='0.0.0.0')
使用postman
进行测试
测试,测试地址http://127.0.0.1:8080
,请求方式get
测试,测试地址
http://127.0.0.1:8080
,请求方式post
4. 修改请求路由
- 可以使用不同的装饰器同时装饰一个视图函数
from flask import Flask, request
# 创建Flask对象
app = Flask(__name__)
@app.route('/', methods=['GET', 'POST'])
@app.route('/index', methods=['GET', 'POST'])
def hello_world():
if request.method == 'GET':
return 'request method is get'
elif request.method == 'POST':
return 'request method is post'
if __name__ == '__main__':
app.run(debug=True, port=8080, host='0.0.0.0')
测试,测试地址http://127.0.0.1:8080/index
- 可以使用相同的装饰器装饰不同的视图函数
如果装饰器和请求方式完全相同,那么只会执行第一个视图函数
如果装饰器相同,请求方式不同,那么两个互不干扰
from flask import Flask, request
# 创建Flask对象
app = Flask(__name__)
@app.route('/', methods=['GET', 'POST'])
@app.route('/index', methods=['GET', 'POST'])
def first():
return 'first'
@app.route('/', methods=['GET', 'POST'])
@app.route('/index', methods=['GET', 'POST'])
def second():
return 'second'
if __name__ == '__main__':
app.run(debug=True, port=8080, host='0.0.0.0')
测试,测试地址http://127.0.0.1:8080/index
5. 路由重定向
引入redirect
from flask import Flask, request, redirect
# 创建Flask对象
app = Flask(__name__)
@app.route('/', methods=['GET', 'POST'])
@app.route('/index', methods=['GET', 'POST'])
def login():
url = '/redirect'
return redirect(url)
@app.route('/redirect', methods=['GET', 'POST'])
def profile():
return 'redirect'
if __name__ == '__main__':
app.run(debug=True, port=8080, host='0.0.0.0')
测试,测试地址http://127.0.0.1:8080/index
上述例子用到的url路径,当路径被修改时,则需要同步修改相关代码
如果我们使用url_for,则绑定的是视图函数(通常视图函数是不修改的)
引入url_for
from flask import Flask, request, redirect, url_for
# 创建Flask对象
app = Flask(__name__)
@app.route('/', methods=['GET', 'POST'])
@app.route('/index', methods=['GET', 'POST'])
def login():
return redirect(url_for('profile'))
@app.route('/redirect', methods=['GET', 'POST'])
def profile():
return 'redirect'
if __name__ == '__main__':
app.run(debug=True, port=8080, host='0.0.0.0')
6. 动态参数路由
from flask import Flask, request, redirect, url_for
# 创建Flask对象
app = Flask(__name__)
@app.route('/info/<name>', methods=['GET', 'POST'])
def get_name(name):
return 'name is {}'.format(name)
if __name__ == '__main__':
app.run(debug=True, port=8080, host='0.0.0.0')
测试,测试地址http://127.0.0.1:8080/info/jack
上述例子中,没有指定参数类型,则默认参数为string类型。
可以指定参数类型
- string
- float
- int
from flask import Flask, request, redirect, url_for
# 创建Flask对象
app = Flask(__name__)
@app.route('/info/<name>', methods=['GET', 'POST'])
def get_name(name):
return 'name is {}'.format(name)
@app.route('/mid/<int:mid>', methods=['GET', 'POST'])
def get_id(mid):
return 'mid is {}'.format(mid)
@app.route('/fid/<float:fid>', methods=['GET', 'POST'])
def get_float(fid):
return 'fid is {}'.format(fid)
if __name__ == '__main__':
app.run(debug=True, port=8080, host='0.0.0.0')
测试,测试地址http://127.0.0.1:8080/mid/10
测试,测试地址
http://127.0.0.1:8080/fid/1.25
7. 新增html文件
新建templates
文件夹,并在该文件夹下新建html文件
form.html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>测试页面</title>
</head>
<body>
<div>这是一个测试页面</div>
</body>
</html>
run.py
from flask import Flask, render_template
# 创建Flask对象
app = Flask(__name__)
@app.route('/form', methods=['GET', 'POST'])
def get_name():
return render_template('form.html')
if __name__ == '__main__':
app.run(debug=True, port=8080, host='0.0.0.0')
测试,测试地址http://127.0.0.1:8080/form
8. 新增css文件
新建static
文件夹,在static
文件夹下新增css
文件夹,在css
文件夹新建css文件
mystyle.css
.text-color{
color: red;
}
form.html
新增一行<link rel="stylesheet" href="../static/css/mystyle.css">
其中属性href
为css文件的位置,..
的意思是返回上一级目录
将div
标签添加mystyle.css
文件中text-color
样式
<!DOCTYPE html>
<html lang="en">
<link rel="stylesheet" href="../static/css/mystyle.css">
<head>
<meta charset="UTF-8">
<title>测试页面</title>
</head>
<body>
<div class="text-color">这是一个测试页面</div>
</body>
</html>
测试,测试地址http://127.0.0.1:8080/form
9. 新增js文件
在static
文件夹下新增js
文件夹,在js
文件夹新建js文件
myjavascript.js
function myClick(){
document.getElementById('kkk').style.backgroundColor='red'
}
form.html
默认div背景颜色为绿色,点击按钮触发js事件,修改背景颜色为红色
<!DOCTYPE html>
<html lang="en">
<script src="../static/js/myjavascript.js" type="application/javascript"></script>
<link rel="stylesheet" href="../static/css/mystyle.css">
<head>
<meta charset="UTF-8">
<title>测试页面</title>
</head>
<body>
<button onclick="myClick()">点击改变颜色</button>
<div id="kkk" style="height: 400px;width: 400px;background-color: green"></div>
</body>
</html>
测试,测试地址http://127.0.0.1:8080/form
10. request对象
from flask import request
request对象中保存了HTTP请求中的一切信息
1. 接收表单请求
使用request.form
参数
form.html
<!DOCTYPE html>
<html lang="en">
<script src="../static/js/myjavascript.js" type="application/javascript"></script>
<link rel="stylesheet" href="../static/css/mystyle.css">
<head>
<meta charset="UTF-8">
<title>测试页面</title>
</head>
<body>
<form action="login" method="post">
<input type="text" name="user" placeholder="用户名">
<input type="text" name="password" placeholder="密码">
<input type="submit" value="提交">
</form>
</body>
</html>
run.py
from flask import Flask, render_template, request
# 创建Flask对象
app = Flask(__name__)
# 返回表单页面
@app.route('/form', methods=['GET', 'POST'])
def get_name():
return render_template('form.html')
# 验证登录
@app.route('/login', methods=['POST'])
def login():
user = request.form.get('user')
password = request.form.get('password')
return 'user is {} password is {}'.format(user, password)
if __name__ == '__main__':
app.run(debug=True, port=8080, host='0.0.0.0')
测试,测试地址http://127.0.0.1:8080/form
分别输入用户名和密码,然后点击提交按钮
测试用户名:kun
测试密码:123456
输入完成后,挑战到login
路由
2. 接收get请求
使用request.args
参数
run.py
from flask import Flask, render_template, request
# 创建Flask对象
app = Flask(__name__)
@app.route('/login')
def get_name():
user = request.args.get('user')
password = request.args.get('password')
return 'user is {} password is {}'.format(user, password)
if __name__ == '__main__':
app.run(debug=True, port=8080, host='0.0.0.0')
测试,测试地址127.0.0.1:8080/login?user=kkk&password=123456
3. 接收json方式
使用request.json
参数
run.py
from flask import Flask, render_template, request
# 创建Flask对象
app = Flask(__name__)
@app.route('/login', methods=['GET', 'POST'])
def get_name():
user = request.json.get('user')
password = request.json.get('password')
return 'user is {} password is {}'.format(user, password)
if __name__ == '__main__':
app.run(debug=True, port=8080, host='0.0.0.0')
测试,测试地址127.0.0.1:8080/login
4. 接收上传文件
使用request.files
参数
run.py
import os
from flask import Flask, render_template, request
# 创建Flask对象
app = Flask(__name__)
# 返回表单页面
@app.route('/form', methods=['GET', 'POST'])
def get_name():
return render_template('form.html')
@app.route('/upload', methods=['GET', 'POST'])
def get_file():
picture = request.files.get('picture')
if picture:
upload_path = 'static/upload'
full_path = os.path.join(os.path.dirname(__file__), upload_path, picture.filename)
picture.save(full_path)
return 'success'
if __name__ == '__main__':
app.run(debug=True, port=8080, host='0.0.0.0')
form.html
上传文件,一定要添加 enctype="multipart/form-data"
<!DOCTYPE html>
<html lang="en">
<script src="../static/js/myjavascript.js" type="application/javascript"></script>
<link rel="stylesheet" href="../static/css/mystyle.css">
<head>
<meta charset="UTF-8">
<title>测试页面</title>
</head>
<body>
<form action="upload" method="POST" enctype="multipart/form-data">
<input type="file" name="picture">
<input type="submit" value="提交">
</form>
</body>
</html>
测试,测试地址127.0.0.1:8080/form
11. abort函数的使用
引入from flask import abort
使用方法
- 传递状态码信息,必须是标准的http状态码
- 传递响应体信息
run.py
from flask import Flask, abort
# 创建Flask对象
app = Flask(__name__)
@app.route('/abort')
def get_name():
return abort(500)
if __name__ == '__main__':
app.run(debug=True, port=8080, host='0.0.0.0')
测试,测试地址127.0.0.1:8080/abort
run.py
from flask import Flask, abort, Response
# 创建Flask对象
app = Flask(__name__)
@app.route('/abort')
def get_name():
resp = Response('abort function')
return abort(resp)
if __name__ == '__main__':
app.run(debug=True, port=8080, host='0.0.0.0')
测试,测试地址127.0.0.1:8080/abort
12. 自定义错误信息
run.py
from flask import Flask, abort, Response
# 创建Flask对象
app = Flask(__name__)
# 自定义错误处理方法
@app.errorhandler(404)
def handle_404_error(err):
return '请求出错了,错误信息{}'.format(err)
if __name__ == '__main__':
app.run(debug=True, port=8080, host='0.0.0.0')
测试,测试地址127.0.0.1:8080/aaaaaa
13. 返回json数据的方法
引入from flask import jsonify
run.py
from flask import Flask, jsonify
# 创建Flask对象
app = Flask(__name__)
@app.route('/index')
def get_name():
return jsonify({'status': '200', 'msg': 'success'})
if __name__ == '__main__':
app.run(debug=True, port=8080, host='0.0.0.0')
测试,测试地址127.0.0.1:8080/index
14. cookie的使用
-
设置cookie
设置cookie,通过response.set_cookie。以下是几个参数:- key:设置的cookie的key。
- value:key对应的value。
- max_age:改cookie的过期时间,如果不设置,则浏览器关闭后就会自动过期。
- expires:过期时间,应该是一个datetime类型。
- domain:该cookie在哪个域名中有效。一般设置子域名,比如cms.example.com。
- path:该cookie在哪个路径下有效。
run.py
from flask import Flask, make_response
# 创建Flask对象
app = Flask(__name__)
@app.route('/index')
def get_name():
# 通过make_response创建response对象
resp = make_response('success')
# 设置cookie,同时设置cookie的有效期,参数为max_age,单位为秒
resp.set_cookie('user', 'kun', max_age=1800)
return resp
if __name__ == '__main__':
app.run(debug=True, port=8080, host='0.0.0.0')
测试,测试地址127.0.0.1:8080/index
可以看出已经成功设置cookie了
- 获取cookie
使用request.cookie
获取
run.py
from flask import Flask, request, make_response
# 创建Flask对象
app = Flask(__name__)
@app.route('/index')
def get_name():
# 通过make_response创建response对象
resp = make_response('success')
# 设置cookie,同时设置cookie的有效期,参数为max_age,单位为秒
resp.set_cookie('user', 'kun', max_age=1800)
return resp
@app.route('/info')
def get_cookie():
user = request.cookies.get('user')
return 'get cookie, user is {}'.format(user)
if __name__ == '__main__':
app.run(debug=True, port=8080, host='0.0.0.0')
测试,测试地址127.0.0.1:8080/info
重新打开一个无痕浏览器的窗口,再次测试
15. session的使用
run.py
from flask import Flask, request, make_response, session
# 创建Flask对象
app = Flask(__name__)
# 可以设置秘钥
app.config['SECRET_KEY'] = 'abcdefghijklmnopqrstuvwxyz123456789'
@app.route('/index')
def get_name():
session['user'] = 'kun'
session['sex'] = 'male'
return 'success'
@app.route('/info')
def get_cookie():
user = session.get('user')
sex = session.get('sex')
return 'get session, user is {}, sex is {}'.format(user, sex)
if __name__ == '__main__':
app.run(debug=True, port=8080, host='0.0.0.0')
测试,测试地址127.0.0.1:8080/index
16. 上下文对象
请求上下文request context
,包括request
, session
应用上下文 application context
, 包括current_app
, g
17. 请求钩子
在客户端和服务器端交互的过程中,有些准备工作或者扫尾工作需要处理
常用的钩子:
- before_first_request:在第一次请求之前运行,用途连接数据库
- before_request: 在每一次请求之前运行,用途权限校验
- after_request:在请求之后运行,接收一个参数,这个参数时返回的相应数据
run.py
from flask import Flask
# 创建Flask对象
app = Flask(__name__)
# 可以设置秘钥
app.config['SECRET_KEY'] = 'abcdefghijklmnopqrstuvwxyz123456789'
# 在第一次请求之前运行
@app.before_first_request
def before_first_request():
print('before_first_request')
# 在请求之前运行
@app.before_request
def before_request():
print('before_request')
# 在请求之后运行
@app.after_request
def after_request(response):
print('after_request')
return response
@app.route('/index')
def index():
return 'index'
if __name__ == '__main__':
app.run(debug=True, port=8080, host='0.0.0.0')