flask 视图

 add_url_ruleapp.route

add_url_rule(rule,endpoint=None,view_func=None)
这个方法用来添加 url 与视图函数的映射。
如果没有填写 endpoint ,那么默认会使用 view_func 的名字作为 endpoint
以后在使用 url_for 的时候,就要看在映射的时候有没有传递 endpoint
数,如果传递了,那么就应该使用 endpoint 指定的字符串,
如果没有传递,那么就应该使用 view_func 的名字。
def my_list():
 return "我是列表页"
app.add_url_rule('/list/',endpoint='whuim',view
_func=my_list)

app.route 原理剖析
这个装饰器底层,也是使用 add_url_rule 来实现 url 与视图函数映射
的。
from flask import Flask,url_for
 app = Flask(__name__) 45 @app.route('/',endpoint='index') 6 def index():
    print(url_for('show'))
    print(url_for('index'))
    return "Hello"


 def show_me():
    return "这个介绍信息!!"

 # endpoint 没有设置,url_for中就写函数的名字,如果
设置了,就写endpoint的值
 app.add_url_rule('/show_me',view_func=show_m
e,endpoint='show')  
 # @app.route 底层就是使用的 add_url_rule


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

类视图

 

 

标准类视图使用步骤
1. 标准类视图,必须继承自 flask.views.View
2. 必须实现 dispatch_request 方法,以后请求过来后,都会执行这个方
法。
这个方法的返回值就相当于是之前的视图函数一样。也必须返回
Response 或者子类的对象,或者是字符串,或者是元组。
3. 必须通过 app.add_url_rule(rule,endpoint,view_func) 来做 url 与视图的映射。
view_func 这个参数,需要使用类视图下的 as_view 类方法类转换:
ListView.as_view('list')
4. 如果指定了 endpoint ,那么在使用 url_for 反转的时候就必须使用
endpoint 指定的那个值。如果没有指定 endpoint ,那么就可以使用
as_view(视图名字) 中指定的视图名字来作为反转。
from flask import Flask,url_for
from flask.views import View
app= Flask(__name__)
@app.route('/')
def index():
    # print(url_for('mylist'))
    print(url_for('my'))
    return 'Hello'
class ListView(View):
    def dispatch_request(self):
        return '返回了一个List的内容!!' #
app.add_url_rule('/list',view_func=ListView.
as_view('mylist'))
app.add_url_rule('/list',endpoint='my',view_
func=ListView.as_view('mylist'))

 # 用于测试
 with app.test_request_context():
    print(url_for('my'))

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

类视图的好处

1. 可以继承,把一些共性的东西抽取出来放到父视图中,子视图直
接拿来用就可以了。
2. 但是也不是说所有的视图都要使用类视图,这个要根据情况而
定。视图函数用得最多

类视图使用场景

 from flask import Flask,render_template
 from flask.views import View 
 app = Flask(__name__) 67 class BaseView(View):
    def __init__(self):
        self.msg = {
            'main':'百战课程又更新了!!123'
       }

 class LoginView(BaseView):
    def dispatch_request(self):
        my_msg = 
'神奇的登录功能'
        self.msg['my_msg'] = '神奇的登录功能'
        # return
render_template('login.html',msg=
self.msg.get('main'),my_msg = my_msg)
        return
render_template('login.html',
**self.msg)
基于调度方法的类视图
class RegisterView(BaseView):
    def dispatch_request(self):
        self.msg['my_msg'] = '快捷的注册功能'
        # return
render_template('register.html',msg=
self.msg.get('main'),my_msg = my_msg)
        return
render_template('register.html',
**self.msg)
app.add_url_rule('/login',view_func=
LoginView.as_view('login'))
app.add_url_rule('/register',view_func=
RegisterView.as_view('register'))
if __name__ == '__main__':
    app.run(debug=True)

基于调度方法的类视图

1. 基于方法的类视图,是根据请求的 method 来执行不同的方法的。
如果用户是发送的 get 请求,那么将会执行这个类的 get 方法。
如果用户发送的是 post 请求,那么将会执行这个类的 post 方法。其他
method 类似,比如 delete put
2. 这种方式,可以让代码更加简洁。所有和 get 请求相关的代码都放
get 方法中,所有和 post 请求相关的代码都放在 post 方法中。就不
需要跟之前的函数一样,通过 request.method == 'GET'

装饰器

简言之, python 装饰器就是用于拓展 原来函数功能 的一种函数,这
函数的特殊之处在于它的返回值也是一个函数
使用 python 装饰器的 好处 就是在不用更改原函数的代码前提下给函
数增加新的功能。
1. 在视图函数中使用自定义装饰器,那么自己定义的装饰器必须放
app.route 下面。
否则这个装饰器就起不到任何作用。
def login_required(func):
    @wraps(func)
    def wrapper(*arg,
**kwargs):
        uname = request.args.get('uname')
        pwd = request.args.get('pwd')
        if uname == 'zs' and pwd == '123':
            logging.info(f'{uname}:登录成功')
            return func(*arg,
**kwargs)
        else:
            logging.info(f'{uname}:尝试登录,
但没成功')
            return '请先登录'
    return wrapper


@app.route('/settings/')
@login_requierd
def settings():    
    return '这是设置界面'

蓝图介绍

Flask 中,使用蓝图 Blueprint 来分模块组织管理。
蓝图实际可以理解为是存储一组视图方法的容器对象,其具有如下
特点:
1.一个应用可以具有多个 Blueprint
2.可以将一个 Blueprint 注册到任何一个未使用的 URL 下比如 “/user” “/goods”
3.Blueprint 可以单独具有自己的模板、静态文件或者其它的通用操作方法,它并不是必须要实现应
用的视图和函数的
4.在一个应用初始化时,就应该要注册需要使用的 Blueprint
根据功能模块

 

根据技术模块

 

蓝图中模版文件
寻找规则
如果项目中的 templates 文件夹中有相应的模版文件,就直接使
用了。
如果项目中的 templates 文件夹中没有相应的模版文件,那么就
到在定义蓝图的时候指定的路径中寻找。
并且蓝图中指定的路径可以为相对路径,相对的是当前这个蓝图文件所在的目录

 

常规:蓝图文件在查找模版文件时,会以templates为根目录进行
查找
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值