【Flask】视图高级
# 視圖高級(jí)筆記:
### `add_url_rule(rule,endpoint=None,view_func=None)`
這個(gè)方法用來添加url與視圖函數(shù)的映射。如果沒有填寫`endpoint`,那么默認(rèn)會(huì)使用`view_func`的名字作為`endpoint`。以后在使用`url_for`的時(shí)候,就要看在映射的時(shí)候有沒有傳遞`endpoint`參數(shù),如果傳遞了,那么就應(yīng)該使用`endpoint`指定的字符串,如果沒有傳遞,那么就應(yīng)該使用`view_func`的名字。
### `app.route(rule,**options)`裝飾器:
這個(gè)裝飾器底層,其實(shí)也是使用`add_url_rule`來實(shí)現(xiàn)url與視圖函數(shù)映射的。
## 類視圖:
### 標(biāo)準(zhǔn)類視圖:
1. 標(biāo)準(zhǔn)類視圖,必須繼承自`flask.views.View`.
2. 必須實(shí)現(xiàn)`dipatch_request`方法,以后請求過來后,都會(huì)執(zhí)行這個(gè)方法。這個(gè)方法的返回值就相當(dāng)于是之前的函數(shù)視圖一樣。也必須返回`Response`或者子類的對(duì)象,或者是字符串,或者是元組。
3. 必須通過`app.add_url_rule(rule,endpoint,view_func)`來做url與視圖的映射。`view_func`這個(gè)參數(shù),需要使用類視圖下的`as_view`類方法類轉(zhuǎn)換:`ListView.as_view('list')`。
4. 如果指定了`endpoint`,那么在使用`url_for`反轉(zhuǎn)的時(shí)候就必須使用`endpoint`指定的那個(gè)值。如果沒有指定`endpoint`,那么就可以使用`as_view(視圖名字)`中指定的視圖名字來作為反轉(zhuǎn)。
5. 類視圖有以下好處:可以繼承,把一些共性的東西抽取出來放到父視圖中,子視圖直接拿來用就可以了。但是也不是說所有的視圖都要使用類視圖,這個(gè)要根據(jù)情況而定。
### 基于請求方法的類視圖:
1. 基于方法的類視圖,是根據(jù)請求的`method`來執(zhí)行不同的方法的。如果用戶是發(fā)送的`get`請求,那么將會(huì)執(zhí)行這個(gè)類的`get`方法。如果用戶發(fā)送的是`post`請求,那么將會(huì)執(zhí)行這個(gè)類的`post`方法。其他的method類似,比如`delete`、`put`。
2. 這種方式,可以讓代碼更加簡潔。所有和`get`請求相關(guān)的代碼都放在`get`方法中,所有和`post`請求相關(guān)的代碼都放在`post`方法中。就不需要跟之前的函數(shù)一樣,通過`request.method == 'GET'`。
### 類視圖中的裝飾器:
1. 如果使用的是函數(shù)視圖,那么自己定義的裝飾器必須放在`app.route`下面。否則這個(gè)裝飾器就起不到任何作用。
2. 類視圖的裝飾器,需要重寫類視圖的一個(gè)類屬性`decorators`,這個(gè)類屬性是一個(gè)列表或者元組都可以,里面裝的就是所有的裝飾器。
## 藍(lán)圖:
1. 藍(lán)圖的作用就是讓我們的Flask項(xiàng)目更加模塊化,結(jié)構(gòu)更加清晰。可以將相同模塊的視圖函數(shù)放在同一個(gè)藍(lán)圖下,同一個(gè)文件中,方便管理。
2. 基本語法:
* 在藍(lán)圖文件中導(dǎo)入Blueprint:
1 from flask import Blueprint 2 user_bp = Blueprint('user',__name__)
?
* 在主app文件中注冊藍(lán)圖:
1 from blueprints.user import user_bp 2 app.regist_blueprint(user_bp)
?
3. 如果想要某個(gè)藍(lán)圖下的所有url都有一個(gè)url前綴,那么可以在定義藍(lán)圖的時(shí)候,指定url_prefix參數(shù):
1 user_bp = Blueprint('user',__name__,url_prefix='/user/')
?
在定義url_prefix的時(shí)候,要注意后面的斜杠,如果給了,那么以后在定義url與視圖函數(shù)的時(shí)候,就不要再在url前面加斜杠了。
4. 藍(lán)圖模版文件的查找:
* 如果項(xiàng)目中的templates文件夾中有相應(yīng)的模版文件,就直接使用了。
* 如果項(xiàng)目中的templates文件夾中沒有相應(yīng)的模版文件,那么就到在定義藍(lán)圖的時(shí)候指定的路徑中尋找。并且藍(lán)圖中指定的路徑可以為相對(duì)路徑,相對(duì)的是當(dāng)前這個(gè)藍(lán)圖文件所在的目錄。比如:
1 news_bp = Blueprint('news',__name__,url_prefix='/news',template_folder='saber')
?
因?yàn)檫@個(gè)藍(lán)圖文件是在blueprints/news.py,那么就會(huì)到blueprints這個(gè)文件夾下的 saber 文件夾中尋找模版文件。
5. 藍(lán)圖中靜態(tài)文件的查找規(guī)則:
* 在模版文件中,加載靜態(tài)文件,如果使用url_for('static'),那么就只會(huì)在app指定的靜態(tài)文件夾目錄下查找靜態(tài)文件。
* 如果在加載靜態(tài)文件的時(shí)候,指定的藍(lán)圖的名字,比如`news.static`,那么就會(huì)到這個(gè)藍(lán)圖指定的static_folder下查找靜態(tài)文件。
6. url_for反轉(zhuǎn)藍(lán)圖中的視圖函數(shù)為url:
* 如果使用藍(lán)圖,那么以后想要反轉(zhuǎn)藍(lán)圖中的視圖函數(shù)為url,那么就應(yīng)該在使用url_for的時(shí)候指定這個(gè)藍(lán)圖。比如`news.news_list`。否則就找不到這個(gè)endpoint。在模版中的url_for同樣也是要滿足這個(gè)條件,就是指定藍(lán)圖的名字。
* 即使在同一個(gè)藍(lán)圖中反轉(zhuǎn)視圖函數(shù),也要指定藍(lán)圖的名字。
### 藍(lán)圖實(shí)現(xiàn)子域名:
1. 使用藍(lán)圖技術(shù)。
2. 在創(chuàng)建藍(lán)圖對(duì)象的時(shí)候,需要傳遞一個(gè)`subdomain`參數(shù),來指定這個(gè)子域名的前綴。例如:`cms_bp = Blueprint('cms',__name__,subdomain='cms')`。
3. 需要在主app文件中,需要配置app.config的SERVER_NAME參數(shù)。例如:
```python
app.config['SERVER_NAME'] = 'jd.com:5000'
```
* ip地址不能有子域名。
* localhost也不能有子域名。
4. 在`C:\Windows\System32\drivers\etc`下,找到hosts文件,然后添加域名與本機(jī)的映射。例如:
```python
127.0.0.1 jd.com
127.0.0.1 cms.jd.com
```
域名和子域名都需要做映射。
?
轉(zhuǎn)載于:https://www.cnblogs.com/chen0427/p/8605495.html
總結(jié)
以上是生活随笔為你收集整理的【Flask】视图高级的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 催呀催呀粤语是什么歌?
- 下一篇: 利用jdt快速实现pmd的功能