1. 程式人生 > >Python Web 框架-Django day07

Python Web 框架-Django day07

目錄

day06回顧

1.自定義查詢物件     1.宣告類 繼承自 models.Manager         定義自定義函式     2.為實體類覆蓋 objects         class Entry(models.Model):             objects = EntryManager() 2.HttpRequest     1.判斷請求方式         request.method     2.獲取請求提交的資料         1.get             request.GET['name']         2.post             request.POST['name']     3.獲取請求訊息頭         request.META         request.META.HTTP_REFERER     4.提交post請求         Django對post請求需要進行一個 csrf 驗證         解決方案:             1.增加 {% csrf_token %} 標籤             2.刪除 csrf 相關的中介軟體             3.將 @csrf_protect 新增到檢視處理函式上 3.使用 forms 模組     1.使用 forms 模組         1.建立 forms.py         2.匯入 forms 模組             from django import forms         3.建立 class,一個class對應著一個表單             class ClassName(forms.Form):                 屬性 :每一個屬性會生成一個表單控制元件                                  forms.CharField()                 forms.EmailField()                 forms.IntegerField()                 ... ...     2.在模板中 解析 form 物件         0.注意             1.建立表單 - <form></form>             2.自定義按鈕         1.手動解析             form = XXXForm()             return render(request,'xxx.html',locals())

            xxx.html :                  {% for field in form %}                     {{field}} : 表示的是一個控制元件                     {{field.label}} : 表示的是label引數值                 {% endfor %}         2.自動解析             {{form.as_p}}             {{form.as_ul}}             {{form.as_table}}     3.檢視中通過 forms.Form 接收表單資料         1.通過 forms.Form的構造器接收資料             form = XXXForm(request.POST)         2.需要讓 form 通過驗證後 ,再取值             form.is_valid()                 True:通過所有驗證                 False:未通過驗證         3.獲取表單資料             form.cleaned_data

1.forms模組

  1. forms模組的高階處理 將Models 和 Forms 結合到一起使用
    1. 在 forms.py 中建立class,繼承自 forms.ModelForm
    2. 建立內部類 Meta,去關聯 Model
      1. model:指定要關聯的實體類
      2. fields:指定從Model中取哪些欄位生成控制元件
        1. 取值 '__all__',表示全部屬性都要生成控制元件
        2. 取值 列表,宣告允許生成控制元件的屬性名
      3. labels:指定每個屬性所關聯的label,取值為字典 labels = {   ‘屬性名’:'label文字',   '屬性名':'label文字', } 解析:
        index下的model.py建立類
        from django.db import models
        
        # Create your models here.
        class User(models.Model):
          uphone=models.CharField(max_length=30)
          upwd=models.CharField(max_length=30)
          uname=models.CharField(max_length=50)
          uemail = models.EmailField()
        forms.py關聯,建立控制元件
        from django import forms
        from .models import *
        
        
        class RegisterForm(forms.ModelForm):
          #通過內部類Meta表示關聯的資訊
          class Meta:
            #1.指定關聯的Model
            model = User
            #2.指定要生成控制元件的欄位們
            fields = "__all__"
            #3.指定每個控制元件對應的label
            labels = {
              'uphone':'電話號碼',
              'upwd':'登入密碼',
              'uname':'使用者名稱稱',
              'uemail':'電子郵件',
            }
        
        class LoginForm(forms.ModelForm):
          class Meta:
            model = User
            fields = ['uphone','upwd']
            labels = {
              'uphone':'註冊電話',
              'upwd':'登入密碼',
            }
            #指定小部件
            widgets = {
              'upwd':forms.PasswordInput(attrs={
                'placeholder':'請輸入您的密碼'
              })
            }
        交給檢視函式views.py
        from django.http import HttpResponse
        from django.shortcuts import render
        from .forms import *
        
        def register_views(request):
          if request.method == 'GET':
            form = RegisterForm()
            return render(request,'05-register.html',locals())
          else:
            form = RegisterForm(request.POST)
            if form.is_valid():
              user = User(**form.cleaned_data)
              # 資料庫配置成功並且實體類對映成表之後,該操作可以實現
              user.save()
            return HttpResponse('OK')
        
        def login_views(request):
          if request.method == 'GET':
            form = LoginForm()
            #宣告一個帶有小部件的form - WidgetLoginForm
            # form = WidgetLoginForm()
            return render(request,'06-login.html',locals())
         
  2. 內建小部件
    1. 什麼是小部件 小部件(widget),表示的是生成到頁面上的控制元件的型別以及其他的html屬性
    2. 常用小部件型別
      1. TextInput:type='text'
      2. PasswordInput:type='password'
      3. NumberInput:type='number'
      4. EmailInput:type='email'
      5. URLInput:type='url'
      6. HiddenInput:type='hidden'
      7. CheckboxInput:type='checkbox'
      8. Textarea:<textarea></textarea>
      9. Select:<select></select>
    3. 小部件的使用
      1. 繼承自 forms.Form
        1. 基本版 只指定控制元件的型別 class RemarkForm(forms.Form):   屬性 = forms.CharField(     label='文字',     widget=forms.小部件型別 )
          class WidgetLoginForm(forms.Form):
            uphone = forms.CharField(label='電話號碼')
            #為pwd指定小部件,顯示為 密碼框
            upwd = forms.CharField(label='登入密碼',widget=forms.PasswordInput)
        2. 高階版 指定控制元件型別的基礎上還允許設定html的一些相關屬性 屬性 = forms.CharField(   label=‘文字’,   widget=forms.小部件型別(     attrs = {       'html屬性名':'屬性值',       'html屬性名':'屬性值',     }   ) )
          class WidgetLoginForm(forms.Form):
            uphone = forms.CharField(label='電話號碼')
            upwd = forms.CharField(
              label='登入密碼',
              widget=forms.PasswordInput(
                attrs = {
                  'placeholder':'請輸入密碼',
                  'class':'form-control',
                }
              )
            )
          
      2. 繼承自 forms.ModelForm class XXXForm(forms.ModelForm):   class Meta:     model = User     fields = "__all__"     labels = {       '屬性1':'Label1',     }     widgets = {       '屬性1':forms.小部件型別(attrs={}),     }
        class LoginForm(forms.ModelForm):
          class Meta:
            model = User
            fields = ['uphone','upwd']
            labels = {
              'uphone':'註冊電話',
              'upwd':'登入密碼',
            }
            #指定小部件
            widgets = {
              'upwd':forms.PasswordInput(attrs={
                'placeholder':'請輸入您的密碼'
              })
            }

