django-自定義用戶登錄(個人筆記)
django自定義用戶登錄(個人筆記)
函數說明
1. render()函數:對用戶請求做出響應
2. path()函數:定義路由
3. create()函數:增加數據表記錄
配置settings.py
註冊app
確定創建的app在INSTALLED_APPS中註冊app
INSTALLED_APPS = [
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
'loginapp.apps.LoginappConfig',
]
連接資料庫
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.mysql', #資料庫類型
'NAME': 'logindb', #資料庫名稱
'USER': 'root', #資料庫用戶
'PASSWORD': 'yourpassword', #資料庫密碼
'HOST': '127.0.0.1', #本地伺服器地址
'PORT': '3306', #服務埠
}
}
配置自定義模板
不使用django提供的內置的templates,在項目目錄下創建html目錄放置自定義的html文件
TEMPLATES = [
{
'BACKEND': 'django.template.backends.django.DjangoTemplates',
'DIRS': [BASE_DIR / 'html']
,
'APP_DIRS': True,
'OPTIONS': {
'context_processors': [
'django.template.context_processors.debug',
'django.template.context_processors.request',
'django.contrib.auth.context_processors.auth',
'django.contrib.messages.context_processors.messages',
],
},
},
]
配置語言和時區
LANGUAGE_CODE = 'zh-hans'
TIME_ZONE = 'Asia/Shanghai'
USE_I18N = True
USE_L10N = True
USE_TZ = False
配置靜態文件目錄
在項目目錄下創建static目錄存放js、css等靜態文件
STATIC_URL = '/static/'
STATICFILES_DIRS = [
os.path.join(BASE_DIR, 'static')
]
配置根路由
在項目目錄下的urls.py中進行如下配置
urlpatterns = [
path('admin/', admin.site.urls),
path('login/', include('loginapp.urls'), name='login')
]
配置應用路由
在應用目錄下新建urls.py文件進行以下編寫
from django.urls import path
from loginapp import views
urlpatterns = [
path('register/', views.register, name='register'),
path('login/', views.login, name='login'),
path('index/', views.index, name='index'),
path('logout/', views.logout, name='logout')
]
創建用戶模型
from django.db import models
# Create your models here.
class User(models.Model):
username = models.CharField("用戶名", max_length=30, unique=True)
password = models.CharField("密碼", max_length=128)
def __str__(self):
return "用戶名" + self.username
用戶模型創建成功後使用以下命令進行數據表的生成和遷移
python manage.py makemigrations #生成數據表
python manage.py migrate (最好後面還加應用名稱,以免生成django自帶的大量的數據表)#遷移數據表到資料庫中
配置用戶註冊
#接受用戶請求
def register(request):
#請求傳輸方式判斷
if request.method == 'GET':
return render(request, '../html/register.html')
elif request.method == 'POST':
#接收用戶填寫的資訊
username = request.POST.get('username', '')
password = request.POST.get('password', '')
password1 = request.POST.get('password1', '')
# 驗證數據
if len(username) < 4:
username_error = '用戶名太短' # 用戶提示資訊
return render(request, 'register.html', locals())
if len(password1) == 0:
password_error = '密碼不能為空'
return render(request, 'register.html', locals())
if password1 != password:
password_error = '兩次輸入密碼不一致'
return render(request, 'register.html', locals())
try:
# 使用get方法取出資料庫中的資訊作比較
username = models.User.objects.get(username=username)
username_error = "用戶名已經存在"
return render(request, 'register.html', locals())
except:
# 密碼加密為密文密碼
hashcode = hashlib.md5()
hashcode.update(password1.encode())
password_m = hashcode.hexdigest()
# 創建新的用戶到資料庫中
username = models.User.objects.create(username=username, password=password_m)
successregister = """註冊成功! <a href='/login/login/'>進入登陸頁面</a>"""
return HttpResponse(successregister)
用戶登錄
def login(request):
if request.method == 'GET':
return render(request, '../html/login.html', locals())
if request.method == 'POST':
# 接收用戶填寫的資訊
username = request.POST.get('username', '')
password = request.POST.get('password', '')
if username == '':
username_error = '用戶名不能為空'
return render(request, '../html/login.html', locals())
if password == '':
password_error = '密碼不能為空'
# 將提示資訊放回到用戶頁面
return render(request, '../html/login.html', locals())
# 用戶密碼加密
m = hashlib.md5()
m.update(password.encode())
password_m = m.hexdigest()
# filter()用戶過濾查看用戶輸入的資訊和資料庫中存入的資訊比較後過濾出來。
# 更多的過濾器查詢方法可以參考我的上一篇隨筆 //www.cnblogs.com/hotboy393/p/14671889.html
user = User.objects.filter(username=username, password=password_m)
if not user:
username_error = 'Your password or username is wrong !!'
return render(request, '../html/login.html', locals())
return render(request, '../html/index.html', locals())
用戶退出
def logout(request):
# 登出/註銷
# 刪除session
if 'username' in request.session:
del request.session['username']
resp = HttpResponseRedirect('/login/login/')
# 刪除cookie
if 'username' in request.COOKIES:
resp.delete_cookie('username')
return resp
index.html內容
`<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>首頁</title>
</head>
<body>
{% if request.session and request.session.user %}
歡迎:{{ request.session.user.username }}
{% else %}
<a href="/login/logout/">退出登錄</a>
<a href="/login/login/">登錄</a>
<a href="/login/register/">註冊</a>
{% endif %}
</body>
</html>`
login.html內容
`<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>用戶登錄</title>
<style>
div > span{
color: red;
}
div > label{
display: inline-block;
width: 80px;
}
</style>
</head>
<body>
<form action="/login/login/" method="post">
<div>
<label>用戶名</label>
<input type="text" name="username" value="{{ username }}"> {#將用戶輸入資訊傳遞到views視圖中#}
<span>{{ username_error }}</span>{#接收view視圖中的錯誤提示資訊#}
</div>
<div>
<label>密碼</label>
<input type="password" name="password" value="{{ password }}">
<span>{{ password_error }}</span>
</div>
<div>
<input type="submit" value="登錄">
</div>
</form>
</body>
</html>`
register.html內容
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>用戶註冊</title>
<style>
div > span{
color: red;
}
div > label{
display: inline-block;
width: 80px;
}
</style>
</head>
<body>
<form action="/login/register/" method="post">
<div>
<label>用戶名</label>
<input type="text" name="username" value="{{ username }}">
<span>{{ username_error }}</span>
</div>
<div>
<label>密碼</label>
<input type="password" name="password" value="{{ password }}">
<span>{{ passord_error }}</span>
</div>
<div>
<label>確認密碼</label>
<input type="password" name="password1" value="{{ password1 }}">
<span>{{ password_error }}</span>
{#接收view視圖中的值#}
</div>
<div>
<input type="submit" value="註冊">
</div>
</form>
</body>
</html>`