<ruby id="bdb3f"></ruby>

    <p id="bdb3f"><cite id="bdb3f"></cite></p>

      <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
        <p id="bdb3f"><cite id="bdb3f"></cite></p>

          <pre id="bdb3f"></pre>
          <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

          <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
          <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

          <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                <ruby id="bdb3f"></ruby>

                ??一站式輕松地調用各大LLM模型接口,支持GPT4、智譜、豆包、星火、月之暗面及文生圖、文生視頻 廣告
                # 38 標準類視圖及其使用場景 ## 類視圖 之前的視圖都是函數,所以一般簡稱為視圖函數。其實視圖也可以基于類來實現,類視圖的好處是支持繼承,但是類視圖不能跟函數視圖一樣,寫完類視圖好需要通過 app.add\_urlrule\(urlrule,view\_func\)。以下將對兩種類視圖進行講解: ## 標準視圖: 標準視圖繼承自flask.views.View,并且在子類中必須實現 dispatch\_request方法,這個方法類似于視圖函數,也要返回一個基于Response或者子類的對象,以下將用一個例子進行講解: ```text class BaseView(views.View): # 自定義方法,用來獲取模板路徑 def get_template_name(self): raise NotImplementedError() # 必須實現的方法,用來處理請求的 def dispatch_request(self): if request.method != 'GET': return 'method error' # 這想從self.get_data()中獲取函數,子類應該實現這個方法 context = {'data':self.get_data()} return render_template(self.get_template_name(),**context) class UserView(BaseView): # 實現從父類繼承的獲取模板路徑的方法 def get_template_name(self): return 'user.html' # 重寫獲取函數的方法 def get_data(self): return [{ 'username':'false', 'avatar':'http://www.baidu.com', }] # 類視圖通過add_url_rule方法和url做映射 app.add_url_rule('/users/',view_func=UserView.as_view('userview')) ``` ## 基于調度方法的視圖: Flask提供了另外一種類視圖flask.views.MethodView,對每個HTTP方法執行不同的函數\(映射到對應的方法的小寫的同名方法上\),還對 RESTful API尤其有用,例子: ```text class UserAPI(views.MethodView): #客戶端通過get方法進行訪問的時候執行的函數、 def get(self): return jsonify({ 'username':'angle', 'avator':'http://www.baidu.com', }) # 當客戶端通過post方法進行訪問的時候執行的函數 def post(self): return 'UNSUPPORTED' # 通過add_url_rule添加類視圖和url的映射,并且在as_view方法中指定該url的名稱,方便url_for函數調用 app.add_url_rule('/myuser/',view_func=UserAPI.as_view('userapiview')) ``` 用類視圖的一個缺陷就是比較難用裝飾器來裝飾,比如有時候需要做權限驗證的時候,比如: ```text def user_required(f) def decorator(*args,**kwargs): if not g.user: return 'auth failure' return f(*args,**kwargs) return decorator ``` 如果要在類視圖上進行裝飾,只能在as\_view函數上進行裝飾了,使用方式: ```text view = user_required(UserAPI.as_view('users')) app.add_url_rule('/users/',views_func=view) ``` 從flask 0.8 開始,還可以通過在類中添加decorators屬性來實現對視圖的裝飾: ```text class UserAPI(views.MethodView): decorator = [user_required] .... ``` ## 標準類視圖 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. 類視圖有以下好處:可以繼承,把一些共性的東西抽取出來放到父視圖中,子視圖直接拿來使用就可以了,但是也不是說所有的視圖都要使用類視圖,這個要根據情況而定 ```text # 必須繼承自views class ListView(views.View): def dispatch_request(self): return "list view" # 類.as_view(name) 返回一個函數,name:視圖名 # endpoint沒指定,就是用view_func名 app.add_url_rule('/list/',endpoint='list',view_func=ListView.as_view('list')) ``` ![](https://box.kancloud.cn/e56305ed219c6995cc9d079b75184a90_353x191.png) ```text # 有幾個url需要返回json數據,“需要用jsonify” class JSONView(views.View): def get_data(self): raise NotImplementedError def dispatch_request(self): return jsonify(self.get_data()) # #將視圖函數中返回的字典,轉換成json對象,然后返回 # class JSONResponse(Response): # # @classmethod # def force_type(cls, response, environ=None): # """ # 這個方法只有視圖函數返回非字符,非元組,非Response對象才會調用 # :param response: # :param environ: # :return: # response,視圖函數的返回值 # """ # print(response) # if isinstance(response,dict): # # 轉換 # response = jsonify(response) # return super(JSONResponse,cls).force_type(response,environ) # 添加response類,一定要添加 # app.response_class = JSONResponse # 必須繼承自views class ListView(JSONView): def get_data(self): return {"username":"angle"} ``` ![](https://box.kancloud.cn/e3b4ed4894886e188cf4ff12e271cb0d_258x247.png) ```text class ADSView(views.View): def __init__(self): super(ADSView,self).__init__() self.context = { 'ads':"廣告" } # 提取共同變量 class LoginView(ADSView): def dispatch_request(self): self.context.update({ 'username':'login', }) return render_template('login.html',**self.context) class RegistView(ADSView): def dispatch_request(self): return render_template('regist.html',**self.context) ``` ![](https://box.kancloud.cn/78770681546efae8e0f191dff44506dc_353x232.png)
                  <ruby id="bdb3f"></ruby>

                  <p id="bdb3f"><cite id="bdb3f"></cite></p>

                    <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
                      <p id="bdb3f"><cite id="bdb3f"></cite></p>

                        <pre id="bdb3f"></pre>
                        <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

                        <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
                        <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

                        <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                              <ruby id="bdb3f"></ruby>

                              哎呀哎呀视频在线观看