RUN__IT # flask day2

本文是关于Flask框架的第二天学习内容,涵盖了正则匹配路由,包括自定义转换器及其`to_python`和`to_url`方法,HTTP异常捕获与处理,请求钩子的使用,以及状态保持的实现,如cookie和session的管理。此外,还介绍了Flask的上下文概念以及如何使用flask-script扩展。

day2

正则匹配路由

具体实现步骤为:

  • 导入转换器基类:在 Flask 中,所有的路由的匹配规则都是使用转换器对象进行记录

    from werkzeug.routing import BaseConverter
    
  • 自定义转换器:自定义类继承于转换器基类

    class RegexConverter(BaseConverter):
        def __init__(self,url_map,*args):
            super(RegexConverter,self).__init__(url_map)
            # 将接受的第一个参数当做匹配规则进行保存
            self.regex = args[0]
    
  • 添加转换器到默认的转换器字典中

    app = Flask(__name__)
    # 将自定义转换器添加到转换器字典中,并指定转换器使用时的名字随意指定(re)
    app.url_map.converters["re"] = RegexConverter
    
  • 使用自定义转换器实现自定义匹配规则

# 匹配一个三位数字
@app.route('/user/<re("[0-9]{3}"):user_id>')
def user_info(user_id):
    return "user_id:%s" % user_id

如果访问的url不符合规则,会提示找不到页面

to_python和to_url

继承于自定义转换器之后,还可以实现 to_python 和 to_url 这两个函数去对匹配参数做进一步处理

to_python

class RegexConverter(BaseConverter):
      def __init__(self,url_map,*args):
          super(RegexConverter,self).__init__(url_map)
          # 将接受的第一个参数当做匹配规则进行保存
          self.regex = args[0]
          
      def to_python(self,value):
          return int(value)
        
        
value值代表匹配到的值,匹配完成之后,对匹配到的参数做最后一步处理再返回
        

to_url

在使用 url_for 去获取视图函数所对应的 url 的时候,会调用此方法对 url_for 后面传入的 视图函数参数 做进一步处理

系统自带转换器

DEFAULT_CONVERTERS = {
    'default':          UnicodeConverter,
    'string':           UnicodeConverter,
    'any':              AnyConverter,
    'path':             PathConverter,
    'int':              IntegerConverter,
    'float':            FloatConverter,
    'uuid':             UUIDConverter,
}

异常捕获

HTTP异常主动抛出

abort方法:抛出一个给定状态代码。如:abort(404)

抛出的状态码,只能是 HTTP协议的错误状态码

捕获错误

errorhandler 装饰器:当程序抛出指定错误状态码的时候,就会调用该装饰器所装的方法

@app.errorhandler(404)
def not_found(e):
    return "页面去哪了???哈哈"

捕获指定异常

@app.errorhandler(ZeroDivisionError)
def zero_division_error(e):
    return "除数不能为0"

请求勾子

  • before_first_request

    • 在处理第一个请求前执行

      # 在第一次请求qian执行
      @app.before_first_request
      def before_frist_request():
          print("第一次请求时自动执行")
      
  • before_request

    • 在每次请求前执行
    • 如果在某修饰的函数中返回了一个响应,视图函数将不再被调用
    # 每次请求前都会执行
    @app.before_request
    def before_request():
        print("每次请求之前都会执行")
        # 如果return  则不会执行请求的视图函数
    
  • after_request

    • 如果没有抛出错误,在每次请求后执行
    • 接受一个参数:视图函数作出的响应
    • 在此函数中可以对响应值在返回之前做最后一步修改处理
    • 需要将参数中的响应在此参数中进行返回
    # 每次请求后都会执行
    @app.after_request
    def afteer_request(response):
        print("每次请求之后都会执行")
        print(response)
        return response
    
  • teardown_request:

    • 在每次请求后执行
    • 接受一个参数:错误信息,如果有相关错误抛出
    • (为什么打印参数,并没有打印出来错误信息)
from flask import flask
from flask import abort


app = Flask(__name__)


# 在第一次请求之前调用
@app.before_request
det before_first_request():
    print("before_first_request")
    
    
# 每一次请求之前调用   
@app.before_request
def before_request():
    print("before_request")
    
    
# 在执行完视图函数之后调用,并且在函数里面接收一个参数:响应,可以在此方法中对相应做最后一步处理
@app.after_request
def after_request(response):
    print("after_request")
    response.headers["Content-Type"] = "application/json"
    return response

# 在请求之后都会执行,如果请求的函数报异常,会把具体异常传入到此函数
@app.teardown_request
def teardown_request(error):
    print("teardown_request")
    
    
@app.route('/')
def index():
    return "index"

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

request

data   记录请求的数据
form   记录请求中的表单数据
args   记录请求中的查询参数
cookies    记录请求中的cookie信息
headers    记录请求中的报文头
method     记录请求使用的	HTTP方法
url        记录请求的url地址
files      记录请求上传的文件

状态保持

http是一种无状态协议,请求是无状态的。

实现状态保持的两种方式
​ 在客户端存储信息使用 Cookie
​ 在服务器端存储信息使用 Session

cookie

设置cookie,通过响应带给浏览器

获取cookie ,从请求中获取

cookie是存储在浏览器中的纯文本信息,由服务端生成。浏览器只能保存4kb的内容

设置cookie

from flask import Flask
from flask import make_response
from flask import request

# 设置响应报文
sesponse = make_response("响应体内容")
# 设置cookie
response.set_cookie("key","value",max_age=3600)
return response

删除cookie

# 删除cookie
@app.route('/logout')
def logout():
    response = make_response('删除成功')
    response.delete_cookie("user_id")
    return response
session

session依赖于cookie

设置session

# 配置
app.config["SECRET_KEY"] = "XXX"
# 设置session
session["user_id"] = '1'

# 获取
user_id = session.get("user_id",'')

上下文

上下文:相当于一个容器,保存了flask运行过程中的一些信息。请求上下文和应用上下文。

请求上下文:request 和 session 。只能在请求过程中使用,及在视图函数中使用。

应用上下文:current_app 和 g 。在应用运行之后才能使用。current_app可以代替app,一般在其他模块中使用,避免运行时导入模块循环。

flask-script

先安装包 命令行输入 pip install flask-script

导入

from flask_script import Manager

manager = Manager(app)

manager.run()

运行

python 路径/文件.py runserver -p 端口 -d (debug)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值