<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>

                合規國際互聯網加速 OSASE為企業客戶提供高速穩定SD-WAN國際加速解決方案。 廣告
                ### 導航 - [索引](# "總目錄") - [下一頁](# "應用上下文") | - [上一頁](# "信號") | - [Flask 0.10.1 文檔](#) ? # 即插視圖 0.7 新版功能. Flask 0.7 引入了即插視圖,靈感來自 Django 的基于類而不是函數的通用視圖。其主要目的是讓你可以對已實現的部分進行替換,并且這個方式可以定制即插視圖。 ### 基本原則 想象你有一個從數據庫載入一個對象列表并渲染到視圖的函數: ~~~ @app.route('/users/') def show_users(page): users = User.query.all() return render_template('users.html', users=users) ~~~ 這是簡單而靈活的,但如果你想要用一種通用的,同樣可以適應其它模型和模板的方式來提供這個視圖,你會需要更大的靈活性。這就是基于類的即插視圖所做的。第一步,把它轉換為基于類的視圖,你要這樣做: ~~~ from flask.views import View class ShowUsers(View): def dispatch_request(self): users = User.query.all() return render_template('users.html', objects=users) app.add_url_rule('/users/', ShowUsers.as_view('show_users')) ~~~ 如你所見,你需要做的是創建一個 [flask.views.View](# "flask.views.View") 的子類,并且實現 [dispatch_request()](# "flask.views.View.dispatch_request") 。然后我們需要用類方法[as_view()](# "flask.views.View.as_view") 把這個類轉換到一個實際的視圖函數。你傳給這個函數的字符串是視圖之后的最終名稱。但是用它自己實現的方法不夠有效,所以我們稍微重構一下代碼: ~~~ from flask.views import View class ListView(View): def get_template_name(self): raise NotImplementedError() def render_template(self, context): return render_template(self.get_template_name(), **context) def dispatch_request(self): context = {'objects': self.get_objects()} return self.render_template(context) class UserView(ListView): def get_template_name(self): return 'users.html' def get_objects(self): return User.query.all() ~~~ 這當然不是那么有助于一個小例子,但是對于解釋基本原則已經很有用了。當你有一個基于類的視圖,那么問題來了, self 指向什么。它工作的方式是,無論何時請求被調度,會創建這個類的一個新實例,并且[dispatch_request()](# "flask.views.View.dispatch_request") 方法會以 URL 規則為參數調用。這個類本身會用傳遞到 [as_view()](# "flask.views.View.as_view") 函數的參數來實例化。比如,你可以像這樣寫一個類: ~~~ class RenderTemplateView(View): def __init__(self, template_name): self.template_name = template_name def dispatch_request(self): return render_template(self.template_name) ~~~ 然后你可以這樣注冊它::And then you can register it like this: ~~~ app.add_url_rule('/about', view_func=RenderTemplateView.as_view( 'about_page', template_name='about.html')) ~~~ ### 方法提示 即插視圖可以像常規函數一樣用 [route()](# "flask.Flask.route") 或更好的[add_url_rule()](# "flask.Flask.add_url_rule") 附加到應用中。然而當你附加它時,你必須提供 HTTP 方法的名稱。為了將這個信息加入到類中,你可以提供[methods](# "flask.views.View.methods") 屬性來承載它: ~~~ class MyView(View): methods = ['GET', 'POST'] def dispatch_request(self): if request.method == 'POST': ... ... app.add_url_rule('/myview', view_func=MyView.as_view('myview')) ~~~ ### 基于調度的方法 對每個 HTTP 方法執行不同的函數,對 RESTful API 非常有用。你可以通過[flask.views.MethodView](# "flask.views.MethodView") 容易地實現。每個 HTTP 方法映射到同名函數(只有名稱為小寫的): ~~~ from flask.views import MethodView class UserAPI(MethodView): def get(self): users = User.query.all() ... def post(self): user = User.from_form_data(request.form) ... app.add_url_rule('/users/', view_func=UserAPI.as_view('users')) ~~~ 如此,你可以不提供 [methods](# "flask.views.View.methods") 屬性。它會自動的按照類中定義的方法來設置。 ### 裝飾視圖 既然視圖類自己不是加入到路由系統的視圖函數,那么裝飾視圖類并沒有多大意義。相反的,你可以手動裝飾 [as_view()](# "flask.views.View.as_view") 的返回值: ~~~ def user_required(f): """Checks whether user is logged in or raises error 401.""" def decorator(*args, **kwargs): if not g.user: abort(401) return f(*args, **kwargs) return decorator view = user_required(UserAPI.as_view('users')) app.add_url_rule('/users/', view_func=view) ~~~ 從 Flask 0.8 開始,你也有一種在類聲明中設定一個裝飾器列表的方法: ~~~ class UserAPI(MethodView): decorators = [user_required] ~~~ 因為從調用者的視角來看 self 是不明確的,所以你不能在單獨的視圖方法上使用常規的視圖裝飾器,請記住這些。 ### 用于 API 的方法視圖 Web API 的工作通常與 HTTP 動詞緊密相關,所以這使得實現這樣一個基于[MethodView](# "flask.views.MethodView") 類的 API 很有意義。也就是說,你會注意到大多數時候, API 需要不同的 URL 規則來訪問相同的方法視圖。譬如,想象一種情況,你在 web 上暴露一個用戶對象: | URL | HTTP 方法 | 描述 | |-----|-----|-----| | /users/ | GET | 獲得全部用戶的列表 | | /users/ | POST | 創建一個新用戶 | | /users/<id> | GET | 顯示某個用戶 | | /users/<id> | PUT | 更新某個用戶 | | /users/<id> | DELETE | 刪除某個用戶 | 那么,你會想用 [MethodView](# "flask.views.MethodView") 做什么?訣竅是利用你可以對相同的視圖提供多個規則的事實。 讓我們假設這時視圖看起來是這個樣子: ~~~ class UserAPI(MethodView): def get(self, user_id): if user_id is None: # return a list of users pass else: # expose a single user pass def post(self): # create a new user pass def delete(self, user_id): # delete a single user pass def put(self, user_id): # update a single user pass ~~~ 如此,我們怎樣把它掛載到路由系統中?添加兩條規則,并且為每條規則顯式地指出 HTTP 方法: ~~~ user_view = UserAPI.as_view('user_api') app.add_url_rule('/users/', defaults={'user_id': None}, view_func=user_view, methods=['GET',]) app.add_url_rule('/users/', view_func=user_view, methods=['POST',]) app.add_url_rule('/users/<int:user_id>', view_func=user_view, methods=['GET', 'PUT', 'DELETE']) ~~~ 如果你有許多看起來類似的 API ,你可以重構上述的注冊代碼: ~~~ def register_api(view, endpoint, url, pk='id', pk_type='int'): view_func = view.as_view(endpoint) app.add_url_rule(url, defaults={pk: None}, view_func=view_func, methods=['GET',]) app.add_url_rule(url, view_func=view_func, methods=['POST',]) app.add_url_rule('%s<%s:%s>' % (url, pk_type, pk), view_func=view_func, methods=['GET', 'PUT', 'DELETE']) register_api(UserAPI, 'user_api', '/users/', pk='user_id') ~~~ ? 版權所有 2013, Armin Ronacher.
                  <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>

                              哎呀哎呀视频在线观看