前言
一個網站上新用戶注冊,會寫個注冊頁面,如果用django寫個注冊頁面的流程呢?
本篇以post請求示例,從html頁面上輸入用戶注冊信息,提交到后台處理數據,然后傳參數據到User數據庫表里面
注冊頁面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頁面的請求參數,如何寫入User表,這張表前面已經創建過了,數據如下圖。
關於寫入User表操作參考前面一篇https://www.cnblogs.com/yoyoketang/p/10333417.html
# 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/
如果用戶名已經注冊過,頁面會給出提示,新用戶注冊成功后會跳轉到登錄頁面。