django之form組件、cookie、session

django之form組件、cookie、session

django form組件

  • 1.渲染標籤
  • 2.校驗數據
  • 3.展現信息

校驗數據

# 第一步須要一個form類
from django import forms
class MyForm(forms.Form):
    name = forms.CharField(max_length=8)
    password = forms.CharField(max_length=8,min_length=3)
    email = forms.EmailField()
    
# 第二步實例化form對象
form_obj = MyForm({'name':'lucas'})

# 第三步查看數據校驗是否合法
form_obj.is_valid()  # 只有當全部的字段都校驗經過纔會返回True

# 第四步查看校驗錯誤的信息
form_obj.errors  # 這個裏面存放的是全部未校驗未經過的字段及錯誤提示
        """
            {
            'name': ['Ensure this value has at most 6 characters (it has 7).'], 
            'password': ['Ensure this value has at least 3 characters (it has 2).'], 
            'email': ['Enter a valid email address.']
            }

        """
    
# 第五步查看校驗經過的數據
form_obj.cleaned_data  # 符合校驗規則的數據都會被放到該對象中

注意:html

form組件校驗數據的規則從上而下一次取值校驗前端

檢驗經過的放到cleaned_datapython

檢驗未經過的放到errorsdjango

form中全部的字段默認都是必須傳值的(required=True)瀏覽器

檢驗數據的時候能夠多傳(多傳的數據不會作任何的校驗,也不會影響form校驗規則)安全

渲染標籤

form組件只幫你渲染獲取用戶輸入的標籤,不會幫你渲染提交按鈕,須要手動添加服務器

<h1>第一種渲染方式</h1>
{{form_obj.as_p}}
{{form_obj.as_ul}}


<h1>第二種渲染方式</h1>
<form>
    <P>
        {{form_obj.name.lable}}{{form_obj.name}}
    </P>
    <P>
        {{form_obj.password.lable}}{{form_obj.password}}
    </P>
    <P>
        {{form_obj.email.lable}}{{form_obj.email}}
    </P>
    <input type='submit'>
</form>


<h1>第三種渲染方式</h1>
<form>
    {% for foo in form_obj %}
        <P>
            {{foo.lable}}{{foo}}
        </P>
    {% endfor %}
    <input type='submit'>
</form>

前端取消校驗

<!--前端頁面不會談框出來-->
<form action='' method='post' novalidate>  
    
</form>

ps:在使用form組件對模型表進行數據校驗的時候,只須要保證字段一致,那麼在建立對象的時候能夠直接create(**form_obj.cleaned_data)cookie

def reg(request):
    # 生成一個空對象
    form_obj = MyForm()
    if request.method == 'POST':
        print(request.POST)
        form_obj = MyForm(request.POST)
        if form_obj.is_valid():
            print(form_obj.cleaned_data)
            models.User.objects.create(**form_obj.cleaned_data)
    return render(request,'reg.html',locals())

form組件提交的數據若是不合法,頁面上會保留以前用戶輸入的信息:session

<form action='' method='post' novalidate>
    {% for foo in form_obj %}
        <p>
            {{foo.lable}}{{foo}}
            <span>{{foo.errors.0}}</span>
    </p>
    {% endfor %}
    <input type='submit'>
</form>

鉤子函數

局部鉤子函數函數

# 在定義的Myform類下定義函數
def clean_name(self):  # 
    name = self.cleaned_data.get('name')
    if '666' in name:
        self.add_error('name','有6不行')  # 給字段添加錯誤信息
    return name

全局函數(多個字段的校驗利用全局鉤子函數)

def clean(self):
    password = self.cleaned.data.get('password')
    confirm_password = self.cleaned.data.get('confirm_password')
    if  password != confirm_password:
        seld.add_error('confirm_password','密碼不一致')
    return self.cleaned_data

設置標籤樣式

