Django認(rèn)證系統(tǒng)實(shí)現(xiàn)的web頁(yè)面實(shí)現(xiàn)代碼
結(jié)合數(shù)據(jù)庫(kù)、ajax、js、Djangoform表單和認(rèn)證系統(tǒng)的web頁(yè)面
一:數(shù)據(jù)模塊
擴(kuò)展了Django中的user表,增加了自定義的字段
from django.db import models from django.contrib.auth.models import AbstractUser # Create your models here. class UserInfo(AbstractUser): phone = models.CharField(max_length=11) gender = models.CharField(max_length=2)
二:路由系統(tǒng)
from django.conf.urls import url from django.contrib import admin from app01 import views urlpatterns = [ url(r'^admin/', admin.site.urls), url(r'^register/',views.register), url(r'^login/',views.login_view), url(r'^home/',views.home), url(r'^logout/',views.logout_view), url(r'^modify_pwd/',views.modify_pwd), url(r'^$',views.home), ]
三:視圖系統(tǒng)
from django.shortcuts import render, redirect
from django.contrib.auth.decorators import login_required
from django.http import JsonResponse
from django.contrib.auth import authenticate, login,logout
from app01 import forms
from app01.models import UserInfo
# Create your views here.
def register(request):
form_obj = forms.Reg_form()
if request.method == 'POST':
form_obj = forms.Reg_form(request.POST)
if form_obj.is_valid():
info_dic = form_obj.cleaned_data
sex_dic = {'1':'男','2':'女','3':'保密'}
info_dic['gender']=sex_dic[info_dic['gender']]
UserInfo.objects.create_user(
username=info_dic['username'],
password = info_dic['pwd'],
gender=info_dic['gender'],
phone =info_dic['phone']
)
return redirect('/login/')
return render(request, "register.html",{'form_obj':form_obj})
def login_view(request):
if request.method == 'POST':
username = request.POST.get('username')
pwd = request.POST.get('pwd')
user = authenticate(username=username, password=pwd)
if user:
login(request, user)
data = {'code':1}
else:
data = {'code': 0,'msg':'用戶名或密碼錯(cuò)誤'}
return JsonResponse(data)
return render(request, 'login.html')
@login_required
def logout_view(request):
logout(request)
return redirect('/login/')
@login_required
def home(request):
user_id = request.session['_auth_user_id']
use_obj = request.user
return render(request,'home.html',{'user':use_obj})
@login_required
def modify_pwd(request):
if request.method == 'POST':
old_pwd = request.POST.get('old_pwd')
pwd = request.POST.get('pwd')
re_pwd = request.POST.get('re_pwd')
user_obj = request.user
if user_obj.check_password(old_pwd):
if re_pwd == pwd:
user_obj.set_password(pwd)
user_obj.save()
data = {'code': 1}
else:
data = {'code': 0, 'msg': '兩次輸入密碼不一致'}
else:
data = {'code': 0, 'msg': '原始密碼輸入錯(cuò)誤'}
return JsonResponse(data)
return render(request,'modify_pwd.html')
四:form表單
#!/usr/bin/env python
# -*- coding: UTF-8 -*-
# Author:YiJun
from django import forms
from app01 import models
from django.forms import widgets
from django.core.exceptions import ValidationError # 導(dǎo)入異常
import re
# Create your views here.
class Reg_form(forms.Form):
# 用戶名表單
username = forms.CharField(
min_length=4,
label="設(shè)置用戶名",
error_messages={
"required": "不能為空",
"invalid": "格式錯(cuò)誤",
"min_length": "用戶名最少4個(gè)字符"
},
widget=widgets.TextInput(
attrs={
'class': "form-control",
'placeholder': '用戶名'
})
)
# 用戶密碼設(shè)置表單
pwd = forms.CharField(
min_length=6,
label="設(shè)置密碼",
widget=forms.widgets.PasswordInput(
attrs={
'class': 'form-control',
'placeholder': '密碼'},
render_value=True,
),
error_messages={
"required": "不能為空",
"invalid": "格式錯(cuò)誤",
"min_length": "密碼至少6位"
}
)
# 用戶密碼確認(rèn)表單
r_pwd = forms.CharField(
min_length=6,
label="確認(rèn)密碼",
widget=forms.widgets.PasswordInput(
attrs={
'class': 'form-control',
'placeholder': '確認(rèn)密碼'},
render_value=True,
),
error_messages={
"required": "不能為空",
"invalid": "格式錯(cuò)誤",
"min_length": "密碼至少6位"
}
)
# 用戶性別選擇表單
gender = forms.ChoiceField(
choices=((1, "男"), (2, "女"), (3, "保密")),
label="性別",
initial=3,
widget=forms.widgets.RadioSelect
)
# 用戶手機(jī)號(hào)碼表單
phone = forms.CharField(
label="手機(jī)號(hào)碼",
max_length=11,
min_length=11,
error_messages={
"required": "不能為空",
"invalid": "格式錯(cuò)誤",
"min_length": "手機(jī)號(hào)碼至少11位",
"max_length": "手機(jī)號(hào)碼最多11位",
},
widget=widgets.TextInput(attrs={'class': "form-control",'placeholder': '手機(jī)號(hào)碼'})
)
def clean_phone(self):
value = self.cleaned_data['phone']
expression = re.compile('^1[3589][0-9]{9}')
if not expression.search(value).group():
raise ValidationError('請(qǐng)輸入正確的手機(jī)號(hào)碼')
else:
return value
def clean_username(self):
value = self.cleaned_data['username']
if models.UserInfo.objects.filter(username=value):
raise ValidationError('用戶名已經(jīng)注冊(cè)')
else:
return value
def clean(self):
pwd = self.cleaned_data.get("pwd")
r_pwd = self.cleaned_data.get("r_pwd")
if pwd != r_pwd:
self.add_error("r_pwd", "兩次輸入的密碼不一致!")
# 兩次輸入的密碼不一致
raise ValidationError("兩次輸入的密碼不一致!")
else:
self.cleaned_data.pop('r_pwd')
return self.cleaned_data
五:模板系統(tǒng)
注冊(cè)頁(yè)面
<!doctype html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport"
content="width=device-width, user-scalable=no, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0">
<meta http-equiv="X-UA-Compatible" content="ie=edge">
<link rel="stylesheet" href="/static/bootstrap-3.3.7/css/bootstrap.min.css" rel="external nofollow" >
<title>Document</title>
</head>
<body>
<div class="container">
<div class="row" style="margin-top: 50px">
<div class="panel panel-primary">
<div class="panel-heading"><h4>用戶詳細(xì)信息</h4></div>
<div class="panel-body">
</div>
<!-- Table -->
<div class="table-responsive">
<table class="table table-bordered">
<thead>
<tr>
<th>#</th>
<th>用戶名</th>
<th>手機(jī)號(hào)碼</th>
<th>上次登陸時(shí)間</th>
<th>注冊(cè)時(shí)間</th>
<th>用戶性別</th>
</tr>
</thead>
<tbody>
<tr>
<th scope="row">1</th>
<td>{{ user.username }}</td>
<td>{{ user.phone }}</td>
<td>{{ user.last_login|date:'Y-m-d H:i:s' }}</td>
<td>{{ user.date_joined|date:'Y-m-d H:i:s' }}</td>
<td>{{ user.gender }}</td>
</tr>
</tbody>
</table>
</div>
</div>
<div style="margin-top: 20px">
<a class="btn btn-info " href="/modify_pwd/" rel="external nofollow" >修改密碼</a>
<a class="btn btn-danger pull-right" href="/logout/" rel="external nofollow" >注銷</a>
</div>
</div>
</div>
<script src="/static/jquery-3.3.1.min.js"></script>
<script src="/static/bootstrap-3.3.7/js/bootstrap.min.js"></script>
</body>
</html>
home.html
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
Python使用 Beanstalkd 做異步任務(wù)處理的方法
這篇文章主要介紹了Python使用 Beanstalkd 做異步任務(wù)處理的方法,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2018-04-04
Python PyQt5模塊實(shí)現(xiàn)一個(gè)瀏覽器的示例代碼
在項(xiàng)目開發(fā)中,有的應(yīng)用程序可以運(yùn)行在web瀏覽器,本文主要介紹了Python PyQt5模塊實(shí)現(xiàn)一個(gè)瀏覽器的示例代碼,分享給大家,感興趣的可以了解一下2021-07-07
matplotlib繪圖實(shí)例演示標(biāo)記路徑
這篇文章主要介紹了matplotlib繪圖實(shí)例演示標(biāo)記路徑,分享了相關(guān)代碼示例,小編覺得還是挺不錯(cuò)的,具有一定借鑒價(jià)值,需要的朋友可以參考下2018-01-01
Python的getattr函數(shù)方法學(xué)習(xí)使用示例
這篇文章主要為大家介紹了Python的getattr方法學(xué)習(xí)使用示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-08-08
opencv中圖像疊加/圖像融合/按位操作的實(shí)現(xiàn)
這篇文章主要介紹了opencv中圖像疊加/圖像融合/按位操作的實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-04-04

