flask学习笔记(十一) 高级视图

欢迎加入知了课堂,学习flask

Python Flask系列(1)——基础:http://study.163.com/course/courseMain.htm?courseId=1004091002

Python Flask框架——全栈开发: http://study.163.com/course/courseMain.htm?courseId=1004507006




先简单介绍一下,使用类似python的一大特点。flask使用类视图可以完成像函数视图一样的处理。当然使用类的好处不止这点,类可以继承,把一些共性的东西抽取出来放到父视图中,子视图直接拿来用就可以了。但是也不是说所有的视图都要使用类视图,这个要根据情况而定。

蓝图的作用就是让我们的Flask项目更加模块化,结构更加清晰。可以将相同模块的视图函数(或者类视图)放在同一个蓝图下(也就是同一个文件中),方便管理。

装饰器可以将被装饰的函数,添加一些额外的处理。当然类也可以被装饰,后面我们会介绍各种的用法。



一、类视图

想搞明白类视图是如何被定义和使用的,先要搞明白URL映射。这个之前用过,是通过 `app.route(rule,**options)`装饰器,将视图函数映射成指定的路由,例如,

@app.route('/',endpoint='index')
def hello_world():
print(url_for('index'))
return 'Hello World!'

endpoint='xxx' 是给下面的hello_world()函数取个外号,以后在使用`url_for`的时候,就应该使用`endpoint`指定的字符串,如果没有指定这个参数,那么就应该使用下面的函数名 ‘hello_world’。

还用另外一种添加url与视图函数的映射的方法,也是接下来我们要用的,通过`add_url_rule(rule,endpoint=None,view_func=None)`,例如,

app.add_url_rule('/',endpoint='index',view_func=hello_world)

两种方法是一样的!


如何实现定义、与url映射一个标准的类视图?遵循以下规则:

1. 标准类视图,必须继承自`flask.views.View`.

2. 必须实现`dipatch_request`方法,以后请求过来后,都会执行这个方法。这个方法的返回值就相当于是之前的函数视图一样。

3. 必须通过`app.add_url_rule(rule,endpoint,view_func)`来做url与视图的映射。`view_func`这个参数,需要使用类视图下的`as_view`类方法类转换:

4. 如果指定了`endpoint`,那么在使用`url_for`反转的时候就必须使用`endpoint`指定的那个值。如果没有指定`endpoint`,那么就可以使用`as_view(视图名字)`中指定的视图名字来作为反转。


例如,定义一个类视图

from flask import views
class RegistView(views.View):
def dispatch_request(self):
return 'hello world'

将类视图与url映射,这样就可以通过url访问这个类视图了

app.add_url_rule('/regist/',view_func=RegistView.as_view('regist'))

实现url_for 类视图反转

url_for('regist')


基于请求方法的类视图,在类视图中使用方法get、post等

例如,

class RegistView(views.MethodView):
def get(self):
return 'hello'
def post(self):
return 'post'
get方法 等价于 request.method == 'GET',
post方法 等价于 request.method == 'POST'


二、装饰器
默认我们已经写好一个装饰器 login_required ,如果要在函数视图中实现,例如
@app.route('/settings/')
@login_required
def settings():
return '这是设置界面'
等价于 app.route('/settings/')( login_required(settings) ) ,相当于函数settings先
login_required装饰,实现功能。返回结果再被app.route装饰,完成映射


类视图的装饰器,需要重写类视图的一个类属性`decorators`,这个类属性是一个列表
或者元组都可以,里面装的就是所有的装饰器。例如,
class ProfileView(views.View):
decorators = [login_required]
def dispatch_request(self):
return '这是个人中心界面'

三、蓝图

蓝图的作用就是让我们的Flask项目更加模块化,结构更加清晰。可以将相同模块的视图函数放在同一个蓝图下,同一个文件中,方便管理。

1. 基本语法:

    * 在蓝图文件中导入Blueprint:

from flask import Blueprint
user_bp = Blueprint('user',__name__)

    * 在主app文件中注册蓝图:

from blueprints.user import user_bp
app.register_blueprint(user_bp)

2. 如果想要某个蓝图下的所有url都有一个url前缀,那么可以在定义蓝图的时候,指定url_prefix参数:

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

PS:在定义url_prefix的时候,要注意后面的斜杠,如果给了,那么以后在定义url与视图函数的时候,就不要再在url前面加斜杠了。


3. 蓝图模版文件的查找:

    * 如果项目中的templates文件夹中有相应的模版文件,就直接使用了。

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

news_bp = Blueprint( 'news', __name__, url_prefix='/news', template_folder='my_temp' )

        因为这个蓝图文件是在blueprints/news.py,那么就会到blueprints这个文件夹下的zhiliao文件夹中寻找模版文件。


4. 蓝图中静态文件的查找规则:

    * 在模版文件中,加载静态文件,如果使用url_for('static'),那么就只会在app指定的静态文件夹目录下查找静态文件。

    * 如果在加载静态文件的时候,指定的蓝图的名字,比如`news.static`,那么就会到这个蓝图指定的static_folder下查找静态文件。

模板文件:

<link rel="stylesheet" href="{{ url_for('news.static',
filename='news_list.css') }}">

蓝图文件:

news_bp = Blueprint('news',__name__,url_prefix='/news',
template_folder='zhiliao',static_folder='my_temp')

5. url_for反转蓝图中的视图函数为url:

    * 如果使用蓝图,那么以后想要反转蓝图中的视图函数为url,那么就应该在使用url_for的时候指定这个蓝图。比如`news.news_list`。否则就找不到这个endpoint。在模版中的url_for同样也是要满足这个条件,就是指定蓝图的名字。

    * 即使在同一个蓝图中反转视图函数,也要指定蓝图的名字。

url_for('news.news_detail')


四、总结



欢迎加入知了课堂,学习flask

Python Flask系列(1)——基础:http://study.163.com/course/courseMain.htm?courseId=1004091002

Python Flask框架——全栈开发: http://study.163.com/course/courseMain.htm?courseId=1004507006


你可能感兴趣的:(技术实现-学习&培训&整理)