flask框架总结

首先是flask与django的共同点与区别

flask:小而精  而flask请求的传递 打包好 放那取 请求来经过wsgi 将request和session 经过localstack实例化导local对象里 当然其中另一个localstack对象是实例化 current_app和g的 然后 通过实例化localprocxy __getattr__拿到所想要的参数信息

django:大而全  django请求信息的传递是 参数的传递 类似于手递手  其中 模板 orm session django内置的一套权限系统

 

简单flask项目的书写

from flask import Flask

app = Flask(__name__)

@app.route('/index')
def index():
    return 'HELLO WORLD'

if __name__ == '__main__':
    app.run()

以上就是一套简单的flask项目 

2.session的使用

from flask import session 
#设置session
session['key']='value'
#取session
v = session.get('key')
print(v)

3,装饰器和before_request和after_request

from flask import Flask

app = Flask(__name__)
import functools
#装饰器
def wrapper(func):
    @functools.wraps(func) #保留被装饰函数的函数名和属性
    def inner(*args,**kwargs):
        print("装饰器已运行")
        return func(*args,**kwargs)
    return inner



@app.route('/index',methods=["GET","POST"])
@wrapper  #装饰器
def index():
    return "HELLO WORLD"

if __name__ == '__main__':
    app.__call__
    app.run()

若不加@functiontools.wraps(func)则需要使用endpoint参数使命名成不同的参数地址 

端点通常用作反向查询URL地址(viewfunction**–>endpoint–>**URL)。例如,在flask中有个视图,你想把它关联到另一个视图上(或从站点的一处连接到另一处)。

常见的装饰器 @app.before_request @app.after_request  

只需要在函数上添加此装饰器就可以在所有的网站请求到来前而执行它

@app.before_request
def check_login():
    print(request.path)
    if request.path == "/login":
        return None                   #若使用另一种会陷入死循环 这是一件值得思考的事 会继续往下执行 如果不是login则重定向到login思考
    user = session.get('user_info')
    if not user:
        return  redirect('/login')

验证用户是否登陆如果没有登陆则跳转到登陆页面,如果登录的”/login“则正常执行 return None从源码来看 会继续往下执行

若before_request 有返回值仍然会只想所有的after_response(在写@app.after_response装饰的函数时必须要有返回值)

 

闪现

"""闪现"""
from flask import Flask,session,flash,get_flashed_messages

app = Flask(__name__)
app.secret_key="Sdasasda1sada"
import functools
#装饰器
def wrapper(func):
    @functools.wraps(func)
    def inner(*args,**kwargs):
        print("装饰器已运行")
        return func(*args,**kwargs)
    return inner


@app.route('/x1',methods=["GET","POST"])
def index():
    flash("我要ts aj1",category="x1")    #可以存很多次
    return "视图函数x1"


@app.route('/x2',methods=["GET","POST"])
def login():
    print("视图函数x2")
    data = get_flashed_messages(category_filter=["x1"])  #但是只取一次 再取就是空的列表
    print(data)
    return "视图函数x2"

if __name__ == '__main__':
    app.run()

flask_session 

作用:将默认保存的签名cookie中的值保存到redis/memcached/file/Mongodb/SQL

应用:

a. 配置

# app.config['SESSION_TYPE'] = 'redis'
# app.config['SESSION_REDIS'] = Redis(host='127.0.0.1',port=6379)

b.替换

from flask_session import Session
Session(app)
注意事项:

只能改一级字典并不能够改二级字典 二级字典修改并不保存

若想要修改二级字典也保存的话

'''
关于如何修改二级session并使它保存的操作 因为 默认只修改二级操作是不保存的
return session.modified or (
session.permanent and app.config["SESSION_REFRESH_EACH_REQUEST"]
)
'''
session['permanent'] =True
# session['modified'] = True
return 'index'
'''
将token存储在redis中不再是将cookie中
'''
#方式一
# from redis import Redis
# app.session_interface = RedisSessionInterface(
#     redis=Redis(host='127.0.0.1',port=6379,),
#     key_prefix='flaskxxxx'
# )
#方式二
# from flask.ext.session import Session
# from redis import Redis
# app.config['SESSION_TYPE'] = 'redis'
# app.config['SESSION_REDIS'] = Redis(host='127.0.0.1',port=6379)
# Session(app)

 

posted @ 2021-07-21 18:05  不想拖累他人  阅读(105)  评论(0)    收藏  举报