flask优势
“微”, 轻量级web框架, 核心精简, 允许拓展
虚拟环境 (重点)
虚拟环境: 独立的python环境, 可以避免同一个框架的多版本冲突
三个命令:
创建虚拟环境 mkvirtualenv -p python3 env22
退出虚拟环境 deactivate
进入虚拟环境 workon env22
查看所有虚拟环境 workon 双击tab
mac安装虚拟环境: https://www.jianshu.com/p/dc7ec6a303e3
基本使用
3.1 第一个flask程序
安装第三方包
pip install flask==0.10.1
查看当前解释器安装的第三方包
pip freeze
第一个flask应用
from flask import Flask
app = Flask(__name__)
@app.route('/')
def index():
return 'index'
if __name__ == "__main__":
app.run(host='0.0.0.0', port=8080, debug=True)
run方法参数
if __name__ == "__main__":
app.run(host='0.0.0.0', port=8080, debug=True)
# host 绑定ip 万能ip 0.0.0.0 可以接收外网/局域网/本机的访问
#port 监听端口号
#debug 是否开启调试模式 作用1,可以在网页中显示python错误 2,更新代码后服务器会自动重启
3.2 路由的基本定义
# 1,methods参数 用于设置路由支持的请求方式,以列表的方式,元素必须大写
@app.route('/',methods=['GET','POST']) # 2,路由必须以路径分隔符 ‘/’ 开头
def index():
return 'index'
if __name__ == "__main__":
print(app.url_map)
# 3,url_map记录了web应用的所有路由规则,(url,支持的请求方式,视图函数标记(函数名))
app.run(host='0.0.0.0', port=8080, debug=True)
3.3 请求对象
3.3.1 基本数据
print(request.url) # 获取请求对象的url
print(request.method) # 获取请求的对象的请求方式
print(request.headers) # 获取请求头内容(请求头是一个类字典对象)
print(request.headers.get('host')) # 建议使用get 方法获取健值,没有健的时候返回None而不报错
3.3.2 查询字符串 (重点)[类字典对象]
print(request.args.get('username')
print(request.args.get('age')
3.3.3 请求体 (重点)
请求体数据(3种)[可使用postman进行测试]
1,文本
print(request.data)
2,健值对数据(form表单)
# <input type='text' name='username' value='ls'>
print(request.form.get('username')
3,文件(图片,视频等)
# <input type='file' name='boy' >
file = request.files.get('boy') # 获取文件内容
file.save('1.jpg') # 保存文件
3.4 响应
3.4.1 自定义响应对象
@app.route('/')
def index():
response = set_response('index') # 为响应对象的响应体传参,默认为None
print('response.headers') # 打印响应头,也可以为其重新赋值
return response
3.4.2 返回json (重点)[主要是将字典转成json字符串对象]
@app.route('/')
def index():
dict={
'name':'ls'
'age':18
}
return jsonify(dict)
# jsonify将dict转成json字符串并自动将Content-Type设置为application/json
# 也支持jsonify(name='zs',age=18)
# 建议使用此方式,不推荐使用json.dump(dict)
3.4.3 重定向
@app.route('/')
def index():
return 'index'
@app.route('/demo')
def demo():
return redirect(url_for('index') # 开发经常是redirect 和 url_for 配合使用
# 也可redirect('/') 直接指向一个url地址
3.4.4 自定义状态码
@app.route('/')
def index():
return 'index',700 # 设置第二个返回值为状态吗
# 作用:可以快速排错
4. 异常处理
@app.route('/')
def index():
a = 1 / 0
abort(ZeroDivisionError) # 抛出异常(只能抛出http错误)
return 'index'
@errorhanler(404)
def error_404(e): # 捕获到异常
return '页面不存在'
@errorhanler(ZeroDivisionError)
def error_zero(0):
return '0不能作为除数'
四. 状态保持 (重点)
状态保持: 记录用户访问信息的机制, 如 是否显示过帮助信息, 是否已登录, 搜索记录等
4.1 cookie
特点:
将数据保存在客户端(用户的电脑上), 可以减轻服务器压力
访问网站时, 浏览器会自动将该网站的cookie数据发送给服务器
使用场景:
保存一些不太重要的数据
cookie交互过程
cookie实现过程
@app.route('/detail3')
def detail3():
req_c = request.cookies.get('i_help') #
if req_c:
return '显示漫画'
response = make_response('显示帮助') # type:Response
response.set_cookie('i_help', '1',max_age=86400) # 设置cookie数据
# max_age设置cookie过期时间,默认为-1(浏览器关闭即失效) 为0(立即失效)正数单位为毫秒
return response
cookie设置过期时间
max-age:
-1: 默认值, 当浏览器关闭时, cookie会被删除
0 : 立即删除cookie
正数: max-age=5, 表示5秒后cookie数据被删除
细节
一旦保存了cookie, 访问网站的任意路由时, cookie数据都会被浏览器发送
同源策略: cookie数据只会发给对应的网站
前端js也可以读写cookie
4.2 session
特点:
将数据保存在服务端(服务器的数据库中), 安全性更高
使用场景:
保存一些重要/敏感的数据
session交互过程
session实现免密码登陆
from datetime import timedelta
from flask import Flask,request,session,redirect,url_for
app = Flask(__name__)
app.secret_key = 'test'
session.permanent = True
app.permanent_session_lifetime = timedelta(days=7)
@app.route('/',methods=['GET','POST'])
def index():
username = session.get("name")
print(username)
if username:
return '欢迎回来%s'%username
return '首页'
@app.route('/login.html',methods=['GET','POST'])
def login():
method = request.method
if method == 'GET':
with open('./login.html') as f:
content = f.read()
return content
username = request.form.get('username')
password = request.form.get('password')
if username == 'ls' and password == '111':
session["name"] = username
# print(session.get("name"))
return redirect(url_for('index'))
else:
return '登陆失败'
if __name__ == '__main__':
app.run(host='0.0.0.0', port=8080, debug=True)
2. Session细节
生成随机字符串 base64.b64encode(os.urandom(48))
设置session的过期时间
# session.permanent 默认为False,如果设置为True,则默认时间为31天
session.permanent = True
app.permanent_session_lifetime = timedelta(days=7)
# 也可以设置hours = 2
删除session
session.pop('name',None) # 设置默认值None,即使健不存在也不报错
flask中默认的session存储机制没有使用传统的session存储机制(数据保存到服务端的数据库中), 而是将session数据加密后保存到了cookie中