天天看點

Django視圖、傳參和forms驗證

簡介視圖

   主要内容:URLconf、HttpRequest對象、HttpResponse

1)視圖接受Web請求并且傳回Web響應

2)視圖就是一個python函數,被定義在views.py中

3)響應可以是一張網頁的HTML内容,一個重定向,一個404錯誤等等

4)在http請求中産生兩個核心對象,所在位置是,django.http:

http請求:HttpRequest對象

http響應:HttpResponse對象

這兩個對象是由django幫我構造的

 URLconf相關概述

• 在settings.py檔案中通過ROOT_URLCONF指定根級url的配置

• urlpatterns是一個url()執行個體的清單,我們把它稱為路由,它裡面的每一個url()我們稱為路由配置

• 一個url()對象包括:正規表達式、視圖函數、可選參數、名稱name

• 請求的url被看做是一個普通的python字元串,進行比對時不包括get或post請求的參數及域名。

字典Context={}上下文,在html頁面裡有參數時要封裝到字典裡作為render的第三個參數傳回也可以直接寫字典存變量    context={'name':'lm'}

在html模闆語言裡:模闆語言注釋{#顯示。。#}  在模闆裡顯示變量時用{{'name'}}用來顯示變量。(取消字典context的{})

for循環:

{% for num in b %} b為清單

{{num}}

{%endfor%}<br>

{% for key,value in c.items %}  #c為字典

{{key}}---->{{value}}

{% endfor %}<br>

{% if 條件 %} 滿足條件執行語句{% else %}不滿足條件的語句 {% endif %}   

 URL的反向解析(軟連接配接)

如果在視圖、模闆中使用寫死的連結,在urlconf發生改變時維護是一件非常麻煩的事情

解決:在做連結時,通過指向urlconf的名稱,也就是我們配置的namespace和name,動态生成連結位址

網頁模闆語言的路徑的表示"{% url 'namesapce(分發路徑的名字):name(url的别名)'%}"

視圖:使用django.core.urlresolvers.reverse()函數

在模闆語言中()[]是非法的用就報錯

路由配置

include這個方法,會把經過主路由比對成功後剩下的路徑,分發給我們app裡面的子路由去處理,它并不是嚴格比對,正則是沒有結束符$的,第一個參數代表分發給哪個路由配置檔案去處理,第二個參數namespace代表反向解析,和url()當中name參數作用類似。

主路由配置:主路由就是我們項目設定檔案夾當中和settings.py檔案同級的那個urls.py檔案裡面的urlpatterns。把主路由當作排程分發路由的工具。 首頁放在主路由

子路由:分成不同的app子產品(app裡配置urls.py檔案)主路由判斷分子路由操作

urlpatterns 裡的include為子路由分發。主路由的urlpatterns裡的url(r'^news/',include('news.urls',namespace="news")) news為應用子產品

路徑傳參(位置和關鍵詞)模闆語言在大括号裡{% url 'news:news_date'2018 4 20 %}

未命名正規表達式組傳參(位置傳參):url(r'/(\d+)/(\d+)/(\d+)/$')

Django視圖、傳參和forms驗證

視圖函數如下

Django視圖、傳參和forms驗證

命名正規表達式組傳參(關鍵字傳參):視圖函數中的參數可以是亂序

url(r'/(?P<year>\d+)/(?P<mouth>\d+)/(?p<day>\d+)/$')

Django視圖、傳參和forms驗證

請求方式傳參:模版語言傳參:{% url 'news:news_date'%}?name=lm&a=5 與url路徑無關

Django視圖、傳參和forms驗證

所有form表單送出都需要forms驗證,再前端form表單需要制定送出路徑 action="{% url 'users:user_register' %}"

與方式method="post"

在user的app中建立forms.py檔案,填寫驗證條件

from django import forms
from captcha.fields import CaptchaField
from .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個',
        'max_length': '密碼最多20個',
    })
    captcha = CaptchaField(error_messages={
        'invalid':'驗證碼錯誤'
    })
           

在views.py檔案中

from .forms import UserRegisterForm
def 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)#進行驗證
        if user_register_form.is_valid():#判斷是否合法
            email = user_register_form.cleaned_data['email']#擷取request資料
            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':'使用者已經存在'
                })
            else:
                a = UserProfile()
                a.username = email
                a.email = email
                a.set_password(password)#加密密碼
                a.si_active=False#設定密碼未激活,需要郵箱驗證激活
                a.save()
        else:
            return render(request,'users/register.html',{
                'user_register_form':user_register_form
            })           

獲得參數用:zhaoliying=request.GET.get('name',None)   GET類字典(可以一鍵多值用getlist取值)   None沒有參數預設傳回None。前端傳到後端的資料都為字元串

CSRF跨站僞造攻擊錯誤。在擷取POST方式傳遞的參數時,要取消錯誤在form表單裡加入 {% csrf_token %}

HttpReqeust對象

下面除非特别說明,屬性都是隻讀的,都是字元串

1)path:一個字元串,表示請求的頁面的完整路徑,不包含域名和請求參數

2)method:一個字元串,表示請求使用的HTTP方法,常用值包括:'GET'、'POST'

3)encoding:一個字元串,表示送出的資料的編碼方式

A)如果為None則表示使用浏覽器的預設設定,一般為utf-8

B)這個屬性是可寫的,可以通過修改它來修改通路表單資料使用的編碼,接下來對屬性的任何通路将使用新的encoding值

4)GET:一個類似于字典QueryDict的對象,包含get請求方式的所有參數,與url請求位址中的參數對應,位于?後面參數的格式是鍵值對,如key1=value1。多個參數之間,使用&連接配接。獲得參數用:data  =  request.GET.get(‘鍵’,預設)擷取

5)POST:一個類似于字典QueryDict的對象,包含post請求方式的所有參數。控件要有name屬性,則name屬性的值為鍵,value屬性的值為鍵,構成鍵值對送出。

獲得參數用:data  =  request.POST.get(‘鍵’,預設)擷取

6)FILES:一個類似于字典的對象,包含所有的上傳檔案

7)COOKIES:一個标準的Python字典,包含所有的cookie,鍵和值都為字元串

8)session:一個既可讀又可寫的類似于字典的對象,表示目前的會話,隻有當Django 啟用會話的支援時才可用,詳細内容見“狀态保持”

與python字典不同,QueryDict類型的對象用來處理同一個鍵帶有多個值的情況。

關于cookie的操作

1)Cookie,有時也用其複數形式 Cookies,指某些網站為了辨識使用者身份、進行 session 跟蹤而儲存在使用者本地終端上的資料(通常經過加密)。定義于 RFC2109 和 2965 中的都已廢棄,最新取代的規範是 RFC6265 [1]  。(可以叫做浏覽器緩存)

2)cookie是伺服器設定存儲在浏覽器的一段文本資訊,例如使用者登入的時候不用輸入密碼了。