Flask 笔记整理--视图

1.Flask app对象创建

参数初始化

# 创建flask的应用对象
# __name__表示当前的模块名字
#           模块名,flask以这个模块所在的目录为总目录,默认这个目录中的static为静态目录,templates为模板目录
app = Flask(__name__,
            static_url_path="/python",  # 访问静态资源的url前缀, 默认值是static
            static_folder="static",  # 静态文件的目录,默认就是static
            template_folder="templates",  # 模板文件的目录,默认是templates
            )
 

配置文件的导入使用

# 1. 使用配置文件
app.config.from_pyfile("config.cfg")

# 2. 使用对象配置参数
class Config(object):
    DEBUG = True
    SECRET_KEY = "qwertyuio"


app.config.from_object(Config)

 # 3. 直接操作config的字典对象
 app.config["DEBUG"] = True

 

2.视图

视图中读取配置文件

from flask import Flask, current_app

app.config.get()  或者 current_app.config.get()

@app.route("/")
def index():
    """定义的视图函数"""
    # 读取配置参数
    # 1. 直接从全局对象app的config字典中取值
    # print(app.config.get("SECRET_KEY "))
    # 2. 通过current_app获取参数
    print(current_app.config.get("SECRET_KEY "))

    return "hello flask"

 

 methods 限定请求方式

@app.route("/post", methods=["GET", "POST"])
def post():
    return "post  page"

 

url_for 反解析

@app.route("/register")
def register():
    # url = "/"       使用url_for的函数,通过视图函数的名字找到视图对应的url路径
    url = url_for("index")
    return redirect(url)

 

redirect() 重定向

from flask import redirect ,url_for

 @app.route("/register")
def register():
    #return redirect( "www.baidu.com")

    #return redirect(url_for("index"))

 

 render_template() 重定向模板

from flask import render_template
@front.route('/', methods=['GET', 'POST'])
def index():
    ...
  return render_template("index.html", form=form, essays=essays,
                           pagination=pagination)

 

动态路由

要给 URL 添加变量部分,你可以把这些特殊的字段标记为 <variable_name> , 这个部分将会作为命名参数传递到你的函数。规则可以用 <converter:variable_name> 指定一个可选的转换器

#@front.route('/post/<id>', methods=['GET', 'POST'])  #不加转换器类型

@front.route('/post/<int:id>', methods=['GET', 'POST']) #int 冒号后面的值为动态的
def post_essay(id):    

      return

 

 

转换器有下面几种:

int接受整数
float同 int ,但是接受浮点数
path和默认的相似,但也接受斜线

abort()函数和异常的捕获

 

如果在视图函数执行过程中,出现了异常错误,我们可以使用abort函数立即终止视图函数的执行。通过abort函数,可以向前端返回一个http标准中存在的错误状态码,表示出现的错误信息。

使用abort抛出一个http标准中不存在的自定义的状态码,没有实际意义。如果abort函数被触发,其后面的语句将不会执行。其类似于python中raise。

from flask import Flask,abort
@app.route('/')
def hello_itcast():
    abort(404)
    return 'hello itcast',999

#在Flask中通过装饰器来实现捕获异常,errorhandler()接收的参数为异常状态码。
#视图函数的参数,返回的是错误信息
@app.errorhandler(404)
def error(e):
    return '您请求的页面不存在了,请确认后再次访问!%s'%e

 

 

 获取请求参数

from flask import request

就是 Flask 中表示当前请求的 request 对象,request对象中保存了一次HTTP请求的一切信息

 form表单 和data

  1. # 127.0.0.1:5000/index?city=shenzhen&country=china  查询字符串 QueryString
    @app.route("/index", methods=["GET", "POST"])
    def index():
        # request中包含了前端发送过来的所有请求数据
        # form和data是用来提取请求体数据
        # 通过requset.form可以直接提取请求体中的表单格式的数据, 是一个类字典的对象
        # 通过get方法只能拿到多个同名参数的第一个
        name = request.form.get("name")
        age = request.form.get("age")
        name_li = request.form.getlist("name")
    
        # 如果是请求体的数据不是表单格式的(如json格式),可以通过request.data获取
        print("request.data: %s" % request.data)
    
        # args是用来提取url中的参数(查询字符串)
        city = request.args.get("city")
        return "hello name=%s, age=%s, city=%s, name_li=%s" % (name, age, city, name_li)

     

cookies 

# coding:utf-8

from flask import Flask, make_response, request


app = Flask(__name__)


@app.route("/set_cookie")
def set_cookie():
    resp = make_response("success")
    # 设置cookie, 默认有效期是临时cookie,浏览器关闭就失效
    resp.set_cookie("onion", "Python")
    resp.set_cookie("onion1", "Python1")
    # max_age设置有效期,单位:秒
    resp.set_cookie("onion2", "Python1", max_age=3600)
    resp.headers["Set-Cookie"] = "onion3=Python3; Expires=Sat, 18-Nov-2019 04:36:04 GMT; Max-Age=3600; Path=/"
    return resp


@app.route("/get_cookie")
def get_cookie():
    c = request.cookies.get("onion")
    return c


@app.route("/delete_cookie")
def delete_cookie():
    resp = make_response("del success")
    # 删除cookie
    resp.delete_cookie("onion1")
    return resp


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

 

session

# coding:utf-8

from flask import Flask, session, current_app


app = Flask(__name__)

# flask的session需要用到的秘钥字符串
app.config["SECRET_KEY"] = "dhsodfhisfhosdhf29fy989"


# flask默认把session保存到了cookie中

@app.route("/login")
def login():
    # 设置session数据
    session["name"] = "python"
    session["mobile"] = "18611111111"
    return "login success"


@app.route("/index")
def index():
    # 获取session数据
    name = session.get("name")
    return "hello %s" % name


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

 

请求钩子 

 

在客户端和服务器交互的过程中,有些准备工作或扫尾工作需要处理,比如:在请求开始时,建立数据库连接;在请求结束时,指定数据的交互格式。为了让每个视图函数避免编写重复功能的代码,Flask提供了通用设施的功能,即请求钩子。

请求钩子是通过装饰器的形式实现,Flask支持如下四种请求钩子:

before_first_request:在处理第一个请求前运行。

before_request:在每次请求前运行。

after_request:如果没有未处理的异常抛出,在每次请求后运行

teardown_request:在每次请求后运行,即使有未处理的异常抛出

# coding:utf-8

from flask import Flask, session, current_app, request, url_for


app = Flask(__name__)


@app.route("/index")
def index():
    print("index 被执行")
    a = 1 / 0
    return "index page"


@app.route("/hello")
def hello():
    print("hello 被执行")
    return "hello page"


@app.before_first_request
def handle_before_first_request():
    """在第一次请求处理之前先被执行"""
    print("handle_before_first_request 被执行")


@app.before_request
def handle_before_request():
    """在每次请求之前都被执行"""
    print("handle_before_request 被执行")


@app.after_request
def handle_after_request(response):
    """在每次请求(视图函数处理)之后都被执行, 前提是视图函数没有出现异常"""
    print("handle_after_request 被执行")
    return response


@app.teardown_request
def handle_teardown_request(response):
    """在每次请求 (视图函数处理)之后都被执行, 无论视图函数是否出现异常,都被执行, 工作在非调试模式时 debug=False"""
    path = request.path
    if path == url_for("index"):
        print("在请求钩子中判断请求的视图逻辑: index")
    elif path == url_for("hello"):
        print("在请求钩子中判断请求的视图逻辑: hello")
    print("handle_teardown_request 被执行")
    return response


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

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值