1. 最简单的Flask程序
from flask import Flask
# 创建Flask对象
app = Flask(__name__)
@app.route('/')
def hello_world():
return 'hello world'
if __name__ == '__main__':
app.run()
运行程序
![](https://img.haomeiwen.com/i15100194/1815ff5bb0af66f2.png)
测试,测试地址
http://127.0.0.1:5000
![](https://img.haomeiwen.com/i15100194/b15e463c5a2765bc.png)
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(允许其他机器进行访问)
运行程序
![](https://img.haomeiwen.com/i15100194/78d18c0e385348d8.png)
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
![](https://img.haomeiwen.com/i15100194/752984de27e9788b.png)
测试,测试地址
http://127.0.0.1:8080
,请求方式post
![](https://img.haomeiwen.com/i15100194/f855ad7d10132202.png)
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
![](https://img.haomeiwen.com/i15100194/52cad034130b618b.png)
- 可以使用相同的装饰器装饰不同的视图函数
如果装饰器和请求方式完全相同,那么只会执行第一个视图函数
如果装饰器相同,请求方式不同,那么两个互不干扰
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
![](https://img.haomeiwen.com/i15100194/9ef9fb54bb847c3b.png)
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
![](https://img.haomeiwen.com/i15100194/f46adc1a889ed5a6.png)
上述例子用到的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
![](https://img.haomeiwen.com/i15100194/2d4eb15581633557.png)
上述例子中,没有指定参数类型,则默认参数为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
![](https://img.haomeiwen.com/i15100194/887152ec1f68dd90.png)
测试,测试地址
http://127.0.0.1:8080/fid/1.25
![](https://img.haomeiwen.com/i15100194/171102923ceda5fe.png)
7. 新增html文件
新建templates
文件夹,并在该文件夹下新建html文件
![](https://img.haomeiwen.com/i15100194/07796fa90f0c302b.png)
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
![](https://img.haomeiwen.com/i15100194/1ac06243a70bd0fb.png)
8. 新增css文件
新建static
文件夹,在static
文件夹下新增css
文件夹,在css
文件夹新建css文件
![](https://img.haomeiwen.com/i15100194/33e91f9d0990d0df.png)
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
![](https://img.haomeiwen.com/i15100194/ed605b8fe061dfb6.png)
9. 新增js文件
在static
文件夹下新增js
文件夹,在js
文件夹新建js文件
![](https://img.haomeiwen.com/i15100194/2a1227e741713670.png)
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
![](https://img.haomeiwen.com/i15100194/2f93428ba3fb90d6.png)
![](https://img.haomeiwen.com/i15100194/85b19e6a453dd5ae.png)
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
![](https://img.haomeiwen.com/i15100194/53aecb24ed8e230f.png)
分别输入用户名和密码,然后点击提交按钮
测试用户名:kun
测试密码:123456
![](https://img.haomeiwen.com/i15100194/bb359c3e6a7d87f7.png)
输入完成后,挑战到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
![](https://img.haomeiwen.com/i15100194/33d279df75f10fd9.png)
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
![](https://img.haomeiwen.com/i15100194/e74f0445d0c64e07.png)
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
![](https://img.haomeiwen.com/i15100194/1317f6b012a96da9.png)
![](https://img.haomeiwen.com/i15100194/6cc68baf7357d096.png)
![](https://img.haomeiwen.com/i15100194/19288b747ea9bb93.png)
![](https://img.haomeiwen.com/i15100194/f20cfc3e3bb923e9.png)
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
![](https://img.haomeiwen.com/i15100194/96ec18c5a2472af2.png)
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
![](https://img.haomeiwen.com/i15100194/3c7bb4d633936ed8.png)
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
![](https://img.haomeiwen.com/i15100194/6a1838b797139b3f.png)
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
![](https://img.haomeiwen.com/i15100194/bb5ff033e8c04023.png)
14. cookie的使用
在网站中,http请求是无状态的。也就是说即使第一次和服务器连接后并且登录成功后,第二次请求服务器依然不能知道当前请求是哪个用户。cookie的出现就是为了解决这个问题,第一次登录后服务器返回一些数据(cookie)给浏览器,然后浏览器保存在本地,当该用户发送第二次请求的时候,就会自动的把上次请求存储的cookie数据自动的携带给服务器,服务器通过浏览器携带的数据就能判断当前用户是哪个了。cookie存储的数据量有限,不同的浏览器有不同的存储大小,但一般不超过4KB。因此使用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
![](https://img.haomeiwen.com/i15100194/c8e2b40e55307c68.png)
可以看出已经成功设置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
![](https://img.haomeiwen.com/i15100194/6db7942773e8f6fe.png)
重新打开一个无痕浏览器的窗口,再次测试
![](https://img.haomeiwen.com/i15100194/3856defccfc841e3.png)
15. session的使用
session和cookie的作用有点类似,都是为了存储用户相关的信息。不同的是,cookie是存储在本地浏览器,而session存储在服务器。存储在服务器的数据会更加的安全,不容易被窃取。但存储在服务器也有一定的弊端,就是会占用服务器的资源,但现在服务器已经发展至今,一些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
![](https://img.haomeiwen.com/i15100194/6cc6c876820e4f5a.png)
![](https://img.haomeiwen.com/i15100194/877ac454ea53fc78.png)
16. 上下文对象
- Flask中上下文对象:相当于一个容器,保存了Flask程序运行过程中的一些信息
- Flask中有两种上下文:请求上下文
request context
和应用上下文application context
appliacation
的生命周期大于request
。一个application
存活期间可能发生多次http请求,所以也就会有多个request
请求上下文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')
![](https://img.haomeiwen.com/i15100194/a57958b9656471b0.png)
网友评论