【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:\Windows\System32\drivers\etc`下,找到hosts文件,然后添加域名與本機的映射。例如:
```python
127.0.0.1 jd.com
127.0.0.1 cms.jd.com
```
域名和子域名都需要做映射。
?
轉載于:https://www.cnblogs.com/chen0427/p/8605495.html
總結
以上是生活随笔為你收集整理的【Flask】视图高级的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 催呀催呀粤语是什么歌?
- 下一篇: 利用jdt快速实现pmd的功能