Django(part38)--制作登录界面
學習筆記,僅供參考,有錯必究
文章目錄
- 制作登錄界面
- 第一步
- 第二步
- 第三步
- 第四步
制作登錄界面
我們基于博客Django(part36)–cookies的mywebsite_bookstore項目,制作一個登錄頁面。
第一步
我先做一個簡易版的頁面,只有提交表單數據的功能,沒有其他功能。
首先,我們在userinfo文件夾下,創建一個userinfo應用的模板文件夾templates,在templates文件夾下再創建一個userinfo文件夾,在userinfo文件夾下創建一個模板文件login.html:
<!DOCTYPE html> <html lang="en"> <head><meta charset="UTF-8"><title>登陸</title> </head> <body> <form action="/userinfo/login/" method="POST"><div><lable>用戶名</lable><input type="text" name="username"value="{{ username }}"></div><div><lable>密碼</lable><input type="password" name="password"></div><div><lable for="id_remember">記住密碼</lable><input type="checkbox" name="remember" id="id_remember"value="1"></div><div><input type="submit" value="登陸"></div></form></body> </html>在userinfo應用下的views.py文件中,定義一個視圖函數:
from django.shortcuts import render from django.http import HttpResponse from django.http import HttpResponseRedirect from . import modelsdef mylogin(request):if request.method == 'GET':username = request.COOKIES.get('username', '')return render(request, 'userinfo/login.html', locals())elif request.method == 'POST':resp = HttpResponse('登陸成功')return resp我們在userinfo應用下創建一個urls.py文件,并加入路由:
from django.urls import re_pathfrom . import views urlpatterns = [re_path(r'^login/', views.mylogin), ]向http://127.0.0.1:8000/userinfo/login/發起請求:
填寫用戶名和密碼,勾選記住密碼,點擊登錄:
第二步
加入一些功能,即獲取提交表單的數據,以及處理Cookie。
from django.shortcuts import render# Create your views here.# userinfo/views.py from django.http import HttpResponse from django.http import HttpResponseRedirect from . import modelsdef mylogin(request):if request.method == 'GET':username = request.COOKIES.get('username', '')return render(request, 'userinfo/login.html', locals())elif request.method == 'POST':# 獲取表單的數據remember = request.POST.get('remember', '')username = request.POST.get('username', '')password = request.POST.get('password', '')# 處理COOKIESresp = HttpResponse('登陸成功')if remember:resp.set_cookie('username', username, 7*24*60*60)else:resp.delete_cookie('username')return resp
在上面的代碼中,如果我們勾選記住密碼,那么remember將獲取到勾選框的value值"1",如果我們不勾選,remember就拿不到value值,根據上面的代碼request.POST.get('remember', ''),remember只能得到空字符串''
第三步
用session存儲用戶全部信息。
首先,我們在userinfo應用下的models.py中,創建一個模型類:
from django.db import models# Create your models here.class User(models.Model):name = models.CharField('用戶名', max_length=30,unique=True)#用戶名不允許重復password = models.CharField('密碼', max_length=30)def __str__(self):return "用戶:" + self.name在admin.py中敲入如下內容:
from django.contrib import admin# Register your models here.from . import models admin.site.register(models.User)進行數據庫遷移:
F:\MyStudio\PythonStudio\goatbishop.project01\Django\mywebsite_bookstore>python manage.py makemigrations No changes detectedF:\MyStudio\PythonStudio\goatbishop.project01\Django\mywebsite_bookstore>python manage.py migrate Operations to perform:Apply all migrations: admin, auth, bookstore, contenttypes, sessions, userinfo Running migrations:No migrations to apply.現在,我們制作一個注冊界面,并且把用戶信息放在mysql數據庫中。
userinfo應用下的urls.py:
from django.urls import re_path from . import viewsurlpatterns = [re_path(r'^login/$', views.mylogin),re_path(r'^reg/', views.myregister), ]userinfo應用下的模板文件夾中的register.html:
<!DOCTYPE html> <html lang="en"> <head><meta charset="UTF-8"><title>注冊</title><style>span {color: red;}</style> </head> <body> <form action="/userinfo/reg/" method="post"><div><lable>用戶名</lable><input type="text" name="username"><span>{{ username_error }}</span></div><div><lable>密碼</lable><input type="password" name="password"><span>{{ password_error }}</span></div><div><lable>密碼(重復)</lable><input type="password" name="password2"><span>{{ password2_error }}</span></div><div><input type="submit" value="注冊"></div></form></body> </html>在userinfo應用下的views.py文件中定義視圖處理函數myregister:
def myregister(request):if request.method == 'GET':return render(request, 'userinfo/register.html')elif request.method == 'POST':username = request.POST.get('username', '')password = request.POST.get('password', '')password2 = request.POST.get('password2', '')if username == '':username_error = "用戶名不能為空"return render(request, 'userinfo/register.html', locals())if password == '':password_error = "密碼不能為空"return render(request, 'userinfo/register.html', locals())if password != password2:password2_error = "兩次密碼不一致"return render(request, 'userinfo/register.html', locals())# 開始注冊功能try:user = models.User.objects.create(name=username,password=password)return HttpResponse("<h2>注冊成功</h2>")except:return HttpResponse("<h2>注冊失敗</h2>")將注冊過的用戶信息,記錄在session上
userinfo應用下的views.py文件中,修改視圖處理函數mylogin:
def mylogin(request):if request.method == 'GET':username = request.COOKIES.get('username', '')return render(request, 'userinfo/login.html', locals())elif request.method == 'POST':# 獲取表單的數據remember = request.POST.get('remember', '')username = request.POST.get('username', '')password = request.POST.get('password', '') # # 驗證用戶名,密碼是否正確try:user = models.User.objects.get(name=username,password=password)# 在當前連接的Session中記錄當前用戶的信息request.session['userinfo'] = {"username": user.name,'id': user.id}except:return HttpResponse("登陸失敗")# 處理COOKIESresp = HttpResponse('登陸成功')if remember:resp.set_cookie('username', username, 7*24*60*60)else:resp.delete_cookie('username')return resp我們向http://127.0.0.1:8000/userinfo/reg/發起請求,進行注冊:
點擊注冊:
我們查看一下userinfo_user數據表:
mysql> select * from userinfo_user; +----+------------+----------+ | id | name | password | +----+------------+----------+ | 1 | goatbishop | 19970928 | +----+------------+----------+ 1 row in set (0.00 sec)需要注意的是,因為我們設置name字段值必須唯一,所以用戶名不能相同,如果我們再注冊一個相同用戶名的賬戶,則會導致注冊失敗:
現在,我們向http://127.0.0.1:8000/userinfo/login/發起請求,進行登錄:
點擊登錄:
- 如何判斷一個用戶是否是處于登錄狀態?
在這個案例中,我們只需要查看瀏覽器連接的session中,是否存在userinfo鍵,即request.session中是否存在userinfo鍵。
第四步
現在我們在已登錄頁面中,添加一個退出登錄的功能
userinfo應用下的views.py文件中,創建視圖處理函數mylogout:
def mylogout(request): # '退出登陸'if 'userinfo' in request.session:del request.session['userinfo']return HttpResponseRedirect('/')# 退出登錄后跳轉到主頁在userinfo應用下的urls.py模塊中,添加一個路由:
from django.urls import re_pathfrom . import viewsurlpatterns = [re_path(r'^login/$', views.mylogin),re_path(r'^reg/', views.myregister),re_path(r'^logout/', views.mylogout) ]現在,我們定義一個主頁
首先,在主urls.py中添加路由:
from django.urls import re_path from django.contrib import admin from django.conf.urls import include from . import viewsurlpatterns = [re_path(r'^admin/', admin.site.urls),re_path(r'^bookstore/', include('bookstore.urls')),re_path(r'^test_cookie/', views.test_cookie),re_path(r'^show_cookie/', views.show_cookie),re_path(r'^userinfo/', include('userinfo.urls')),re_path(r'^show_session/', views.show_session),re_path(r'^test_session/', views.test_session),re_path(r'^$', views.show_homepage), ]在主視圖模塊中,定義視圖函數show_homepage:
def show_homepage(request):return render(request, 'homepage.html', locals())在主模板文件夾中創建一個模板homepage.html:
<!DOCTYPE html> <html lang="en"> <head><meta charset="UTF-8"><title>主頁</title> </head> <body> <ul>{# 判斷是否有userinfo來確定是否已經登陸 #}{% if request.session.userinfo %}歡迎:{{request.session.userinfo.username }}<a href="/userinfo/logout/">退出登錄</a>{% else %}<li><a href="/userinfo/login">登陸</a></li><li><a href="/userinfo/reg">注冊</a></li>{% endif %} </ul> </body> </html>現在,我們修改一下userinfo應用中的mylogin視圖函數,使其登錄成功后自動跳轉到主頁:
def mylogin(request):if request.method == 'GET':username = request.COOKIES.get('username', '')return render(request, 'userinfo/login.html', locals())elif request.method == 'POST':# 獲取表單的數據remember = request.POST.get('remember', '')username = request.POST.get('username', '')password = request.POST.get('password', '') # # 驗證用戶名,密碼是否正確try:user = models.User.objects.get(name=username,password=password)# 在當前連接的Session中記錄當前用戶的信息request.session['userinfo'] = {"username": user.name,'id': user.id}except:return HttpResponse("登陸失敗")# 處理COOKIESresp = redirect('/')if remember:resp.set_cookie('username', username, 7*24*60*60)else:resp.delete_cookie('username')return resp現在,我們向登錄頁面發起請求,并登錄goatbishop賬號:
可以看到,我們登錄成功,并跳轉到了首頁。
現在,我們點擊退出登錄:
總結
以上是生活随笔為你收集整理的Django(part38)--制作登录界面的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 使用 Java DB (Derby) 数
- 下一篇: Django(part40)--如何走向