python測試開發django-25.表單提交之post註冊案例

前言

一個網站上新用戶註冊,會寫個註冊頁面,若是用django寫個註冊頁面的流程呢?
本篇以post請求示例,從html頁面上輸入用戶註冊信息,提交到後臺處理數據,而後傳參數據到User數據庫表裏面html

註冊頁面html

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

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.htmldjango

<!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, 跨站點僞造請求。服務器

舉例來說,某個惡意的網站上有一個指向你的網站的連接,若是某個用戶已經登陸到你的網站上了,那麼當這個用戶點擊這個惡意網站上的那個連接時,就會向你的網站發來一個請求,你的網站會覺得這個請求是用戶本身發來的,其實呢,這個請求是那個惡意網站僞造的。cookie

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頁面的請求參數,如何寫入User表,這張表前面已經建立過了,數據以下圖。
關於寫入User表操做參考前面一篇http://www.javashuo.com/article/p-ochaplro-be.htmlpost

# views.py
from django.shortcuts import render
from hello.models import User

# Create your views here.

def register(request):
    '''註冊頁面'''
    res = ""
    if request.method == "POST":
        username = request.POST.get('username')
        psw = request.POST.get('password')
        mail = request.POST.get('mail')

        # 先查詢數據庫是否有此用戶名
        user_lst = User.objects.filter(user_name=username)
        if user_lst:
            # 若是已經註冊過,就給個提示
            res = "%s用戶已被註冊" % username
            return render(request, 'register.html', {'rename': res})

        else:
            # 若是沒被註冊,插入數據庫

            # 第一種寫法 -- 推薦
            user = User()
            user.user_name = username
            user.psw = psw
            user.mail = mail
            user.save()

            # 第二種寫法
            # user = User(user_name=username,
            #            psw = psw,
            #            mail = mail,
            #            )
            # user.save()
            return render(request, 'login.html', {'rename': res})
    return render(request, 'register.html')

def login(request):
    '''登陸頁面'''
    return render(request, 'login.html')

urls.py訪問地址網站

from django.conf.urls import url
from hello import views

urlpatterns = [
    # 新增用戶
    url(r'^register/', views.register),
    url(r'^login/', views.login),
]

註冊頁面

瀏覽器輸入地址:http://localhost:8000/register/

若是用戶名已經註冊過,頁面會給出提示,新用戶註冊成功後會跳轉到登陸頁面。

相關文章
相關標籤/搜索