Django請求

1、Django請求

  • 一、常見的請求方式html

    默認頁面請求都是get請求 視圖函數中request是傳遞到視圖的請求,裏面包含請求的各類參數前端

    經常使用的請求方式get和post:python

    • get:默認是get請求,請求數據以明文形式放在路由上,get的格式是以?開頭,鍵等於值的形式,以&來分割鍵值對,一般用於向服務器獲取資源 www.baidu.com/s?wd=張三&…正則表達式

    • post:請求數據隱藏發送,安全係數更高。一般用於向服務器提交資源數據庫

  • 二、請求對象django

​ 視圖函數中request是傳遞到視圖的請求對象,包含了本次請求全部的信息後端

def index(request):
    return render(request, "index.html")
複製代碼

request對象的類型是django.http.HttpRequest,經常使用屬性如表所示:瀏覽器

方法 說明
request.GET 獲取get請求數據的方法
request.POST 獲取post請求數據的方法
request.FILES 獲取文件上傳請求數據的方法
request.method 獲取請求的方法
request.META 請求的詳細參數
request.META.OS 請求端系統
request.META.HTTP_USER_AGENT 用戶請求頭,返回請求瀏覽器版本
request.META.HTTP_HOST 請求的主機
request.META.HTTP_REFERER 請求的來源

2、CSRF

跨站請求僞造,是一種挾制用戶在當前已登陸的Web應用程序上執行非本意的操做的攻擊方法安全

在社交工程的一點幫助下(例如經過電子郵件或聊天發送連接), 攻擊者可能會誘騙Web應用程序的用戶執行攻擊者選擇的操做服務器

3、Django表單

  • HTML表單

    屬性 說明
    action 提交的地址,默認是當前路由
    method 提交的方法,默認是get
    name 用來作傳參的標識
    submit 會自動提交當前表單的數據
  • 後端處理

    def register(request):
        """註冊"""
        if request.method == "GET":  # GET跳轉頁面
            return render(request, "register.html")
        else:  # POST處理提交
            # 獲取參數
            name = request.POST.get("name")
            password = request.POST.get("password")
            # 建立對象並新增
            # Seller.objects.create(
            # name=name,
            # password=encryption_md5(password)
            # )
            # 建立對象
            seller = Seller()
            seller.name = name
            seller.password = encryption_md5(password)
            # 新增
            seller.save()
            # 響應
            return HttpResponse("註冊成功")
    複製代碼
  • 註釋掉CSRF 中間件 CSRF跨站請求僞造:使用當前瀏覽器還在生效狀態的cookie對指定網站進行操做。最初針對的是銀行網站的轉帳

  • 在Django的任何post請求,都會在請求之初,給用戶下發一下串用來校驗身份的編碼,而且每次請求不同,若是不加CSRF校驗,會發生CSRF錯誤

  • 使用Django的CSRF校驗

    一、返回post登錄頁面的時候要用render方法,render方法和render_to_response方法的功能相似,可是會在第一個參數返回request,若是不返回request,前端沒法調用 {% csrf_token %}

    在form表單內部的第一行,插入CSRF 校驗,使用{% csrf_token %}

4、Django表達類

  • 表單類介紹

    用戶表單是Web端的一項基本功能,大而全的Django框架中天然帶有現成的基礎Form對象 Form表單的功能:

    一、自動生成HTML表單元素

    二、檢查表單數據的合法性(後端驗證)

    三、若是驗證錯誤,從新顯示錶單(數據不會重置)

    四、數據類型轉換(字符類型的數據轉換成相應的Python類型)

    Django表單類,帶有先後端驗證的 一、前端驗證: Django表單類對象渲染到模板後,會變成HTML附帶屬性標籤,這些是屬性通常是HTML5的屬性,能夠交互

    from django import forms from django.core.validators import RegexValidator,ValidationError

    (1)、建立表單類

    from django import forms
    from django.core.validators import ValidationError, RegexValidator
    
    
    class LoginForm(forms.Form):
        """登陸驗證的表單類"""
        name = forms.CharField(
            required=True,
            max_length=10,
            min_length=2,
            error_messages={
                "required":"用戶名必填",
                "max_length":"用戶名不能超過十位",
                "min_length":"用戶名至少是兩位"
            })
        password = forms.CharField(
            required=True,
            error_messages={
                "required": "密碼必填",
            })
    複製代碼

    (2)、模板頁面

    <div class="form-group">
    <input type="text" class="form-control form-control-user" name="name" id="username" placeholder="用戶名" value="{{ login_form.data.name }}">
    <label>{{ login_form.errors.name.0 }}</label>
    </div>
    複製代碼

    (3)、視圖

    def login(request):
        """登陸"""
        login_form = LoginForm()
        if request.method == "GET":  # GET跳轉頁面
            return render(request, "login.html", locals())
        else:  # POST處理提交
            # 獲取參數,放入表單校驗
            login_form = LoginForm(request.POST)
            # 判斷校驗是否成功
            if login_form.is_valid():  # 驗證成功
                # 獲取參數
                name = login_form.cleaned_data.get("name")
                password = login_form.changed_data("password")
                # 查詢
                seller = Seller.objects.filter(name=name, password=encryption_md5(password)).first()
                # 判斷
                if seller:
                    return redirect("/index/")
                else:
                    return redirect("/login/")
            else:
                return render(request, "login.html", locals())
    複製代碼

