【Flask】 python学习第一章

钩子函数和装饰器路由实现

before_request 每次请求都会触发             

before_first_requrest  第一次请求前触发 

after_request  请求后触发 并返回参数       

teardown_request  失败后触发 并返回异常 需要传入参数接收

from flask import Flask, request

# 设置对象
app = Flask(__name__,
            static_url_path='/python27',
            static_folder='static',
            template_folder='templates')


# 第一次请求之前都会调用  例如mysql连接
@app.before_first_request
def before_first_request():
    print("before_first_request")

# 每次请求都会被调用
@app.before_request
def before_request():
    print("before_request")
    # request.remote_addr  用户访问IP地址
    # 判断如果访问地址在黑名单内 就return 黑名单
    if request.remote_addr == "127.0.0.1":
        return "黑名单"

# 请求之后会调用 并且在函数里面接收一个参数 响应
@app.after_request
def after_request(response):
    print("after_request")
    # 对响应数据进行统一处理 response返回数据为return数据
    return response


# 请求失败之后会调用函数 并且将异常传入参数
@app.teardown_request
def teardown_request(error):
    print("teardown_request")
    return error

@app.route('/')
def index():
    return "hello wowlrd"


if __name__ == '__main__':
    app.run(host='127.0.0.1', port=8888, debug=True)
钩子函数

werkzeug工具集 

Request response routing模块 other

routing模块: Rule Map BaseConverters MapAdapter 

Request  常用属性 

data  form args cookies headers methods url files 

app.route("/data", methods=['POST'])

def data():

  data = request.data 

  print(data)

  return "ok"

from flask import Flask, request

app = Flask(__name__)


@app.route("/")
def index():
    return "index"


@app.route('/data', methods=['POST'])
def data():
    data = request.data
    print(data)
    return 'ok'


@app.route("/upload", methods=['POST'])
def upload():
    file = request.files.get("pic")
    file.save("aaa.jpg")
    return "success"


if __name__ == '__main__':
    app.run(debug=True)
data

状态保持

无状态:http 无状态协议 每次请求独立, 协议对事务没有记忆能力,  同一个url请求 没有上下文关系

解决无状态协议问题 

客户端 cookie                   服务器端 session   

cookie 不同网站之间cookie不能共享 同源策略 、设置获取cookie 浏览器会自动保存cookie  、 

request.cookie.get("passwd")  #获取cookie值  

response =  make_response("success")  # 设置对象  

respnse.set_cookie("passwd","qwe", max_age = 3600)   #设置cookie值  # 设置过期时间  max_age最大连接时间3600秒 

response.delete_cookie("passwd") 删除cookie 登出
from flask import Flask, request, make_response

app = Flask(__name__)


@app.route("/")
def index():
    username = request.cookies.get('username')
    passwd = request.cookies.get('userpass')
    return "%s ----- %s" % (username, passwd)



@app.route("/login")
def login():
    response = make_response("success")
    response.set_cookie("username", "laowang")
    response.set_cookie("userpass", "123")
    return response


if __name__ == '__main__':
    app.run(debug=True)
获取cookie 和 设置cookie

服务器端 session   存放敏感信  session依赖cookie 

session需要设置  app.config["SECRET_KEY"] = "AWDWDAIJIAJCWJAI"    

session可以放在url中 

# 设置session
    app.config["SECRET_KEY"] = "qwniassnidiajs"
    session["user_name"] = "laowang"
    session["user_id"]  = "123456"
    
# 获取session 如果没有 返回值为空 
   user_id = session.get("user_id", '') 
   user_name = session.get("user_name", '')

# 删除session 如果已经删除 返回值为none
   session.pop("user_id", None)
   session.pop("user_name", None)
from flask import Flask, request, session

app = Flask(__name__)
# session 加密 使用 必须大写
app.config['SECRET_KEY'] = "adwdawdaanvoirjaowe"


# 获取 session
@app.route("/")
def index():
    # session 依赖 cookie
    user_id = session.get("user_id", '')
    user_name = session.get("user_name", '')
    # 返回到页面
    return "%s + %s" % (user_id, user_name)


# 登陆 传输session
@app.route('/login')
def login():
    session['user_id'] = "1"
    session["user_name"] = "laowang"
    return "session"


# 登出 删除session
@app.route("/logout")
def logout():
    session.pop("user_id" , None)
    session.pop("user_name", None)
    return "success"


if __name__ == '__main__':
    app.run(debug=True)
设置session 登陆登出

请求上下文  request context     请求发生时 可以使用

应用上下文 application context  应运启动时 可以使用 

app = Flask(__name__) ------> 相等于current_app
app.route('/') def login(): print(request.method) print(current_app.config.get("DEBUG"))

未完待续

原文地址:https://www.cnblogs.com/oscarli/p/12056826.html