Flask 第三章 高级视图

add_url_rule与app.route

add_url_rule

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='list',view_func=my_list)

app.route原理剖析

这个装饰器底层,其实也是使用 add_url_rule 来实现url与视图函数映射的。

类视图

.之前我们接触的视图都是函数,所以一般简称函数视图。其实视图也可以基于类来实现,类视图的好处是支持继承,但是类视图不能跟函数视图一样,写完类视图还需要通过
app.add_url_rule(url_rule,view_func) 来进行注册.

标准类视图使用步骤

  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(视图名字) 中指定的视图名字来作为反转。

类视图的好处

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

类视图使用场景

基类中使用相同的类变量.

基于调度方法的类视图

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

装饰器

python装饰器就是用于拓展原来函数功能的一种函数,这个函数的特殊之处在于它的返回值也是一个函数,使用python装饰器的好处就是在不用更改原函数的代码前提下给函
数增加新的功能。

1.在视图函数中使用自定义装饰器,那么自己定义的装饰器必须放在 app.route 下面。
否则这个装饰器就起不到任何作用。
在这里插入图片描述
2… 在类视图中使用装饰器,需要重写类视图的一个类属性 decorators ,这个类属性是一个列表或者元组都可以,里面装的就是所有的装饰器。
需求: 查看设置个人信息时,只有检测到用户已经登录了才能查看,若没有登录,则无法查看并给出提示信息
在这里插入图片描述

蓝图

在Flask中,使用蓝图Blueprint来分模块组织管理。蓝图实际可以理解为是存储一组视图方法的容器对象,其具有如下特点:

1.一个应用可以具有多个Blueprint;
2.可以将一个Blueprint注册到任何一个未使用的URL下比如 “/user” 、 “/goods”
3.Blueprint可以单独具有自己的模板、静态文件或者其它的通用操作方法,它并不是必须要实现应用的视图和函数的
4.在一个应用初始化时,就应该要注册需要使用的Blueprin

Blueprint并不是一个完整的应用,它不能独立于应用运行,而必须要注册到某一个应用中.

使用方式

在这里插入图片描述

指定蓝图的url前缀

在应用中注册蓝图时使用 url_prefix 参数指定

app.register_blueprint(user_bp,url_prefix='/user')
app.register_blueprint(goods_bp,url_prefix='/goods')

蓝图的目录结构

为了让项目代码更加清晰,可以通过将代码分在不同的文件里进行
管理.

根据功能模块

对于一个打算包含多个文件的蓝图,通常将创建蓝图对象放到Python包的 init.py 文件中

在这里插入图片描述

根据技术模块

在这里插入图片描述

# main.py
from flask import Flask
import logging

app = Flask(__name__)

# 日志调试
logging.basicConfig(level=logging.INFO)

@app.route('/')
def index():
    logging.info('输出了Hello!!')
    return 'Hello'
from user import user
app.register_blueprint(user)

if __name__ =='__main__':
    app.run(debug=True)
    
    
# __init__.py
from flask.blueprints import Blueprint
user = Blueprint('user', __name__)
## 这里需要放在后面
from user import view

# view.py
from user import user
@user.route('/user')
def index():
    return '用户模板'

蓝图中模版文件

寻找规则

user_bp =Blueprint('user',__name__,url_prefix='/user',template_folder='user_page')

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

在这里插入图片描述
因为这个蓝图文件是在user/view.py,那么就会到blueprints这个文件夹下的user_page文件夹中寻找模版文件。

蓝图中静态文件

蓝图对象创建时不会默认注册静态目录的路由。需要我们在创建时指定 static_folder 参数。
下面的示例将蓝图所在目录下的 user_static 目录设置为静态目录:

user=Blueprint("user",__name__,static_folder='user_static')
app.register_blueprint(user,url_prefix='/user')
<body>
    <h1>模板静态文件</h1>
    <video src="/user/user_static/aaa.mp4"autoplay width="50%" loop="loop" muted='muted'></video>
</body>

也可通过 static_url_path 改变访问路径:

user =Blueprint('user',__name__,template_folder='user_page',static_folder='user_static',static_url_path='/static')
app.register_blueprint(user,url_prefix='/user')
<body>
    <h1>模板静态文件</h1>
    <video src="/user/static/aaa.mp4" autoplay width="50%" loop="loop"muted='muted'></video>
</body>

蓝图url_for函数

如果使用蓝图,那么以后想要反转蓝图中的视图函数为url,就应该在使用url_for的时候指定这个蓝图名字。
app类中、模版中、同一个蓝图类中都是如此。否则就找不到这个endpoint

<a href="{{ url_for('user.user_list')}}">新闻列表 OK写法</a>
from flask import Blueprint,render_template,url_for

user_bp=Blueprint('news',__name__,url_prefix='/user',template_folder='user_page',static_folder='user_static')

@user_bp.route('/list/')
def user_list():    
    #如下写法:才找得到 url_for('蓝图名称.方法名')
	print(url_for('user.user_list'))#/user/list/    
    print(url_for('user.user_detail'))
	#/user/detail/    
    return render_template('user_list.html')
@user_bp.route('/detail/')
def user_detail():    
    return '用户详情页面'

子域名实现

在创建蓝图对象的时候,需要传递一个 subdomain 参数,来指定这个子域名的前缀
在windows: C:\Windows\System32\drivers\etc 下,找到hosts文件,然后添加域名与本机的映射。Linux: /etc/hosts

cms_bp=Blueprint('cms',__name__,subdomain='cms')

需要在主app文件中,需要配置app.config的SERVER_NAME参数。例如:

 app.config['SERVER_NAME']='xtg.com:5000']
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值