PYTHON 八月 07, 2019

第2节、Flask基础02

文章字数 10k 阅读约需 9 mins. 阅读次数 1000000

一、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

附:cookie和session的区别和用法

原因: 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%