Django中消息中間鍵和form組件的運用

補充知識

  1. cookie中文問題css

    # 解決方式1:
    set_cookie(‘k1’,’你好’.encode('utf-8').decode('iso-8859-1'))
    
    request.COOKIES['k1'].encode('iso-8859-1').decode('utf-8')
    
    # 解決方式2
    import json
    json_str = json.dumps('你好',ensure_ascii=False)
    ret.set_cookie('k1',json_str)
    
    json.loads(request.COOKIES['k1'])
  2. cookie中經常使用函數html

    ret.set_cookie('k1','v1',max_age=None,expires=None)
  3. session:爲了數據安全和保存數據沒有上限python

    設置
    request.session['k1']=123
    request.session.setdefault('k1',123)
    
    刪
    request.session.flush()
    
    取
    request.session.get('k1')
  4. csrf_token面試

    from django.views.decorators.csrf import csrf_exempt,csrf_protect
    
    @csrf_exempt
    def func2(request):
        if request.method == 'GET':
            return render(request,'xx.html')
        else:
            username=request.POST.get('username')
            print(username)
            retrn HttpResponse('ok')

消息中間鍵

  1. 中間鍵django

    MIDDLEWARE = [
        'django.middleware.security.SecurityMiddleware',
        .......
        .......
    ]
    
    # from django.middleware.csrf import CsrfViewMiddleware
    
    # 自定義中間鍵

  1. Django 請求生命週期(面試常問)

中間件補充

  1. process_viewjson

    def process_view(self,request,view_func,view_args,view_kwargs)
  2. process_exceptionbootstrap

    def process_exception(self,request,exception)
  3. process_template_response安全

  4. 中間件案列cookie

    • 作ip頻率限制
      • Ip:request.META.get(‘REMOTE_ADDR’)
    • URL訪問過濾

中間件的五個方法session

process_request(self,request)
process_view(self, request, view_func, view_args, view_kwargs)
process_template_response(self,request,response)
process_exception(self, request, exception)
process_response(self, request, response)

process_view:

img

process_exception:視圖函數出錯,會執行

img

process_template_response:

def index(request):
    print("app01 中的 index視圖")
  #raise ValueError('出錯啦') 
    def render():
        print("in index/render")  
        #raise ValueError('出錯啦') #至於render函數中報錯了,那麼會先執行process_template_response方法,而後執行process_exception方法,若是是在render方法外面報錯了,那麼就不會執行這個process_template_response方法了。
        return HttpResponse("O98K") #返回的將是這個新的對象
    rep = HttpResponse("OK")
    rep.render = render
    return rep

form組件

1 生成頁面HTML標籤

2 校驗用戶提交的數據合法性

3 保留用戶輸入的數據

生成標籤

from django import forms

def mobile_validate(value):  value是要被校驗的數據
    mobile_re = re.compile(r'^13[0-9]{9}')
    if not mobile_re.match(value):
        raise ValidationError('手機號碼格式錯誤')  #別忘了raise錯誤


class MyForm(forms.Form):
     name = forms.CharField(
        required=True,  #默認等於True,內容不能爲空
        min_length=6,   #最小長度爲6
        label='用戶名',  #標識
        initial='高傑DSB', #初始值,默認值
        # validators=[RegexValidator(r'^銀瓶梅','沒看過銀瓶梅,不能經過'),RegexValidator(r'紅旭妹妹$','沒看過紅旭妹妹,不能經過'),], #寫自定義校驗規則,RegexValidator(正則,錯誤信息)
        # validators=[mobile_validate,], #寫自定義校驗規則,RegexValidator(函數名稱,)
        help_text='這是輸入用戶名的地方,不能過短!',
        error_messages={'required':'不能爲空!','min_length':'過短了!'},
        # widget=forms.widgets.TextInput(attrs={'class':'form-control'}),
        widget=forms.widgets.TextInput,
    )
    password = forms.CharField(
        min_length=8,
        max_length=10,  #最大長度不能超過10位
        label='密碼',
        widget=forms.widgets.PasswordInput(), #密文輸入
    )
    
radio單選框:
    sex = forms.ChoiceField(
        label='性別',
        initial=3, #初始值
        choices=((1, "男"), (2, "女"), (3, "保密")),
        widget=forms.widgets.RadioSelect(),

    )
select下拉單選框
    city = forms.ChoiceField(
        label='性別',
        initial=3,
        choices=((1, "北京"), (2, "上海"), (3, "東莞")),
        widget=forms.widgets.Select(),

    )

checkbox多選框
    hobby = forms.MultipleChoiceField(
        label='愛好',

        choices=((1, "抽菸"), (2, "喝酒"), (3, "燙頭")),
        widget=forms.widgets.CheckboxSelectMultiple,

    )
    
select下拉多選框
    girls = forms.MultipleChoiceField(
        label='愛好',

        choices=((1, "紅旭妹妹"), (2, "相璽哥哥"), (3, "程根姐姐")),
        widget=forms.widgets.SelectMultiple,

    )

