一、flask-script扩展库
简介:
是一个flask终端运行的解析器,因为在项目完成以后 所有的代码都不应该有任何的修改 因为一旦有修改 就有可能带来bug
导入: from flask_script import Manager
使用
from flask_script import Manager
manager = Manager(app)
...
if __name__ == '__main__':
manager.run()
启动的参数
参数 | 参数说明 |
---|---|
-h | 帮助 |
-h | 主机 |
-p | 端口号 |
-d | 调试 显示出现的错误信息 |
-r | 代码加载 |
--threaded | 开启多线程 |
在控制台输入启动命令运行程序
python3 manage.py runserver -h
python3 manage.py runserver -h0.0.0.0 -p5000 -d -r --threaded #全部开启
python3 manage.py runserver -d -r #开启调试和代码加载
二、蓝本/蓝图(blueprint)
概述:
当项目的代码越来越多的时候 把所有代码 都放到一个文件中 是不合理的 要根据不同功能的视图函数 进行划分到不同的模块文件中
使用
新建一个user.py
from flask import Blueprint #导入蓝本
user = Blueprint('user',__name__) #参数1 当前蓝本的名字 参数2 所在模块
@user.route('/loign/')
def login():
return 'login'
在manage.py中注册蓝本,使之与当前的flask框架关联起来
from user import user #从user.py模块中 导入user蓝本对象
app.register_blueprint(user) #注册蓝本 #http://127.0.0.1:5000/login/
app.register_blueprint(user,url_prefix='/user') #添加一个路由前缀 http://127.0.0.1:5000/user/login/
蓝本之间的重定向
from flask import Blueprint,url_for,redirect
user = Blueprint('user',__name__) #实例化蓝本对象 参数1 为蓝本的名字 参数2为所在的模块
@user.route('/login/')
def login():
# return '蓝本登录'
return redirect(url_for('posts.send_posts')) #指定跳转到对应的蓝本的视图函数中
三、当前flask对象的代理对象(current_app)
获取app对象上的所有的配置
app = Flask(__name__)
#添加配置俩种方式
app.config['SECRET_KEY'] = '123' #给flask 添加了一个配置 secret_key
app.name = 'zhangsan' #给flask 添加了一个配置 secret_key
manager = Manager(app) #实例化并加载app
获取配置信息
from flask import Blueprint,current_app
posts = Blueprint('posts',__name__)
#获取配置的两种方式
@posts.route('/send_posts/')
def send_posts():
# return '发帖子{}'.format(current_app.config['SECRET_KEY']) #获取secret_key的值
return '发帖子{}'.format(current_app.name) #获取name的值
四、cookie 和 session
1.cookie
原因: http协议 无状态协议
在网站中,http请求是无状态的。也就是说即使第一次和服务器连接后并且登录成功后,第二次请求服务器依然不能知道当前请求是哪个用户。cookie的出现就是为了解决这个问题,第一次登录后服务器返回一些数据(cookie)给浏览器,然后浏览器保存在本地,当该用户发送第二次请求的时候,就会自动的把上次请求存储的cookie数据自动的携带给服务器,服务器通过浏览器携带的数据就能判断当前用户是哪个了。cookie存储的数据量有限,不同的浏览器有不同的存储大小,但一般不超过4KB。因此使用cookie只能存储一些小量的数据。
(1) 设置cookie
Response.set_cookie(
key, 键
value,值
max_age=None, #存活的时间 单位是秒
expires=None,#过期时间
path = '/',# cookie的有效路径
)
实例
#cookie的操作
@user.route('/set_cookie/')
def set_cookie():
response = make_response('设置cookie') #构造响应
response.set_cookie('name','张三') #设置cookie 没有设置过期时间
# return '设置了cookie' #错误的响应 没有将cookie响应给用户
return response
注意: 如果没有设置cookie的存活时间 则cookie的过期时间为 当前浏览会话结束(关闭浏览器)
(2) 设置cookie 并设置过期时间
#设置cookie并设置过期时间
@user.route('/set_cookie_timeout/')
def set_cookie_timeout():
response = make_response("设置cookie并设置过期时间")
#max_age 设置过期时间
response.set_cookie('name','zhangsan',max_age=10) #设置活10秒
#expires 设置过期时间
lifttime = time.time()+20
response.set_cookie('name','lisi',expires=lifttime)
return response
(3) 获取cookie
#获取cookie
@user.route('/get_cookie/')
def get_cookie():
print(request.cookies)
return 'cookie的值为{}'.format(request.cookies.get('name'))
(4) 删除cookie
#删除cookie
@user.route('/del_cookie/')
def del_cookie():
response = make_response('删除cookie')
# response.delete_cookie('name') #删除key为 name的cookie
response.set_cookie('name','',max_age=0)
return response
2.session
概述:
服务器要区分不同的用户请求 要通过浏览器的cookie来实现 在浏览器访问服务器的时候 会给当前的用户设置一个唯一的id号(sessionid) 用户每次在请求的时候 只需要携带着sessionid来请求我 就可以 服务器就可以根据不同的唯一sessionid来区分不同用户的请求
注意: 要生成sessionid 就需要给加密种子(密钥)secret_key
导入: from flask import session
(1) 设置session
#设置session
@mysession.route('/set_session/')
def set_session():
session['id'] = 1
session['username'] = '张三'
return '设置session'
(2) 设置session并设置过期时间
#设置session并设置过期时间
@mysession.route('/set_session_timeout/')
def set_session_timeout():
session.permanent = True #设置session持久化存储
current_app.permanent_session_lifetime = timedelta(seconds=100) #设置过期时间为100秒
session['id'] = 1
session['username'] = '张三'
return '设置session及过期时间'
(3) 获取session
#获取session
@mysession.route('/get_session/')
def get_session():
print(session)
return 'id值为:{} username为:{}'.format(session.get('id'),session.get('username'))
(4) 删除session
#删除session
@mysession.route('/del_session/')
def del_session():
# session.pop('username')
# session.pop('id')
session.clear()
return '删除了session值'
五、钩子函数
概述: 介于请求和响应之间,过滤掉不安全或者无意义的请求。
作用: 使用钩子函数进行过滤。如果没有登录,但是访问了需要登录的路由地址的时候,这时就禁止访问或自动跳转到登录页,否则就可以正常访问。
1.在启动文件(manage.py)中使用钩子函数
钩子函数 | 功能描述 |
---|---|
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.host)
print(request.headers.get('User-Agent'))
if request.host != '127.0.0.1:5000' or not request.headers.get('User-Agent'):
abort(500)
print('before_request')
#请求之后
@app.after_request
def after_request(r):
print('after_request')
return r
#请求之后
@app.teardown_request
def teardown_request(r):
print('teardown_request')
return r
2.在蓝本中使用钩子函数
钩子函数 | 功能描述 |
---|---|
before_app_first_request | 第一次请求之前 |
before_app_request | 每次请求之前 |
after_app_request | 每次请求之后 |
teardown_app_request | 每次请求之后 即使请求有异常出现 |
实例
#钩子函数 第一次请求之前
@middle.before_app_first_request
def before_first_request():
print('before_first_request')
#每次请求之前
@middle.before_app_request
def before_request():
print(request.path)
print(request.host)
print(request.headers.get('User-Agent'))
if request.host != '127.0.0.1:5000' or not request.headers.get('User-Agent'):
abort(500)
print('before_request')
#请求之后
@middle.after_app_request
def after_request(r):
print('after_request')
return r
#请求之后
@middle.teardown_app_request
def teardown_request(r):
print('teardown_request')
return r
评论 (0)