1. 程式人生 > 實用技巧 >python測試開發django(23)--表單提交之post註冊案例

python測試開發django(23)--表單提交之post註冊案例

前言

一個網站上新使用者註冊,會寫個註冊頁面,如果用django寫個註冊頁面的流程呢?

本篇以post請求示例,從html頁面上輸入使用者註冊資訊,提交到後臺處理資料,然後傳引數據到users資料庫表裡面。

註冊頁面html

註冊頁面設計,需輸入使用者名稱(必填)、密碼(必填)、郵箱(非必填),點註冊按鈕提交表單

templates/register.html

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>註冊頁面</title>
</head>
<body>
<h1>新使用者註冊</h1>
<form action="" method="post">
    {% csrf_token %}
    <p>
        使用者名稱:<input type="text" id="id_username" name="username",required="required"> * {{rename}}

    </p>
    <p>
        密碼:<input type="text" id="id_username" name="password",required="required"> *
    </p>
    <p>
        註冊郵箱:<input type="text" id="id_username" name="mail">
    </p>
    <p>
        <input type="submit" value="註冊">
    </p>
</form>
</body>
</html>

註冊成功後,希望能跳轉到使用者登入頁面,所以還需要寫個登入頁面的html,登入邏輯暫時沒寫

templates/login.html

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>登入頁面</title>
</head>
<body>
<h1>歡迎登入</h1>
<form action="/" method="post">
    {% csrf_token %}
    <p>
        使用者名稱:<input type="text" id="id_username" name="username",required="required">*
    </p>
    <p>
        密碼:<input type="text" id="id_username" name="password",required="required">*
    </p>
    <p>
        <input type="submit" value="登入">
    </p>
</form>
</body>
</html>   

post請求form下面加個{% csrf_token %}防止跨站點偽造請求

csrf_token

CSRF, Cross Site Request Forgery, 跨站點偽造請求。

舉例來講,某個惡意的網站上有一個指向你的網站的連結,如果某個使用者已經登入到你的網站上了,那麼當這個使用者點選這個惡意網站上的那個連結時,就會向你的網站發來一個請求,你的網站會以為這個請求是使用者自己發來的,其實呢,這個請求是那個惡意網站偽造的。

django 第一次響應來自某個客戶端的請求時,會在伺服器端隨機生成一個 token,把這個 token 放在 cookie 裡。然後每次 POST 請求都會帶上這個 token,這樣就能避免被 CSRF 攻擊。

  • 在返回的 HTTP 響應的 cookie 裡,django 會為你新增一個 csrftoken 欄位,其值為一個自動生成的 token
  • 在所有的 POST 表單時,必須包含一個 csrfmiddlewaretoken 欄位 (只需要在模板里加一個 tag, django 就會自動幫你生成)
  • 在處理 POST 請求之前,django 會驗證這個請求的 cookie 裡的 csrftoken 欄位的值和提交的表單裡的 csrfmiddlewaretoken 欄位的值是否一樣。如果一樣,則表明這是一個合法的請求,否則,這個請求可能是來自於別人的 csrf 攻擊,返回 403 Forbidden.
  • 在所有 ajax POST 請求裡,新增一個 X-CSRFTOKEN header,其值為 cookie 裡的 csrftoken 的值

檢視與urls

接下來寫個檢視函式接收register.html頁面的請求引數,如歌寫如users表,這張表前面已經建立過了,資料如下圖。

views.py

#coding:utf-8
from django.shortcuts import render
from django.http import HttpResponse
from .models import Users
# Create your views here.
def register(request):
    rs=""
    if request.method=="POST":
        username=request.POST.get('username')
        pwd=request.POST.get('password')
        mail=request.POST.get('mail')

        #先查詢資料庫是否有此使用者名稱
        euser=Users.objects.filter(user_name=username)
        if euser:
            rs="{}使用者已被註冊".format(username)
            return render(request,'register.html',{'rename':rs})
        else:
            #如果沒被註冊,插入資料庫
            #方式1
            user=Users()
            user.user_name=username
            user.pwd=pwd
            user.mail=mail
            user.save()
            return render(request,'login.html')
    return render(request,'register.html')

def login(request):
    return render(request,'login.html')

urls.py訪問地址

#helloworld/helloworld/urls.py
from django.conf.urls import url
from . import testdb
from xjyn import views

urlpatterns=[
   url('^r/',views.register),
   url('^login/',views.login),
]

 註冊頁面

 

如果使用者名稱已經註冊過,頁面會給出提示,新使用者註冊成功後會跳轉到登入頁面。