乡下人产国偷v产偷v自拍,国产午夜片在线观看,婷婷成人亚洲综合国产麻豆,久久综合给合久久狠狠狠9

  • <output id="e9wm2"></output>
    <s id="e9wm2"><nobr id="e9wm2"><ins id="e9wm2"></ins></nobr></s>

    • 分享

      【Python之路】第二十三篇

       highoo 2019-03-20
      文件配置

      1.模版Templates文件配置:

      TEMPLATE_DIRS = (
              os.path.join(BASE_DIR,'templates'),
          )

      2.靜態(tài)文件static配置:

      STATICFILES_DIRS = (
              os.path.join(BASE_DIR,'static'),
          )

      報錯 

      doesn't declare an explicit app_label and isn't in an application in INSTALLED_APPS\

      這個問題出現(xiàn)沒有在setting INSTALLED_APPS  添加項目名稱引起

      Q搜索示例

      1.利用Q的特性,設計多條件搜索。

      demo

      前端HTML頁面
      后端

      注意:

      1.后端得到數(shù)據(jù)返回給前端ajax時,需要序列化操作,將字符串返回給前端。

      2.序列化操作時,注意json默認只能轉換字典,列表,元組等對象,如果為時間,小數(shù)等對象,需要自定義擴展轉換成字符串。

      3.表單提交中的url地址,末尾需要帶上/。  如(action="/form1/")

      序列化

      1、serializers

      1
      2
      3
      4
      5
      from django.core import serializers
      ret = models.BookType.objects.all()
        
      data = serializers.serialize("json", ret)

      2、json.dumps

      1
      2
      3
      4
      5
      6
      7
      8
      import json
        
      #ret = models.BookType.objects.all().values('caption')
      ret = models.BookType.objects.all().values_list('caption')
        
      ret=list(ret)
        
      result = json.dumps(ret)

      由于json.dumps時無法處理datetime日期,所以可以通過自定義處理器來做擴展,如:

      View Code
      Form

      Django中的Form一般有兩種功能、用途:

      • 生成標簽,輸入html

      • 驗證用戶輸入

      1. 后端創(chuàng)建input標簽,輸入html,瀏覽器不同,表現(xiàn)不同,步驟如下:

      后端定義Form類型
      后端生成Form
      前端輸出Form

      生成的標簽,可以設置屬性值:

      復制代碼
      user_type_choice = (
              (0, u'普通用戶'),
              (1, u'高級用戶'),
          )
      user_type = forms.IntegerField(widget=forms.widgets.Select(choices=user_type_choice,attrs={'class': "form-control"}))
      
      title = forms.CharField(widget=forms.TextInput(attrs={'class': "form-control",'placeholder': u'標題5-20個字符'}))
      
      memo = forms.CharField(widget=forms.widgets.Textarea(attrs={'class': "form-control no-radius", 'placeholder': u'詳細描述', 'rows': 3}))
      復制代碼
      View Code

      注意:

      1.類里靜態(tài)字段 只在第一遍執(zhí)行!, 如果動態(tài)綁定了數(shù)據(jù),生成后就不再修改了!

      復制代碼
      class Form1(forms.Form):
          def __init__(self,*args, **kwargs):
              super(Form1, self).__init__(*args, **kwargs)
      
              self.fields['book_type'] =  forms.CharField(
                  widget=forms.widgets.Select(choices=models.BookType.objects.values_list('id','caption'),attrs={'class': "form-control"}))
      復制代碼
      完整demo

      2. 驗證用戶輸入

      依據(jù)自定義的Form類,進行判斷用戶輸入是否合法

      自定義靜態(tài)字段:

      復制代碼
      class Form1(forms.Form):
          user = forms.CharField( required=True
                                  max_length=20,
                                  min_length=5,
                                  error_messages={'required': u'標題不能為空',
                                                 'min_length': u'標題最少為5個字符',
                                                 'max_length': u'標題最多為20個字符',
                                                 'invalid': u'標題格式錯誤'},
                                  ) 
      復制代碼

      自定義正則規(guī)則:

      復制代碼
      from django import forms
      import re
      from django.core.exceptions import ValidationError
      
      def mobile_validate(value):
          mobile_re = re.compile(r'^(13[0-9]|15[012356789]|17[678]|18[0-9]|14[57])[0-9]{8}$')
          if not mobile_re.match(value):
              raise ValidationError('手機號碼格式錯誤')
      
      class Form1(forms.Form):
          phonenum= forms.CharField( validators=[mobile_validate, ],
                                  )
      復制代碼

      后端驗證方法: (需要傳入request.POST)

      復制代碼
      from app01.forms import Form1
      
      def form1(request):
          if request.method == 'POST':
              # 獲取請求內(nèi)容,做驗證
              f = Form1(request.POST)
              if f.is_valid():
                  print(f.cleaned_data)
              else:
                  # print(f.errors.get('user',None))
                  # print(f.errors['pwd'][0])
                  # print(type(f.errors),f.errors)return render(request, 'account/form1.html',{'error': f.errors,'form':f})
          else:
              f = Form1()
              return render(request, 'account/form1.html',{'form':f})
      復制代碼
      Cookie

      1、獲取Cookie:

      1
      2
      3
      4
      5
      6
      7
      8
      # 普通Cookie
      request.COOKIES['key']<br>
      # 加密Cookie
      request.get_signed_cookie(key, default=RAISE_ERROR, salt='', max_age=None)
          參數(shù):
              default: 默認值
                 salt: 加密鹽 (獲取Cookie解密時,需要寫上,否則獲取得值為None )
              max_age: 后臺控制過期時間

      2、設置Cookie:

      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      11
      12
      13
      rep = HttpResponse(...) 或 rep = render(request, ...)
        
      rep.set_cookie(key,value,...)
      rep.set_signed_cookie(key,value,salt='加密鹽',...)
          參數(shù):
              key,              鍵
              value='',         值
              max_age=None,     超時時間 (單位s)  如果參數(shù)是None,這個cookie會延續(xù)到瀏覽器關閉為止
              expires=None,     超時時間(IE requires expires, so set it if hasn't been already.)  cookie失效的實際日期/時間,格式必須是:Wdy,DD-Mth-YY HH:MM:SS GMT,這個參數(shù)會覆蓋max_age參數(shù)
              path='/',         Cookie生效的路徑,/ 表示根路徑,特殊的:跟路徑的cookie可以被任何url的頁面訪問
              domain=None,      Cookie生效的域名
              secure=False,     https傳輸
              httponly=False    只能http協(xié)議傳輸,無法被JavaScript獲?。ú皇墙^對,底層抓包可以獲取到也可以被覆蓋)

      由于cookie保存在客戶端的電腦上,所以,JavaScript和jquery也可以操作cookie。

      1
      2
      <script src='/static/js/jquery.cookie.js'></script>
      $.cookie("list_pager_num", 30,{ path: '/' });
      Session

      Django中默認支持Session,其內(nèi)部提供了5種類型的Session供開發(fā)者使用:

      • 數(shù)據(jù)庫(默認)

      • 緩存

      • 文件

      • 緩存+數(shù)據(jù)庫

      • 加密cookie

      1、數(shù)據(jù)庫Session

      配置 settings.py
      使用示例

      2、緩存Session

      配置 settings.py

      3、文件Session

      配置 settings.py

      4、緩存+數(shù)據(jù)庫Session

      配置 settings.py

      5、加密cookie Session

      配置 settings.py

      更多參考:猛擊這里 和 猛擊這里

      擴展:Session用戶驗證

      1
      2
      3
      4
      5
      6
      7
      def login(func):
          def wrap(request, *args, **kwargs):
              # 如果未登陸,跳轉到指定頁面
              if request.path == '/test/':
                  return redirect('http://www.baidu.com')
              return func(request, *args, **kwargs)
          return wrap
      分頁

      一、Django內(nèi)置分頁

      二、自定義分頁

      csrf跨站請求偽造

      django為用戶實現(xiàn)防止跨站請求偽造的功能,通過中間件 django.middleware.csrf.CsrfViewMiddleware 來完成。而對于django中設置防跨站請求偽造功能有分為全局和局部。

      全局:

        中間件 django.middleware.csrf.CsrfViewMiddleware

      局部:

      • @csrf_protect,為當前函數(shù)強制設置防跨站請求偽造功能,即便settings中沒有設置全局中間件。

      • @csrf_exempt,取消當前函數(shù)防跨站請求偽造功能,即便settings中設置了全局中間件。

      注: 需要引入

      1
      from django.views.decorators.csrf import csrf_exempt,csrf_protect

      二、應用

      1、普通表單

      1
      2
      3
      4
      5
      6
      7
      veiw中設置返回值:
        return render_to_response('Account/Login.html',data,context_instance=RequestContext(request))  
           或者
         return render(request, 'xxx.html', data)
         
      html 表單中設置Token:
        {% csrf_token %}

      2、Ajax

      1.對于傳統(tǒng)的form,可以通過表單的方式將token再次發(fā)送到服務端,而對于ajax的話,添加請求頭

      2.為了方便,獲取cookie,需要用到 jquery.cookie.js 文件提供的$.cookie()方法

      復制代碼
      var csrftoken = $.cookie('csrftoken');
      
      function csrfSafeMethod(method) {
          // these HTTP methods do not require CSRF protection
          return (/^(GET|HEAD|OPTIONS|TRACE)$/.test(method));
      }
      $.ajaxSetup({
          beforeSend: function(xhr, settings) {
              if (!csrfSafeMethod(settings.type) && !this.crossDomain) {
                  xhr.setRequestHeader("X-CSRFToken", csrftoken);
              }
          }
      });
      復制代碼

      更多:https://docs./en/dev/ref/csrf/#ajax

      admin

      django amdin是django提供的一個后臺管理頁面,改管理頁面提供完善的html和css,使得你在通過Model創(chuàng)建完數(shù)據(jù)庫表之后,就可以對數(shù)據(jù)進行增刪改查,而使用django admin 則需要以下步驟:

      • 創(chuàng)建后臺管理員

      • 配置url

      • 注冊和配置django admin后臺管理頁面

      1、創(chuàng)建后臺管理員

      1
      python manage.py createsuperuser

      2、配置后臺管理url

      1
      url(r'^admin/', include(admin.site.urls))

      3、注冊和配置django admin 后臺管理頁面

      a、在admin中執(zhí)行如下配置

      View Code

      b、設置數(shù)據(jù)表名稱

      View Code

      c、打開表之后,設定默認顯示,需要在model中作如下配置

      View Code
      View Code

      d、為數(shù)據(jù)表添加搜索功能

      View Code

      e、添加快速過濾

      View Code

      更多:http://docs./djangobook2/chapter06/

      中間件 

      django 中的中間件(middleware),在django中,中間件其實就是一個類,在請求到來和結束后,django會根據(jù)自己的規(guī)則在合適的時機執(zhí)行中間件中相應的方法。

      在django項目的settings模塊中,有一個 MIDDLEWARE_CLASSES 變量,其中每一個元素就是一個中間件,如下圖。

      復制代碼
      MIDDLEWARE = [
          'django.middleware.security.SecurityMiddleware',
          'django.contrib.sessions.middleware.SessionMiddleware',
          'django.middleware.common.CommonMiddleware',
          'django.middleware.csrf.CsrfViewMiddleware',
          'django.contrib.auth.middleware.AuthenticationMiddleware',
          'django.contrib.messages.middleware.MessageMiddleware',
          'django.middleware.clickjacking.XFrameOptionsMiddleware',
      ]
      復制代碼

      中間件中可以定義方法,分別是:

      • process_request(self,request)

      • process_view(self, request, callback, callback_args, callback_kwargs)

      • process_template_response(self,request,response)

      • process_exception(self, request, exception)

      • process_response(self, request, response)

      以上方法的返回值可以是None和HttpResonse對象,如果是None,則繼續(xù)按照django定義的規(guī)則向下執(zhí)行,如果是HttpResonse對象,則直接將該對象返回給用戶。

      自定義中間件

      1、創(chuàng)建中間件類

      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      11
      12
      13
      14
      15
      16
      17
      18
      from django.utils.deprecation import MiddlewareMixin
      class middletest_rep(MiddlewareMixin):
          def process_request(self, request):
              print('process_request1  1111')
          def process_response(self, request, response):
              print('process_response  1111')
              return response
          def process_template_response(self, request, response):
              print('process_template_response 1111')
          def process_view(self, request, callback, callback_args, callback_kwargs):
              print('process_view  1111')
          def process_exception(self, request, exception):
              print('process_exception  1111')

      2、注冊中間件

      1
      2
      3
      4
      MIDDLEWARE = [
          'middletest_class.t1.middleware',
        ...
      ]

      3、執(zhí)行流程 :

      request -> view -> url 選擇器 -> views 函數(shù) -> response (倒序 return )

      request => 下一個 request => .....

          => 如果有 return Httpresponse  => response => 用戶頁面

      -> view -> url 選擇器 -> views 函數(shù) -> 沒有 render -> response -> 用戶

                                  有 render -> template  -> response -> 用戶

                  -> 函數(shù)有異常 ->  exception (倒序 return ) -> response

      緩存

      由于Django是動態(tài)網(wǎng)站,所有每次請求均會去數(shù)據(jù)進行相應的操作,當程序訪問量大時,耗時必然會更加明顯,最簡單解決方式是使用:緩存,緩存將一個某個views的返回值保存至內(nèi)存或者memcache中,5分鐘內(nèi)再有人來訪問時,則不再去執(zhí)行view中的操作,而是直接從內(nèi)存或者Redis中之前緩存的內(nèi)容拿到,并返回。

      Django中提供了6種緩存方式:

      • 開發(fā)調(diào)試

      • 內(nèi)存

      • 文件

      • 數(shù)據(jù)庫

      • Memcache緩存(python-memcached模塊)

      • Memcache緩存(pylibmc模塊)

      1、配置

      a、開發(fā)調(diào)試

      View Code

      b、內(nèi)存

      View Code

      c、文件

      View Code

      d、數(shù)據(jù)庫

      View Code

      e、Memcache緩存(python-memcached模塊)

      View Code

      f、Memcache緩存(pylibmc模塊)

      View Code

      2、應用

      a. 全站使用

      View Code

      b. 單獨視圖緩存

      View Code

      c、局部視圖使用

      View Code

      更多:猛擊這里

      信號

      Django中提供了“信號調(diào)度”,用于在框架執(zhí)行操作時解耦。通俗來講,就是一些動作發(fā)生的時候,信號允許特定的發(fā)送者去提醒一些接受者。

      1、Django內(nèi)置信號

      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      11
      12
      13
      14
      15
      16
      17
      18
      19
      20
      21
      Model signals
          pre_init                    # django的modal執(zhí)行其構造方法前,自動觸發(fā)
          post_init                   # django的modal執(zhí)行其構造方法后,自動觸發(fā)
          pre_save                    # django的modal對象保存前,自動觸發(fā)
          post_save                   # django的modal對象保存后,自動觸發(fā)
          pre_delete                  # django的modal對象刪除前,自動觸發(fā)
          post_delete                 # django的modal對象刪除后,自動觸發(fā)
          m2m_changed                 # django的modal中使用m2m字段操作第三張表(add,remove,clear)前后,自動觸發(fā)
          class_prepared              # 程序啟動時,檢測已注冊的app中modal類,對于每一個類,自動觸發(fā)
      Management signals
          pre_migrate                 # 執(zhí)行migrate命令前,自動觸發(fā)
          post_migrate                # 執(zhí)行migrate命令后,自動觸發(fā)
      Request/response signals
          request_started             # 請求到來前,自動觸發(fā)
          request_finished            # 請求結束后,自動觸發(fā)
          got_request_exception       # 請求異常后,自動觸發(fā)
      Test signals
          setting_changed             # 使用test測試修改配置文件時,自動觸發(fā)
          template_rendered           # 使用test測試渲染模板時,自動觸發(fā)
      Database Wrappers
          connection_created          # 創(chuàng)建數(shù)據(jù)庫連接時,自動觸發(fā)

      對于Django內(nèi)置的信號,僅需注冊指定信號,當程序執(zhí)行相應操作時,自動觸發(fā)注冊函數(shù):

      注冊的信號放在__init__文件中即可實現(xiàn).

      View Code

      views函數(shù)調(diào)用:

      View Code

      2、自定義信號

      a. 定義信號

      1
      2
      import django.dispatch
      pizza_done = django.dispatch.Signal(providing_args=["toppings", "size"])

      b. 注冊信號

      1
      2
      3
      4
      5
      def callback(sender, **kwargs):
          print("callback")
          print(sender,kwargs)
        
      pizza_done.connect(callback)

      c. 觸發(fā)信號

      1
      2
      3
      from 路徑 import pizza_done
        
      pizza_done.send(sender='seven',toppings=123, size=456)

      由于內(nèi)置信號的觸發(fā)者已經(jīng)集成到Django中,所以其會自動調(diào)用,而對于自定義信號則需要開發(fā)者在任意位置觸發(fā)。

      更多:猛擊這里

      Form上傳文件

      a、自定義上傳

      復制代碼
      def upload_file(request):
          if request.method == "POST":
              obj = request.FILES.get('fafafa')
              f = open(obj.name, 'wb')
              for chunk in obj.chunks():          # chunks() 返回bytes類型
                  f.write(chunk)
              f.close()
          return render(request, 'file.html')
      復制代碼

      b、Form上傳文件實例

      Form
      Model
      view

       

        本站是提供個人知識管理的網(wǎng)絡存儲空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點。請注意甄別內(nèi)容中的聯(lián)系方式、誘導購買等信息,謹防詐騙。如發(fā)現(xiàn)有害或侵權內(nèi)容,請點擊一鍵舉報。
        轉藏 分享 獻花(0

        0條評論

        發(fā)表

        請遵守用戶 評論公約

        類似文章 更多