<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、智譜、豆包、星火、月之暗面及文生圖、文生視頻 廣告
                ## 一、類視圖 * 發帖功能 ~~~ # url配置 urlpatterns = [ url(r'^post$', views.post), # 顯示發帖界面 url(r'^do_post$', views.do_post), # 執行發帖操作 ] # 視圖 def post(request): """get請求: 顯示發帖界面""" return render(request, 'post.html') def do_post(request): """post請求: 執行發帖操作""" title = request.POST.get('title') content = request.POST.get('content') return HttpResponse('發帖:title=%s, content=%s' % (title, content)) ~~~ * 通過一個URL和視圖同時實現登錄功能的`GET`和`POST`請求(注意:可能還有`PUT``DELETE`等); ~~~ # url配置 urlpatterns = [ url(r'^post$', views.post), # 發帖功能 ] # 視圖 def post(request): """發帖功能""" if request.method == 'GET': # get請求: 顯示發帖界面 return render(request, 'post.html') else: # post請求: 執行發帖操作 title = request.POST.get('title') content = request.POST.get('content') return HttpResponse('發帖:title=%s, content=%s' % (title, content)) ~~~ * **類視圖**實現 * 以函數的方式定義的視圖稱為**函數視圖** * 在Django中還可以通過類來定義一個視圖,稱為**類視圖** * **類視圖**的使用 1. 定義一個類,繼承Django提供的`View`類 ~~~ from django.views.generic import View class PostView(View): def get(self, request): """get請求: 顯示發帖界面""" return render(request, 'post2.html') def post(self, request): """post請求: 執行發帖操作""" # 代碼簡略 return HttpResponse('執行發帖操作') ~~~ 2. 調用類視圖的`as_view()`方法配置url ~~~ urlpatterns = [ ... # 類視圖注冊 url(r'^post2$', views.PostView.as_view()), ] ~~~ * 類視圖優點:**對于函數視圖代碼可讀性和復用性更好** ## 二、類視圖原理 ~~~ @classonlymethod def as_view(cls, **initkwargs): """ Main entry point for a request-response process. """ ...省略代碼... def view(request, *args, **kwargs): self = cls(**initkwargs) if hasattr(self, 'get') and not hasattr(self, 'head'): self.head = self.get self.request = request self.args = args self.kwargs = kwargs # 調用dispatch方法,按照不同請求方式調用不同請求方法 return self.dispatch(request, *args, **kwargs) ...省略代碼... # 返回真正的函數視圖 return view def dispatch(self, request, *args, **kwargs): # Try to dispatch to the right method; if a method doesn't exist, # defer to the error handler. Also defer to the error handler if the # request method isn't on the approved list. if request.method.lower() in self.http_method_names: handler = getattr(self, request.method.lower(), self.http_method_not_allowed) else: handler = self.http_method_not_allowed return handler(request, *args, **kwargs) ~~~ ## 三、類視圖使用裝飾器 ### 1\. 函數視圖使用裝飾器 需求: 實現禁止ip黑名單訪問發帖界面。 解決: 可以通過在視圖函數中使用裝飾器實現,如下 1. **為函數視圖定義一個裝飾器**(在設計裝飾器時,基本都以函數視圖作為考慮的被裝飾對象) ~~~ def check_ip(view_fun): """裝飾器:禁止黑名單ip訪問""" def wrapper(request, *args, **kwargs): # 在視圖函數執行前做額外的操作: # 禁止ip黑名單訪問 IP = request.META.get('REMOTE_ADDR') if IP in ['192.168.210.160']: return HttpResponse('IP禁止訪問') return view_fun(request, *args, **kwargs) return wrapper ~~~ 2. 給視圖函數進行裝飾 ~~~ @check_ip def post(request): """GET請求: 顯示發帖界面""" return render(request, 'post.html') ~~~ **或者:**也可以在URL中,通過方法調用的方式添加裝飾器 ~~~ urlpatterns = [ ... # 發帖功能 url(r'^post$', check_ip(views.post)) ] ~~~ * 問題:代碼可讀性差,只看視圖,不知道它添加了裝飾器 ### 2\. 類視圖中使用裝飾器 **方案一:在路由中添加** ~~~ ```python urlpatterns = [ ... # 發帖功能 url(r'^post2$', check_ip(views.PostView.as_view())) ] ``` ~~~ **方案二:在類視圖中添加** 注意:**不能直接給類視圖的方法添加裝飾器**,需要使用**method\_decorator**將其轉換為適用于類視圖方法的裝飾器。 ~~~ # 方式二 # @method_decorator(check_ip, name='get') # 為特定的請求方法添加 # @method_decorator(check_ip, name='dispatch') # 為所有的請求方法添加 class PostView(View): # 給所有的http方法都添加裝飾器 # @method_decorator(check_ip) def dispatch(self, request, *args, **kwargs): return super().dispatch(request, *args, **kwargs) # 方式一 @method_decorator(check_ip) def get(self, request): """get請求:顯示發帖界面""" return render(request, 'post2.html') def post(self, request): """post請求:執行發帖操作""" # 代碼簡略 return HttpResponse('處理發帖操作') ~~~ **說明: 關于method\_decorator裝飾器作用:**為函數裝飾器補充第一個self參數,以便讓裝飾器能應用到方法中。 ### 3\. 類視圖多繼承 & Mixin擴展類 使用面向對象多繼承的特性,可以通過定義父類(作為擴展類),在父類中定義想要向類視圖補充的方法,類視圖繼承這些擴展父類,便可實現代碼復用。 定義的擴展父類名稱通常以Mixin結尾。 舉例如下: ~~~ class ListModelMixin(object): """ list擴展類 """ def list(self, request, *args, **kwargs): print('查詢多條數據') ... class CreateModelMixin(object): """ create擴展類 """ def create(self, request, *args, **kwargs): print('新增一條數據') ... class DepartmentView(CreateModelMixin, ListModelMixin, View): """ 同時繼承兩個擴展類,復用list和create方法 """ def get(self, request): self.list(request) ... def post(self, request): self.create(request) ... class EmployeeView(CreateModelMixin, View): """ 繼承CreateModelMixin擴展類,復用create方法 """ def post(self, request): self.create(request) ... ~~~
                  <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>

                              哎呀哎呀视频在线观看