本节目录:
1 完整的flask启动
2 视图函数传单个参数
3 参数类型
4 视图的响应
5 重定向—>redirect和url_for的结合
6 请求与响应
7 会话控制 cookie和session
8 flask-script扩展库
9 Blueprint 蓝本/蓝图
10 钩子函数
本教程的flask环境都是在ubuntu 16.04下 —python3.5—IDE为pycharm 如果有任何问题可以留言哦 !
使用 Flask, 需要先安装—->pip3 install flask
简介:flask是一个小的python web框架 只提供了一个强健的核心 其它功能都是提供扩展库来去实现的
一、完整的flask启动
创建一个名为manage.py的python文件, 并导入flask
from flask import Flask
app = Flask(__name__) #__main__ manage
@app.route('/') #路由
def index(): #视图函数
return 'Hello Flask'
if __name__ == '__main__:
app.run()
此时直接运行run这个名为manage.py的文件,会看到控制台显示以下示例, 说明服务器启动成功, 然后打开本机浏览器输入http://127.0.0.1:5000/ 即可看到 ‘Hello Flask’ 表示一个简单的flask项目运行了起来. (随后我们将不会再使用本方法启动服务器, 会换成manage方法启动,后面会有讲到)
* Serving Flask app "manage" (lazy loading)
* Environment: production
WARNING: Do not use the development server in a production environment.
Use a production WSGI server instead.
* Debug mode: off
* Running on http://127.0.0.1:5000/ (Press CTRL+C to quit)
路由
@app.route('/')
def index(): #视图函数
return 'Hello Flask'
启动参数
app.run()
(1) debug 默认为Flase True 调试模式 自动加载代码
(2) port 指定端口号
(3) host 指定主机名 host=’0.0.0.0’
(4) threaded 线程 True
二、视图函数传单个参数
(1) 使用无参路由
@app.route('/') #路由
def index(): #视图函数
return 'Hello Flask'
(2) 有参路由
带参路由
@app.route('/find_girl/<name>')
def findGirl(name):
return '找到了,名字是{}'.format(name)
三、参数类型
(1) string 默认就为字符串
(2) int 限制传递进来的参数为 int类型 不做类型的转换
(3) float 限制传递进来的参数为 float类型 不做类型的转换
(4) path 将请求的路由地址后面的所有参数 都认为是一个参数的值 不再做路由的查找
路由地址传递多
@app.route('/many_arg/<a>/<b>')
def many_arg(a,b):
print(a,b)
return '传递多个参数'
注意事项
- 路由末尾的/建议都加上 因为在需要的时候 浏览器会自动帮你添加上
- 路由参数的限制 前面int/float/path/string 使用:和参数名称隔开
- path其实也是字符串类型 只是参数的/不再认为是路由的分隔符 而是认为是参数
四、视图的响应
(1) 手动构造响应
return ‘响应的内容’,code 状态码
(2) make_response 来构造响应
from flask import make_response
五、重定向
from flask import redirect,url_for
redirect 不传参数重定向
@app.route('/redirect/')
def myRedirect():
# return '正常请求'
return redirect('/')#导入redirect 参数为路由地址
传参重定向
return redirect('/')#导入redirect 参数为路由地址
带参数
return redirect('/many_arg/1/2')#导入redirect
url_for
无参
参数为路由地址
print(url_for('index')) #index是视图函数的名
print(url_for('indexxx')) #如果视图函数不存在 则抛出构造路由失败的异常
使用url__for构造带参路由
print(url_for('many_arg',a=1,b=2)) #index是视图函数的名
redirect和url_for的结合使用
return redirect(url_for('many_arg',a=1,b=2)) #index是视图函数的名
abort 终止 抛出指定的状态码
必须是标准的http状态码
@app.route('/look_meizi/')
def look_meizi():
abort(500)
# abort(404)
#捕获指定的状态码 错误页面的定制
@app.errorhandler(404)
def page_not_found(e):
return '你请求的地址被外星人挟持走了!!!'
# return e
@app.errorhandler(500)
def server_error(e):
return e
六、请求与响应
(1)current_app 当前app实例化的代理对象 获取当前实例化app的所有公共配置和实例化的app
实例
@app.route('/current_app/')
def myGetConfig():
# return app.config['secret_key']
return current_app.config['secret_key'] #拿到app的所有的配置
(2) 全局变量g
在一次请求中 可以全局获取
例子和使用详见钩子函数或者模板
(3) request
请求对象 包含了所有的http的请求信息
@app.route('/request/')
def get_http_message():
print('获取完整的请求url',request.url) #获取完整的请求url
print('获取去掉get传参的url',request.base_url)#获取去掉get传参的url
print('获取主机名部分的url',request.host_url) #获取主机名部分的url
print('获取路由地址',request.path) #获取路由地址
print('获取请求的方法',request.method)
print('获取get传参',request.args)
获取指定key对应的值
print('获取get传参',request.args['name'])
print('获取get传参',request.args.get('name','该key不存在'))
print('获取form表单传递过来的数据',request.form)
print('获取form表单文件上传的数据',request.files)
print('获取请求头信息',request.headers)
print('获取cookie信息',request.cookies)
print('获取传递过来的json',request.json)
return 'request对象'
当get传参的key为相同时 的取值方式
request.args.getlist(key)
实例
请求的url http://127.0.0.1:5001/get_arg/?a=1&a=2&c=3
@app.route('/get_arg/')
def get_arg():
# print(request.args)
# print(request.args.get('a'))
# print(request.args.get('a'))
print(request.args.getlist('a')) #['a','b']
return '获取多个get传参'
七、会话控制 cookie和session
原因: http协议是无状态的协议
cookie
response.set_cookie(
key, #键
value, #值
max_age,#以秒为单位的cookie存活时间
expires,失效时间需要datetime的对象
path = '/',存储的路径
)
实例
(1) 设置cookie
@app.route('/set_cookie/')
def set_cookie():
response = make_response('设置cookie')
response.set_cookie('name','zhangsan') #不设置存活时间 默认为当期浏览会话结束 也就是关闭当期的浏览器(并不是关闭标签页)
response.set_cookie('name','zhangsan',max_age=10) #设置存活时间为None
expires = time.time()+10
response.set_cookie('name','zhangsan',expires=expires) #设置存活时间为时间戳的秒数
return response
(2) 获取cookie request.cookies
#获取cookie
@app.route('/get_cookie/')
def get_cookie():
print(request.cookies)
var = request.cookies.get('name','获取不到name的值')
return '获取cookie的值为{}'.format(var)
(3) 移除cookie
#移除cookie
@app.route('/del_cookie/')
def del_cookie():
response = make_response('清除cookie')
response.delete_cookie('name') #移除cookie的值
expiraes = time.time()-10
response.set_cookie('name','',expires=expires) #不设置存活时间 默认为当期浏览会话结束 也就是关闭当期的浏览器(并不是关闭标签页)
return response
session
导入: from flask import session
cookie会每次携带着唯一的sessionId 来进行请求访问,服务端根据sessionid来区分不同用户的请求 所以session是基于cookie的 服务端会对每一个请求创建一个session对象
(1) 设置session
实例
@app.route('/set_session/')
def set_session():
session['username'] = 'lisi'
return '设置session'
(2) 设置session及session的过期时间
@app.route('/set_session/')
def set_session():
session.permanent = True #设置session的持久化
#设置session存活时间为10分钟
#自己可以设置session时间短点 在超过时间后在获取 发现session值不再了
app.permanent_session_lifetime = timedelta(minutes=10)
session['username'] = 'wangwu'
return '设置session'
(3) 获取session
#获取session
@app.route('/get_session/')
def get_session():
val = session.get('username','username值不存在')
return '获取的seesion的值为{}'.format(val)
(4) 移除session
#移除session
@app.route('/del_session/')
def del_session():
print(session.pop('username'))
#session.clear() #清空
return '删除了session中username的值'
八、flask-script 扩展库
概念: 是一个flask终端运行的解析器 因为在项目完成以后 不应该有任何的改动 因为改动代码就会有风险 所以借助终端来完成不同启动项的配置
安装
pip3 install flask-script
使用
from flask_script import Manager
manager = Manager(app) #初始化flask运行的解析器
manager.run()
在终端使用的启动项的可选参数
- -h 主机名
- -p 指定端口号
- –threaded 开启多线程
- -d 开启调试模式
- -r 代码修改后重新加载
python3 manage.py runserver [-h[,-p…]]
python3 manage.py runserver -h #查看当前都有那些可选启动项
python3 manage.py runserver -d -r -h127.0.0.1 -p5001 –threaded
九、Blueprint蓝本/蓝图
概念: 当代码越来越多的时候 所有的视图函数放在一个文件中 明显是不合理的 可以使用蓝本 将不同功能模块的视图函数 单独放在一个文件中
导入
from flask import Blueprint,session
使用
新建一个py文件 叫user
from flask import Blueprint
user = Blueprint('user',__name__)
@user.route('/login')
def login():
return 'login'
在manage.py中使用
from mysession import user #导入蓝本
app.register_blueprint(user) #app注册蓝本(将app和蓝本视图文件关联起来)
app.register_blueprint(user,url_prefix='/user') #app注册蓝本(将app和蓝本视图文件关联起来)
十、钩子函数
类似与django 中间件 在使用的时候需要使用装饰器
在主程序中使用
钩子函数 功能描述
before_first_request 第一次请求之前
before_request 每次请求之前
after_request 每次请求之后 前提是没有出现异常
teardown_request 每次请求之后 即使出现异常
实例
@app.before_first_request
def before_first_request():
print('before_first_request')
@app.before_request
def before_request():
# print(request.path)
# print(request.method)
if request.path=='/' and request.method=='GET':
g.message = '不允许使用get请求index视图函数'
abort(404)
print('before_request')
@app.after_request
def after_request(r):
print(g.message)
print('after_request')
return r
@app.teardown_request
def teardown_request(r):
print('teardown_request')
return r
钩子函数使用在蓝本中
钩子函数 用途
before_app_first_request 第一次请求之前
before_app_request 每次请求之前
after_app_request 每次请求之后 没有异常
teardown_app_request 每次请求之后 即使有异常
实例
@mysession.before_app_first_request
def before_first_request():
print('before_first_request')
@mysession.before_app_request
def before_request():
# print(request.path)
# print(request.method)
if request.path=='/' and request.method=='GET':
g.message = '不允许使用get请求index视图函数'
abort(404)
print('before_request')
@mysession.after_app_request
def after_request(r):
# print(g.message)
print('after_request')
return r
@mysession.teardown_app_request
def teardown_request(r):
print('teardown_request')
return r
随后会持续更新Flask框架的基础教程…………….看着此教程, Flask入门完全ok !
技术交流可以留言评论哦 ! 虚心学习, 不忘初心, 共同奋进 !