Django之form表單組件、cookie與session

---恢復內容開始---

Form表單組件

引例:

先來看一個注冊的例子,全部用的是reg函數來實現的。

views.py文件

def reg(request):errors = {'username':'','password':''}if request.method == 'POST':username = request.POST.get('username')password = request.POST.get('password')if 'sb' in username:errors['username'] = '用戶名里面不能有sb,你這個dsb'if password == '123':errors['password'] = '密碼太簡單了,你怕是個傻子哦'return render(request,'reg.html',locals())

reg.html文件

<h1>注冊頁面</h1>
<form action="" method="post"><p>username:<input type="text" name="username"><span>{{ errors.username }}</span></p><p>password:<input type="password" name="password"><span>{{ errors.password }}</span></p><input type="submit"></form>

這里我們定義了一個errors的字典來對input框內容進行限制

其實form常用字段和插件就可以做到

常用字段與插件

initial:初始值,input框里面的初始值。

error_messages:重寫錯誤信息。

views.py文件

from app01 import models
from django import forms
from django.forms import widgets

class MyForm(forms.Form):name = forms.CharField(max_length=6,label='用戶名',error_messages={'max_length':'用戶名最長6位','required':'用戶名不能為空'})password = forms.CharField(max_length=8,min_length=3,error_messages={'max_length': '密碼最長8位','required': '密碼不能為空','min_length':'密碼最少3位'},widget=widgets.PasswordInput(attrs={'class':'c1 form-control'}))confirm_password = forms.CharField(max_length=8, min_length=3, error_messages={'max_length': '確認密碼最長8位','required': '確認密碼不能為空','min_length': '確認密碼最少3位'},widget=widgets.PasswordInput())email = forms.EmailField(error_messages={'invalid':'郵箱格式不正確','required':'郵箱不能為空'})gender = forms.ChoiceField(choices=((1, ""), (2, ""), (3, "保密")),label="性別",initial=3, # 默認值widget=forms.widgets.RadioSelect())hobby = forms.ChoiceField(choices=((1, "籃球"), (2, "足球"), (3, "雙色球"),),label="愛好",initial=3,widget=forms.widgets.Select())hobby1 = forms.MultipleChoiceField(choices=((1, "籃球"), (2, "足球"), (3, "雙色球"),),label="愛好",initial=[1, 3],widget=forms.widgets.SelectMultiple())keep = forms.ChoiceField(label="是否記住密碼",initial="checked",widget=forms.widgets.CheckboxInput())# 鉤子函數# 局部鉤子函數 (單個字段的校驗利用局部鉤子函數)def clean_name(self):name = self.cleaned_data.get('name')if '666' in name:self.add_error('name','光喊666是不行的,要有真實力!')return name # return還是要加上的,兼容性考慮# 全局鉤子函數 (多個字段的校驗利用全局鉤子函數)def clean(self):password = self.cleaned_data.get('password')confirm_password = self.cleaned_data.get('confirm_password')if not password == confirm_password:self.add_error('confirm_password',"兩次密碼不一致,你這個dsb!")return self.cleaned_datadef 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表單輸入框的判斷功能

models.py文件

class User(models.Model):name = models.CharField(max_length=32)password = models.CharField(max_length=32)email = models.EmailField()

這里只對表里面的字段進行校驗,后端數據又是如何渲染到前端的呢?

渲染到前端的三種方法:

一:reg.html文件

<h1>第一種渲染方式(可擴展性較差)</h1>
{{ form_obj.as_p }}
{{ form_obj.as_ul }}

用的是已經封裝好的 直接拿表的字段來顯示as_‘’標簽‘’就是用這種標簽來包裹

?

二:

<h1>第二種渲染方式</h1>
<form action=""><p>{{ form_obj.name.label }}{{ form_obj.name }}</p><p>{{ form_obj.password.label }}{{ form_obj.password }}</p><p>{{ form_obj.email.label }}{{ form_obj.email }}</p><input type="submit">
</form>

三:

<h1>第三種渲染標簽的方式</h1>
<form action="" method="post" novalidate>{% for foo in form_obj %}<p>{{ foo.label }}{{ foo }}</p><span>{{ foo.errors.0 }}</span>{% endfor %}<input type="submit">
</form></body>
</html>

這里推薦是使用第三種,簡潔還可以擴展

?

cookie與session

http協議四大特性
1.基于TCP/IP作用于應用層的協議
2.基于請求響應
3.無狀態
4.無連接

cookie:存放在客戶端的鍵值對

cookie與session正好彌補了HTTP協議的不足

設置cookie
obj.set_cookie() # 給瀏覽器設置cookie

獲取cookie
request.COOKIE.get('name')
request.COOKIE['name']

session:

保存在服務端上的鍵值對
服務端產生隨機的字符串返回給客戶端,服務端將字符串與對應的信息存起來{'隨機字符串':'敏感信息'}。

設置session

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

1.先生成一個隨機的字符串

2.在django session表中存儲該隨機字符串與數據的記錄

3.將隨機的字符串發送給客戶端瀏覽器

?

獲取session

request.session.get('name')

1.django自動獲取瀏覽器隨機字符串取django session表里面比對

2.如果比對成功 會將當前隨機字符串對應的數據賦值給request.session

? ? ? ??3.通過request.session操作該數據(數據不存在也不會影響我們的業務邏輯)

?

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

?刪除當前會話的所有Session數據

request.session.delete()  

?刪除當前的會話數據并刪除會話的Cookie。

request.session.flush()?

這用于確保前面的會話數據不可以再次被用戶的瀏覽器訪問

例如,django.contrib.auth.logout() 函數中就會調用它。

?設置會話Session和Cookie的超時時間

request.session.set_expiry(value)

* 如果value是個整數,session會在些秒數后失效。

* 如果value是個datatime或timedelta,session就會在這個時間后失效。

* 如果value是0,用戶關閉瀏覽器session就會失效。

* 如果value是None,session會依賴全局session失效策略。

接上面我們寫一個session

def login(request):if request.method == 'POST':username = request.POST.get('username')password = request.POST.get('password')if username == 'khan' and password == '123':old_path = request.GET.get('next')if old_path:obj = redirect(old_path)else:obj = redirect('/home/')# 用戶登錄成功 朝瀏覽器設置一個cookie# obj.set_cookie('name','khan',expires=7*24*3600)obj.set_cookie('name','khan',max_age=5)return objreturn render(request,'login.html')from functools import wraps
def login_auth(func):@wraps(func)def inner(request,*args,**kwargs):# 校驗cookie# print(request.get_full_path())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@login_auth
def index(request):# # print(request.COOKIES.get('name'))# if request.COOKIES.get('name'):return HttpResponse('我是index頁面,只有登錄了才能看')@login_auth
def home(request):return HttpResponse('我是home頁面,只有登錄了才能看')@login_auth
def xxx(request):return HttpResponse('我是xxx頁面,只有登錄了才能看')def set_session(request):request.session['name'] = 'khan'request.session['name1'] = 'egon'request.session['name2'] = 'tank'request.session['name3'] = 'nick'request.session['name4'] = 'sean'return HttpResponse('ok')def get_session(request):print(request.session.get('name'))print(request.session.get('name1'))print(request.session.get('name2'))print(request.session.get('name3'))print(request.session.get('name4'))return HttpResponse('ok')def delete_session(request):request.session.delete()return HttpResponse('ok')def flush_session(request):request.session.flush()return HttpResponse('ok')

login.html文件

<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><title>Title</title><script src="https://cdn.bootcss.com/jquery/3.4.1/jquery.min.js"></script><link rel="stylesheet" href="/static/bootstrap-3.3.7/css/bootstrap.min.css"><script src="/static/bootstrap-3.3.7/js/bootstrap.min.js"></script>
</head>
<body>
<form action="" method="post"><p>username:<input type="text" name="username"></p><p>password:<input type="text" name="password"></p><input type="submit">
</form>
</body>
</html>

?

?

?

?

---恢復內容結束---

轉載于:https://www.cnblogs.com/guanlei/p/11042560.html

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/386616.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/386616.shtml
英文地址,請注明出處:http://en.pswp.cn/news/386616.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

程序員經驗分享:Android高級工程師系列學習路線介紹,面試必備

前言 曾聽過很多人說Android學習很簡單&#xff0c;做個App就上手了&#xff0c;工作機會多&#xff0c;畢業后也比較容易找工作。這種觀點可能是很多Android開發者最開始入行的原因之一。 在工作初期&#xff0c;工作主要是按照業務需求實現App頁面的功能&#xff0c;按照設…

Java實現將文件或者文件夾壓縮成zip

Java實現將文件或者文件夾壓縮成zip 最近碰到個需要下載zip壓縮包的需求&#xff0c;于是我在網上找了下別人寫好的zip工具類。但找了好多篇博客&#xff0c;總是發現有bug。因此就自己來寫了個工具類。 這個工具類的功能為&#xff1a; &#xff08;1&#xff09;可以壓縮文件…

算法題+JVM+自定義View,隔壁都饞哭了

反思 昨晚去北京大望路阿里面試, 產生了嚴重的挫敗感, 羞愧難當. 比不得從大學就有目標有理想, 一直在為目標努力學習技術的同學, 在大學唯一能拿得出手的就是參加了電子設計大賽, 學了點嵌入式的知識. 畢業后開始做android, 說得好聽點叫做項目, 實際上就是搬代碼, 真正記到…

n2n內網穿透打洞部署全過程 + nginx公網端口映射

內網穿透、打洞工具有很多&#xff0c;此前在windows上使用的是vidcc這個玩意&#xff0c;也正因為linux不支持。自此在linux嘗試過一些打洞工具&#xff0c;ssh 反向代理這些&#xff0c;因為安全性不便捷等多種原因&#xff0c;最終選擇了n2n。 由于初次接觸n2n&#xff0c;對…

Windows下快速刪除上萬個文件和子目錄

為什么會慢 如果直接在Windows文件管理器里刪除的話&#xff08;通過菜單或者鍵盤Del或者ShiftDel&#xff09;&#xff0c;刪除這個數量的文件需要大概10幾分鐘&#xff0c;具體根據文件數量目錄層次不同耗時不同。這么慢是因為在刪除之前系統有個準備階段&#xff0c;在這個階…

終于有人把安卓程序員必學知識點全整理出來了,BAT大廠面試總結

行業激烈變化時&#xff0c;恰恰是機會最多的時候 坦白講&#xff0c;許多人骨子里害怕變化和競爭。 其實大可不必。 一來&#xff0c;怕也沒用嘛。二來&#xff0c;變化越快&#xff0c;組合要素增加了&#xff0c;意味著新的工作機會越多。 就像傳統媒體VS新媒體。 放在…

c#反混淆工具de4dot 一般混淆都可以解決

c#反混淆工具de4dot 一般混淆都可以解決 使用方法&#xff1a; 1、CMD 打開 De4Dot 所在文件夾 最好是以管理員身份運行CMD 2、輸入 De4Dot C:\Users\muzigaiyu\Desktop\demo.exe 回車 成功后會在軟件所在文件夾生成 demo-cleaned.exe 在用dotpeek 或者其他軟件打開exe即可看…

餐廳點餐系統:測試與部署

項目測試與部署 1.系統測試 項目調試完成后&#xff0c;將項目打包成war包放入tomcat/wabapps文件夾&#xff0c;本機啟動tomcat&#xff0c;redis緩存&#xff0c;mysql數據庫等服務&#xff0c;本機訪問localhost&#xff1a;8080/BookFood&#xff0c;測試系統的各個功能是否…

SpringCloud與Seata分布式事務初體驗

在本篇文章中我們在SpringCloud環境下通過使用Seata來模擬用戶購買商品時由于用戶余額不足導致本次訂單提交失敗&#xff0c;來驗證下在MySQL數據庫內事務是否會回滾。 本章文章只涉及所需要測試的服務列表以及Seata配置部分。 用戶提交訂單購買商品大致分為以下幾個步驟&…

想學IT的必看!今年Android面試必問的這些技術面,架構師必備技能

第一次觀看我文章的朋友&#xff0c;可以關注、點贊、轉發一下&#xff0c;每天分享各種干貨技術和程序猿趣事 前言 職場的金三銀四跳槽季又來了&#xff0c;不同的是今年比往年「冷」一些&#xff0c;形式更加嚴峻一些&#xff0c;大家多多少少可能都聽到或看到一些信息&…

springboot集成redis使用redis作為session報錯ClassNotFoundException類RememberMeServices

springboot 集成redis使用redis作為緩存&#xff0c;會報錯的問題。 錯誤信息&#xff1a; java.lang.IllegalStateException: Error processing condition on org.springframework.boot.autoconfigure.task.TaskSchedulingAutoConfiguration.taskSchedulerat org.springframew…

阿里巴巴分布式事務利器Seata環境準備

阿里巴巴自從跟SpringCloud共同發起創建微服務開源社區時&#xff0c;開啟了SpringCloud Alibaba分支&#xff0c;而且在生態內提供了一款適用于分布式應用程序&#xff08;Dubbo、SpringCloud等&#xff09;的事務框架Seata&#xff0c;該框架經過多個大版本的發布&#xff0c…

對于‘敲什么都隊’自主開發的《校園服務》軟件的使用體驗

信1805-1 邊信哲 20183694 在六月十三日我系組織的2017級軟件工程交流大會中&#xff0c;我為第十一組敲什么都隊’自主開發的《校園服務》軟件投出了我的一票&#xff0c;在為數眾多的校園服務類軟件中&#xff0c;《校園服務》最吸引我的地方就是他們的軟件能完成數據…

阿里P7大牛親自教你!BAT這種大廠履歷意味著什么?積累總結

金九銀十過后各大網絡平臺都是各種面經分享&#xff0c;包括已收offer&#xff0c;或面試失敗的都有&#xff0c;相信大部分人都拿到了自己心儀的大廠offer&#xff0c;不過也有沒有少數沒能進到自己內心向往的大廠而懊惱的&#xff0c;那么到底如何才能進大廠&#xff0c;該準…

啟動mac版docker自帶的k8s

最近準備好好學習下k8s&#xff0c;為了圖方便&#xff0c;直接使用docker集成的k8s&#xff0c;但是網上找了一些教程但都沒能一次性成功&#xff0c;只好自己從頭跑一遍&#xff0c;順手寫個教程可以方便有類似需求的同學參考。 話不多說&#xff0c;直接上步驟。 1.下載doc…

yum安裝mysql

在CentOS7中默認安裝有MariaDB&#xff0c;這個是MySQL的分支&#xff0c;但為了需要&#xff0c;還是要在系統中安裝MySQL&#xff0c;而且安裝完成之后可以直接覆蓋掉MariaDB。 1. 下載并安裝MySQL官方的 Yum Repository 1[rootBrianZhu /]# wget -i -c http://dev.mysql.com…

springboot很多以來jar包是在外部當時候,如何打dockerfile到阿里云

首先保證springboot與各種jar包文件夾在同一目錄 dockerfile如下內容 FROM frolvlad/alpine-oraclejdk8 VOLUME /usr/cloud ADD lib /lib/ ADD lib_attachment /lib_attachment/ ADD lib_bigdata /lib_bigdata/ ADD lib_bpm /lib_bpm/ ADD lib_deploy /lib_deploy/ ADD lib_el…

阿里P7大牛手把手教你!一眼就能看懂的Android自學手冊,真香!

前言 曾聽過很多人說Android學習很簡單&#xff0c;做個App就上手了&#xff0c;工作機會多&#xff0c;畢業后也比較容易找工作。這種觀點可能是很多Android開發者最開始入行的原因之一。 在工作初期&#xff0c;工作主要是按照業務需求實現App頁面的功能&#xff0c;按照設…

【VScode】使用VScode 來寫markdown時序圖

準備工作在VScode中下載插件Markdown Preview Enhanced插件創建一個.md文件在VScode中打開文件&#xff0c;界面內點擊右鍵可以看到Open preview to the side(還有很多方法外面都能搜到)&#xff0c;可以進行實時預覽效果開始markdown第一行主標題&#xff08;次標題依次加#&am…

阿里P7大牛整理!BAT大廠面試基礎題集合,成功入職字節跳動

都說大廠面試必問源碼&#xff0c;可很多人看完MMKV 源碼、Handler 源碼、Binder 源碼、OkHttp 源碼等源碼記不住&#xff0c;是腦子有問題嗎&#xff1f;當然不是&#xff01;是因為你沒有掌握學習源碼的技巧。 我的朋友子路&#xff0c;很多人都叫他路神&#xff0c;稱他為“…