單選checkbox
    status = forms.ChoiceField(
        label='remeber me!!',

        choices=(('True', "紅旭妹妹"), ('False', "相璽哥哥")),
        widget=forms.widgets.CheckboxInput,

    )

#給標籤加屬性
widget=forms.widgets.TextInput(attrs={'class':'c1','type':'date'}),

widget=forms.widgets.TimeInput(attrs={'type': 'date'}),

校驗內容

def register(request):
    form_obj = LoginForm()
    if request.method == 'GET':
        return render(request,'register.html',{'form_obj':form_obj})
    
    else:
        # request.POST = name:'asdfasdf'
            form_obj = LoginForm(request.POST) {‘name’:}
            print(form_obj.fields) #拿到全部的form類中的字段
            print(form_obj.is_valid())
            if form_obj.is_valid(): #校驗數據 ,所有經過校驗,返回True,但凡是有一個不對的,就返回False
                print(form_obj.cleaned_data)  #{'name': '13812312312', 'password': '11111111'}
                return HttpResponse('登陸成功')
            else:

                print('xxxxxx')
                print(form_obj.errors)
                return render(request,'register.html',{'form_obj':form_obj})

html文件寫法

{% load static %}
<!DOCTYPE html>
<html lang="zh-CN">
<head>
  <meta charset="utf-8">
  <meta http-equiv="X-UA-Compatible" content="IE=edge">
  <meta name="viewport" content="width=device-width, initial-scale=1">
  <!-- 上述3個meta標籤*必須*放在最前面,任何其餘內容都*必須*跟隨其後! -->
  <title>Bootstrap 101 Template</title>
  <!-- Bootstrap -->
  <link href="{% static 'bootstrap-3.3.7-dist/css/bootstrap.min.css' %}" rel="stylesheet">
</head>
<body>
<h1>你好,世界!</h1>

<form action="" method="post" novalidate>
  {% csrf_token %}
{#  {{ form_obj.errors }}#}
{#  用戶名: <input type="text" name="username"> #}
{#  密碼: <input type="text" name="password"> #}
  <div>
    <label for="">{{ form_obj.name.label }}</label>
    {{ form_obj.name }}
    {{ form_obj.name.help_text }}
{#    {{ form_obj.errors }}#}
    <span style="color: red;font-size: 14px;">{{ form_obj.name.errors.0 }}</span>
  </div>
  <div>
    <label for="">{{ form_obj.password.label }}</label>
    {{ form_obj.password }}
    {{ form_obj.password.errors.0 }}
{#    {{ form_obj.errors }}#}
  </div>
  <div>
    <label for="">{{ form_obj.r_password.label }}</label>
    {{ form_obj.r_password }}
    {{ form_obj.r_password.errors.0 }}
{#    {{ form_obj.errors }}#}
  </div>
{#  <div>#}
{#    <label for="">{{ form_obj.password.label }}</label>#}
{#    {{ form_obj.password }}#}
{#  </div>#}
{#  <div>#}
{#    <label for="">{{ form_obj.sex.label }}</label>#}
{#    {{ form_obj.sex }}#}
{#  </div>#}
{#  <div>#}
{#    <label for="">{{ form_obj.city.label }}</label>#}
{#    {{ form_obj.city }}#}
{#  </div>#}
{#  <div>#}
{#    <label for="">{{ form_obj.hobby.label }}</label>#}
{#    {{ form_obj.hobby }}#}
{#  </div>#}
{#  <div>#}
{#    <label for="">{{ form_obj.girls.label }}</label>#}
{#    {{ form_obj.girls }}#}
{#  </div>#}
{#  <div>#}
{#    <label for="">{{ form_obj.status.label }}</label>#}
{#    {{ form_obj.status }}#}
{#  </div>#}

  <div>
    <label for="">{{ form_obj.brithday.label }}</label>
    {{ form_obj.brithday }}
  </div>

{#  {{ form_obj.as_p }}#}

  <input type="submit">
</form>


</body>
</html>

局部鉤子和全局鉤子

在定義的form類中寫下面的方法:
#局部鉤子  clean_字段名稱 ,
    def clean_name(self):
        value = self.cleaned_data['name']
        if '大壯' in value:
            raise ValidationError('含有敏感詞彙:大壯')
        else:
            return value



    #全局鉤子
    def clean(self):
        value = self.cleaned_data
        p1 = value['password']
        p2 = value['r_password']
        if p1 == p2:
            return value
        else:
            # raise ValidationError('兩次輸入的密碼不一致!')
            self.add_error('r_password','兩次輸入的密碼不一致!') #給某個字段單獨添加報錯信息
            raise ValidationError('兩次輸入的密碼不一致!')


循環全部字段進行驗證,首先完成該字段實例化的時候的屬性驗證min_length=6,例如:Charfield(min_length=6),而後經過反射執行該字段的局部鉤子,而後進行下一次循環,完成該字段實例化的時候的屬性驗證min_length=6,例如:Charfield(min_length=6),而後經過反射執行該字段的局部鉤子,循環結束,self.clean_data裏面有各個字段的數據,而後執行全局鉤子
相關文章
相關標籤/搜索