5、Django 表單校驗

在驗證某個字段的時候,能夠傳遞一個validators參數用來指定驗證器,進一步對數據進行過濾驗證器有不少,可是不少驗證器咱們其實已經經過這個Field或者一些參數就能夠指定了

好比EmailValidator,咱們能夠經過EmailField來指定,好比MaxValueValidator,咱們能夠經過max_value參數來指定

如下是一些經常使用的驗證器:

驗證器 描述
MaxValueValidator 驗證最大值
MinValueValidator 驗證最小值
MinLengthValidator 驗證最小長度
MaxLengthValidator 驗證最大長度
EmailValidator 驗證是不是郵箱格式
URLValidator 驗證是不是URL格式
RegexValidator 正則表達式的驗證
  • 自定義校驗

    Django表單類也提供了對特定字段的自定義驗證,在Form類中定義實例方法,方法名字是"clearn_驗證的字段名",若是驗證失敗,拋出ValidationError異常,不然正常返回值

    在前端能夠回顯異常信息

  • forms.py

    # 自定義驗證器
    class MyValidator:
        def __call__(self, value):
            """ 自定義驗證 :param value: value表示要驗證的數據 :return: 若是ValidationError表示驗證失敗 正常結束表驗證經過 """
            datas = ["sb", "xx"]
            for data in datas:
                if value.find(data) != -1:
                    raise ValidationError("用戶名不能含有敏感詞彙")
    
                    
    class RegisterForm(forms.Form):
        """註冊驗證的表單類"""
        name = forms.CharField(
            required=True,
            validators=[
                # 2-10位的字符數字下劃線
                RegexValidator(r"^[a-zA-Z0-9_]{2,10}$", "用戶名只能是長度2-10位字母數字下劃線"),
                # 自定義驗證器
                MyValidator()
            ],
            error_messages={
                "required": "用戶名必填",
            }
        )
        password = forms.CharField(
            required=True,
            error_messages={
                "required": "密碼必填"
            }
        )
    
    複製代碼
    #### 5、Django會話機制
    複製代碼
  • cookie

    設置時間:默認是用的UTC,與當前咱們本地時間錯了8小時。 TIME_ZONE=’Asia/Shanghai’ USE_TZ=False

    cookie的操做

    response獲取的方式有: (1) response = HttpResponse(「xx」) (2) response = render(request,」xx.html」) (3) response = redirect(「/index」)

    一、建立cookie response.set_cookie(鍵,值,有效期) 有效期單位是秒

    二、刪除cookie response.delete_cookie(鍵)

    三、獲取cookie request.cookie.get(鍵)

  • sesison

    session是基於cookie實現的。 Django中默認配置把session數據存儲到了數據庫中。 設置session

    session的操做

    一、建立session request.session[鍵] = 值 有效期默認是2周 能夠修改 request.session.set_expiry(時間)單位是秒

    二、獲取session request.session.get(鍵)

    三、刪除session del request.session[鍵] 刪除一個鍵值對 request.session.clear() 刪除全部鍵值對

    想一想服務器獲取不到session有幾種狀況:

    一、客戶端沒有發來sessionid 二、客戶端發來sessionid,可是從數據庫中找不到 三、客戶端發來sessionid,從數據庫中找到了,可是過時了

相關文章
相關標籤/搜索