Django視圖、傳參和forms驗(yàn)證操作
簡介視圖
主要內(nèi)容:URLconf、HttpRequest對(duì)象、HttpResponse
1)視圖接受Web請(qǐng)求并且返回Web響應(yīng)
2)視圖就是一個(gè)python函數(shù),被定義在views.py中
3)響應(yīng)可以是一張網(wǎng)頁的HTML內(nèi)容,一個(gè)重定向,一個(gè)404錯(cuò)誤等等
4)在http請(qǐng)求中產(chǎn)生兩個(gè)核心對(duì)象,所在位置是,django.http:
http請(qǐng)求:HttpRequest對(duì)象
http響應(yīng):HttpResponse對(duì)象
這兩個(gè)對(duì)象是由django幫我構(gòu)造的
URLconf相關(guān)概述
• 在settings.py文件中通過ROOT_URLCONF指定根級(jí)url的配置
• urlpatterns是一個(gè)url()實(shí)例的列表,我們把它稱為路由,它里面的每一個(gè)url()我們稱為路由配置
• 一個(gè)url()對(duì)象包括:正則表達(dá)式、視圖函數(shù)、可選參數(shù)、名稱name
• 請(qǐng)求的url被看做是一個(gè)普通的python字符串,進(jìn)行匹配時(shí)不包括get或post請(qǐng)求的參數(shù)及域名。
字典Context={}上下文,在html頁面里有參數(shù)時(shí)要封裝到字典里作為render的第三個(gè)參數(shù)返回也可以直接寫字典存變量 context={’name’:’lm’}
在html模板語言里:模板語言注釋{#顯示。。#} 在模板里顯示變量時(shí)用{{’name’}}用來顯示變量。(取消字典context的{})
for循環(huán):
{% for num in b %} b為列表
{{num}}
{%endfor%}<br>
{% for key,value in c.items %} #c為字典
{{key}}---->{{value}}
{% endfor %}<br>
{% if 條件 %} 滿足條件執(zhí)行語句{% else %}不滿足條件的語句 {% endif %}
URL的反向解析(軟連接)
如果在視圖、模板中使用硬編碼的鏈接,在urlconf發(fā)生改變時(shí)維護(hù)是一件非常麻煩的事情
解決:在做鏈接時(shí),通過指向urlconf的名稱,也就是我們配置的namespace和name,動(dòng)態(tài)生成鏈接地址
網(wǎng)頁模板語言的路徑的表示'{% url ’namesapce(分發(fā)路徑的名字):name(url的別名)’%}'
視圖:使用django.core.urlresolvers.reverse()函數(shù)
在模板語言中()[]是非法的用就報(bào)錯(cuò)
路由配置
include這個(gè)方法,會(huì)把經(jīng)過主路由匹配成功后剩下的路徑,分發(fā)給我們app里面的子路由去處理,它并不是嚴(yán)格匹配,正則是沒有結(jié)束符$的,第一個(gè)參數(shù)代表分發(fā)給哪個(gè)路由配置文件去處理,第二個(gè)參數(shù)namespace代表反向解析,和url()當(dāng)中name參數(shù)作用類似。
主路由配置:主路由就是我們項(xiàng)目設(shè)置文件夾當(dāng)中和settings.py文件同級(jí)的那個(gè)urls.py文件里面的urlpatterns。把主路由當(dāng)作調(diào)度分發(fā)路由的工具。 首頁放在主路由
子路由:分成不同的app模塊(app里配置urls.py文件)主路由判斷分子路由操作
urlpatterns 里的include為子路由分發(fā)。主路由的urlpatterns里的url(r’^news/’,include(’news.urls’,namespace='news')) news為應(yīng)用模塊
路徑傳參(位置和關(guān)鍵詞)模板語言在大括號(hào)里{% url ’news:news_date’2018 4 20 %}
未命名正則表達(dá)式組傳參(位置傳參):url(r’/(d+)/(d+)/(d+)/$’)
視圖函數(shù)如下
命名正則表達(dá)式組傳參(關(guān)鍵字傳參):視圖函數(shù)中的參數(shù)可以是亂序
url(r’/(?P<year>d+)/(?P<mouth>d+)/(?p<day>d+)/$’)
請(qǐng)求方式傳參:模版語言傳參:{% url ’news:news_date’%}?name=lm&a=5 與url路徑無關(guān)
所有form表單提交都需要forms驗(yàn)證,再前端form表單需要制定提交路徑 action='{% url ’users:user_register’ %}'
與方式method='post'
在user的app中創(chuàng)建forms.py文件,填寫驗(yàn)證條件
from django import formsfrom captcha.fields import CaptchaFieldfrom .models import UserProfile,EmailVerify class UserRegisterForm(forms.Form): email = forms.EmailField(required=True,error_messages={ ’required’:’郵箱必須填寫’ }) password = forms.CharField(min_length=3,max_length=20,required=True,error_messages={ ’required’: ’密碼必須填寫’, ’min_length’:’密碼最少得3個(gè)’, ’max_length’: ’密碼最多20個(gè)’, }) captcha = CaptchaField(error_messages={ ’invalid’:’驗(yàn)證碼錯(cuò)誤’ })
在views.py文件中
from .forms import UserRegisterFormdef user_register(request): if request.method == ’GET’: user_register_form = UserRegisterForm() return render(request,’users/register.html’,{ ’user_register_form’:user_register_form }) else: user_register_form = UserRegisterForm(request.POST)#進(jìn)行驗(yàn)證 if user_register_form.is_valid():#判斷是否合法 email = user_register_form.cleaned_data[’email’]#獲取request數(shù)據(jù) password = user_register_form.cleaned_data[’password’] user = UserProfile.objects.filter(Q(email=email)|Q(username=email)) if user: return render(request,’users/register.html’,{ ’msg’:’用戶已經(jīng)存在’ }) else: a = UserProfile() a.username = email a.email = email a.set_password(password)#加密密碼 a.si_active=False#設(shè)置密碼未激活,需要郵箱驗(yàn)證激活 a.save() else: return render(request,’users/register.html’,{ ’user_register_form’:user_register_form })
獲得參數(shù)用:zhaoliying=request.GET.get(’name’,None) GET類字典(可以一鍵多值用getlist取值) None沒有參數(shù)默認(rèn)返回None。前端傳到后端的數(shù)據(jù)都為字符串
CSRF跨站偽造攻擊錯(cuò)誤。在獲取POST方式傳遞的參數(shù)時(shí),要取消錯(cuò)誤在form表單里加入 {% csrf_token %}
HttpReqeust對(duì)象
下面除非特別說明,屬性都是只讀的,都是字符串
1)path:一個(gè)字符串,表示請(qǐng)求的頁面的完整路徑,不包含域名和請(qǐng)求參數(shù)
2)method:一個(gè)字符串,表示請(qǐng)求使用的HTTP方法,常用值包括:’GET’、’POST’
3)encoding:一個(gè)字符串,表示提交的數(shù)據(jù)的編碼方式
A)如果為None則表示使用瀏覽器的默認(rèn)設(shè)置,一般為utf-8
B)這個(gè)屬性是可寫的,可以通過修改它來修改訪問表單數(shù)據(jù)使用的編碼,接下來對(duì)屬性的任何訪問將使用新的encoding值
4)GET:一個(gè)類似于字典QueryDict的對(duì)象,包含get請(qǐng)求方式的所有參數(shù),與url請(qǐng)求地址中的參數(shù)對(duì)應(yīng),位于?后面參數(shù)的格式是鍵值對(duì),如key1=value1。多個(gè)參數(shù)之間,使用&連接。獲得參數(shù)用:data = request.GET.get(‘鍵’,默認(rèn))獲取
5)POST:一個(gè)類似于字典QueryDict的對(duì)象,包含post請(qǐng)求方式的所有參數(shù)??丶衝ame屬性,則name屬性的值為鍵,value屬性的值為鍵,構(gòu)成鍵值對(duì)提交。獲得參數(shù)用:data = request.POST.get(‘鍵’,默認(rèn))獲取
6)FILES:一個(gè)類似于字典的對(duì)象,包含所有的上傳文件
7)COOKIES:一個(gè)標(biāo)準(zhǔn)的Python字典,包含所有的cookie,鍵和值都為字符串
8)session:一個(gè)既可讀又可寫的類似于字典的對(duì)象,表示當(dāng)前的會(huì)話,只有當(dāng)Django 啟用會(huì)話的支持時(shí)才可用,詳細(xì)內(nèi)容見“狀態(tài)保持”與python字典不同,QueryDict類型的對(duì)象用來處理同一個(gè)鍵帶有多個(gè)值的情況。
關(guān)于cookie的操作
1)Cookie,有時(shí)也用其復(fù)數(shù)形式 Cookies,指某些網(wǎng)站為了辨別用戶身份、進(jìn)行 session 跟蹤而儲(chǔ)存在用戶本地終端上的數(shù)據(jù)(通常經(jīng)過加密)。定義于 RFC2109 和 2965 中的都已廢棄,最新取代的規(guī)范是 RFC6265 [1] 。(可以叫做瀏覽器緩存)
2)cookie是服務(wù)器設(shè)置存儲(chǔ)在瀏覽器的一段文本信息,例如用戶登錄的時(shí)候不用輸入密碼了。
以上這篇Django視圖、傳參和forms驗(yàn)證操作就是小編分享給大家的全部內(nèi)容了,希望能給大家一個(gè)參考,也希望大家多多支持好吧啦網(wǎng)。
相關(guān)文章:
1. Python如何批量生成和調(diào)用變量2. ASP.NET MVC實(shí)現(xiàn)橫向展示購物車3. ASP.Net Core對(duì)USB攝像頭進(jìn)行截圖4. .net如何優(yōu)雅的使用EFCore實(shí)例詳解5. ASP.Net Core(C#)創(chuàng)建Web站點(diǎn)的實(shí)現(xiàn)6. python 爬取京東指定商品評(píng)論并進(jìn)行情感分析7. python基礎(chǔ)之匿名函數(shù)詳解8. Python獲取B站粉絲數(shù)的示例代碼9. ajax動(dòng)態(tài)加載json數(shù)據(jù)并詳細(xì)解析10. 通過CSS數(shù)學(xué)函數(shù)實(shí)現(xiàn)動(dòng)畫特效
