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'])
cookie中經常使用函數html
ret.set_cookie('k1','v1',max_age=None,expires=None)
session:爲了數據安全和保存數據沒有上限python
設置 request.session['k1']=123 request.session.setdefault('k1',123) 刪 request.session.flush() 取 request.session.get('k1')
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')
中間鍵django
MIDDLEWARE = [ 'django.middleware.security.SecurityMiddleware', ....... ....... ] # from django.middleware.csrf import CsrfViewMiddleware # 自定義中間鍵
process_viewjson
def process_view(self,request,view_func,view_args,view_kwargs)
process_exceptionbootstrap
def process_exception(self,request,exception)
process_template_response安全
中間件案列cookie
中間件的五個方法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:
process_exception:視圖函數出錯,會執行
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
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裏面有各個字段的數據,而後執行全局鉤子