zoukankan      html  css  js  c++  java
  • 【Flask】视图高级

    # 视图高级笔记:
    ### `add_url_rule(rule,endpoint=None,view_func=None)`
    这个方法用来添加url与视图函数的映射。如果没有填写`endpoint`,那么默认会使用`view_func`的名字作为`endpoint`。以后在使用`url_for`的时候,就要看在映射的时候有没有传递`endpoint`参数,如果传递了,那么就应该使用`endpoint`指定的字符串,如果没有传递,那么就应该使用`view_func`的名字。

    ### `app.route(rule,**options)`装饰器:
    这个装饰器底层,其实也是使用`add_url_rule`来实现url与视图函数映射的。


    ## 类视图:
    ### 标准类视图:
    1. 标准类视图,必须继承自`flask.views.View`.
    2. 必须实现`dipatch_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(视图名字)`中指定的视图名字来作为反转。
    5. 类视图有以下好处:可以继承,把一些共性的东西抽取出来放到父视图中,子视图直接拿来用就可以了。但是也不是说所有的视图都要使用类视图,这个要根据情况而定。

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

    ### 类视图中的装饰器:
    1. 如果使用的是函数视图,那么自己定义的装饰器必须放在`app.route`下面。否则这个装饰器就起不到任何作用。
    2. 类视图的装饰器,需要重写类视图的一个类属性`decorators`,这个类属性是一个列表或者元组都可以,里面装的就是所有的装饰器。


    ## 蓝图:
    1. 蓝图的作用就是让我们的Flask项目更加模块化,结构更加清晰。可以将相同模块的视图函数放在同一个蓝图下,同一个文件中,方便管理。
    2. 基本语法:
    * 在蓝图文件中导入Blueprint:

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


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

    1 from blueprints.user import user_bp
    2 app.regist_blueprint(user_bp)


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

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


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

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

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


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

    5. 蓝图中静态文件的查找规则:
    * 在模版文件中,加载静态文件,如果使用url_for('static'),那么就只会在app指定的静态文件夹目录下查找静态文件。
    * 如果在加载静态文件的时候,指定的蓝图的名字,比如`news.static`,那么就会到这个蓝图指定的static_folder下查找静态文件。

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

    ### 蓝图实现子域名:
    1. 使用蓝图技术。
    2. 在创建蓝图对象的时候,需要传递一个`subdomain`参数,来指定这个子域名的前缀。例如:`cms_bp = Blueprint('cms',__name__,subdomain='cms')`。
    3. 需要在主app文件中,需要配置app.config的SERVER_NAME参数。例如:
    ```python
    app.config['SERVER_NAME'] = 'jd.com:5000'
    ```
    * ip地址不能有子域名。
    * localhost也不能有子域名。
    4. 在`C:WindowsSystem32driversetc`下,找到hosts文件,然后添加域名与本机的映射。例如:
    ```python
    127.0.0.1 jd.com
    127.0.0.1 cms.jd.com
    ```
    域名和子域名都需要做映射。

  • 相关阅读:
    在springmvc框架中,通过ajax请求,响应至前端的中文显示是?
    在idea中相同的字符串使用equals()进行比较时,返回值是flase问题
    Mybatis入门配置及第一个Mybatis程序
    hibernate入门配置及第一个hibernate程序
    Java中各种对象(PO,BO,VO,DTO,POJO,DAO,Entity,JavaBean,JavaBeans)的区分
    如何让iframe框架和主页面共用一个滚动条(也称为:iframe高度自适应问题)
    使用iframe框架时,实现子页面内跳转到整个页面,而不是在子页面内跳转
    第八篇 .NET高级技术之字符串暂存池(缓冲池)
    第七篇 .NET高级技术之关于相等 Equals
    第六篇 .NET高级技术之拆箱装箱
  • 原文地址:https://www.cnblogs.com/chen0427/p/8605495.html
Copyright © 2011-2022 走看看