2.cookies 在 Django 中的實現

  1. django 中使用 cookies
    1. 設定cookies的值 語法: 相應物件.set_cookie(key,value,expires)   key:cookies的名字   value:cookie的值   expires:保持時間,以s為單位 ex:   響應物件.set_cookie('uname','tom',60*60*24*365) 響應物件:
      1. HttpResponse resp =  HttpResponse('給客戶端的一句話') resp.set_cookie('key','value',expires) return resp
      2. render() resp = render(request,'xxx.html',locals()) resp.set_cookie('key','value',expires) return resp
      3. HttpResponseRedirect / redirect resp = redirect('/地址/') resp.set_cookie('key','value',expires) return resp
    2. 獲取cookies的值 通過 request.COOKIES 獲取當前站點下所有的cookies的資訊

3.session 在 Django 中的實現

  1. 設定session 的值 request.session['key'] = value
  2. 獲取 session 的值 value = request.session[key] value = request.session.get('key')
  3. 刪除 session 的值 del request.session['key']

4.在 settings.py中,設定session的相關設定

  1. SESSION_COOKIE_AGE 作用:設定 sessionID 在 cookie 中的儲存時間 ex:   SESSION_COOKIE_AGE = 60*60*24
  2. SESSION_EXPIRE_AT_BROWSER_CLOSE 作用:設定關閉瀏覽器時則清空伺服器上對應的session空間 ex:   SESSION_EXPIRE_AT_BROWSER_CLOSE = True

練習:用session和cookie判斷是否登陸成功, 簡單程式碼: views.py中的部分程式碼

def login_views(request):
  # 判斷 get 請求還是 post 請求
  if request.method == 'GET':
    #get請求 - 判斷session,判斷cookie,登入頁
    #先判斷session中是否有登入資訊
    if 'uid' in request.session and 'uphone' in request.session:
      #有登入資訊儲存在 session
      return HttpResponse('您已經登入成功了')
    else:
      #沒有登入資訊儲存在 session,繼續判斷cookies中是否有登入資訊
      if 'uid' in request.COOKIES and 'uphone' in request.COOKIES:
        #cookies中有登入資訊 - 曾經記住過密碼
        #將cookies中的資訊取出來儲存進session,再返回到首頁
        uid = request.COOKIES['uid']
        uphone = request.COOKIES['uphone']
        request.session['uid']=uid
        request.session['uphone']=uphone
        return HttpResponse('您已經登入成功')
      else:
        #cookies中沒有登入資訊 - 去往登入頁
        form = LoginForm() #這是forms.py中的類名
        return render(request,'login.html',locals())
  else:
    #post請求 - 實現登入操作
    #獲取手機號和密碼
    uphone = request.POST['uphone']
    upwd = request.POST['upwd']
    #判斷手機號和密碼是否存在(登入是否成功)
    users=User.objects.filter(uphone=uphone,upwd=upwd)
    if users:
      #登入成功:先存進session
      request.session['uid']=users[0].id
      request.session['uphone']=uphone
      #宣告響應物件:響應一句話"登入成功"
      resp = HttpResponse("登入成功")
      #判斷是否要存進cookies
      if 'isSaved' in request.POST:
        expire = 60*60*24*90
        resp.set_cookie('uid',users[0].id,expire)
        resp.set_cookie('uphone',uphone,expire)
      return resp
    else:
      #登入失敗
      form = LoginForm()
      return render(request,'login.html',locals())

今日示例:點選

b5nn