from django import forms
from django.froms import widgets
password = froms.CharField(max_length=3,error_messages={
    'max_length':'密碼最長8位',  # 將報錯信息改爲中文
    'required':'密碼不能爲空',
    'min_length':'密碼最少3位'
},widgets.PasswordInput(attrs={'class':'c1 form-control'}))  # 給密碼字段設置樣式,而且改成密文

單選

gender = forms.ChoiceField(
    choices = (1,'男'),(2,'女'),(3,'保密'),
    label = '性別',
    inital = 3,  # 默認選3
    widget = forms.widgets.RadioSelect()
)

下拉單選

hobby = forms.ChoiceField(
    choices = (1,'籃球'),(2,'足球'),(3,'雙色球'),
    label = '愛好',
    initial = 3,
    widget = forms.widgets.Select()
)

多選

hobby = forms.ChoiceField(
    choices = (1,'籃球'),(2,'足球'),(3,'雙色球'),
    label = '愛好',
    initial =[1,3],
    widget = forms.widgets.SelectMultiple()
)
keep = forms.ChoiceField(
    label = '是否記住密碼',
    initial = 'checked',
    widget = forms.widgets.ChoiceboxInput()
)

保存在客戶端瀏覽器上的鍵值對

原理:

由服務器產生內容,瀏覽器收到請求後保存在本地,當瀏覽器再次訪問時,瀏覽器會自定帶上cookie,這樣服務器就能經過cookie的內容來判斷

獲取cookie

request.COOKIES['key']
request.COOKIES.get('key')

設置cookie

obj = HttpResponse(...)
obj = render(request,...)

obj.set_cookie('key','value',expires=7*24*3600)  # expire設置過時時間

obj.set_cookie('key','value',max_age=7*24*3600)  # max_age設置過時時間,可是不支持IE瀏覽器

刪除cookie

def logout(request):
    res = redirect('/login/')
    res.delete_cookie('user')  # 刪除以前設置的uesrcookie值
    return res

登陸裝飾器

from functools import wraps
def login_auth(func):
    @wraps(func)
    def inner(request,*args,**kwargs):
        old_path = request.get_full_path()  # 獲取一開始輸入的網址
        if request.COOKIES.get('name'):
            return func(request,*args,**kwargs)
        return redirect('/login/?next=%s'%old_path)
    return inner

登入以後跳到一開始輸入的網址

def login(request):
    if request.method == 'POST':
        username = request.POST.get('username')
        password = request.POST.get('password')
        if username == 'lucas' and password == '123':
            old_path = request.GET.get('next')  # 從裝飾器中獲取get請求攜帶的一開始輸入的地址
            if old_path:
                obj = redirect(old_path)  # 跳轉到老路徑
            else:
                obj = redirect('/home/')
            obj.set_cookie('name':'lucas',expires=7*24*3600)
            return obj
        return render(request,'login.html')

session

session是保存在服務端上的,有較高的安全性

  • 1.先生成一個隨機的字符串
  • 2.在django session表中存儲該隨機字符串與數據的記錄
  • 3.將隨機的字符串發送給客戶端瀏覽器

設置session

request.session['name'] = 'lucas'

獲取session

  • 1.django自動獲取瀏覽器隨機字符串,去django session表裏對比
  • 2.若是對比成功,會將當前隨機字符串對應的數據賦值給request.session
  • 3.經過request.session操做該數據(數據不存在也不會影響業務邏輯)
request.session.get('name')

瀏覽器會設置一個鍵爲sessionid來存放session值

刪除當前會話的全部session數據

request.session.delete()

刪除當前的會話數據並刪除會話的cookie

request.session.flush()  # 這用於確保前面的會話數據不能夠再次被用戶的瀏覽器訪問

設置會話session和cookie的超時時間

request.session.set_expiry(value)

若是value是個整數,session會在value秒數後失效

若是value是個datatime或timedelta,session就會在這個時間後失效

若是value是0,用戶在關閉瀏覽器session就會失效

若是value是None,session會依賴全局session失效策略

注意:django默認的session存活時間是兩週(14天)

相關文章
相關標籤/搜索