flask使用 1.flask介绍web应用交互

flask基本使用_json

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交互过程

flask基本使用_服务器_02

 

 


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交互过程

flask基本使用_数据_03

 

 


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中