欢迎加入知了课堂,学习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