前言
從之前的學習我們發現,一直在blog
應用中進行開發。本章開始新建另一個App來開發,介紹Django的身份認證模塊,實現用戶登錄、註冊、註銷。
一個簡單的登錄界面
創建應用
爲了實現用戶登錄、退出、註冊等功能,從而進行用戶管理,創建一個新的應用。
python manage.py startapp accounts
然後我們就多了一個accounts
目錄,然後在/myblog/settings.py
中對新應用進行配置。
INSTALLED_APPS = [
...,
'blog',
'accounts',
]
在./accounts目錄中創建urls.py
文件,然後設置本應用中的路徑。
from django.urls import path
from . import views
app_name = "accounts"
urlpatterns = [
path('login/', views.user_login, name='user_login'),
]
然後在./myblog/urls.py
配置accounts
應用的URL配置:
from django.contrib import admin
from django.urls import path, include
from django.conf.urls import url
from blog import views
urlpatterns = [
path('admin/', admin.site.urls),
url(r'^$', views.home, name='home'),
path('<int:article_id>/', views.blog_article),
path('accounts/', include('accounts.urls', namespace='accounts')), # 新增
]
基本配置到位,接下來我們設計用戶登錄界面:
登錄表單設計
在./account
目錄下新建forms.py
,代碼如下:
from django import forms
class LoginForm(forms.Form):
username = forms.CharField()
password = forms.CharField(widget=forms.PasswordInput)
登錄視圖函數
編輯./account/views.py
文件,實現user_login()
的視圖函數:
from django.shortcuts import render, HttpResponse
from django.contrib.auth import authenticate, login
from . forms import LoginForm
# Create your views here.
def user_login(request):
if request.method == "POST":
login_form = LoginForm(request.POST)
if login_form.is_valid():
cd = login_form.cleaned_data
user = authenticate(username=cd['username'], password=cd['password'])
if user:
login(request, user)
return HttpResponse("歡迎你,登錄成功")
else:
return HttpResponse("抱歉,用戶名或者密碼錯誤")
else:
return HttpResponse("登錄非法")
else:
login_form = LoginForm()
return render(request, "accounts/login.html", {"form": login_form})
登錄前端界面
在./templates/accounts/login.html
模板,代碼如下:
{% extends "base.html" %}
{% block title %}登錄{% endblock %}
{% block content %}
<div class="container text-center" >
<h1>用戶登錄</h1>
<p>
輸入你的用戶名和密碼
</p>
<form action="." method="post">
{% csrf_token %}
{{ form.as_p }}
<p><input type="submit" value="登錄"></p>
</form>
</div>
{% endblock %}
修改./templates/base.html
,代碼如下:
{% load staticfiles %}
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>{% block title %}{% endblock %}</title>
<link rel="stylesheet" href="{% static 'css/bootstrap.min.css' %}">
</head>
<body>
<div id="header">
<nav class="navbar navbar-expand-lg navbar-dark bg-dark">
<div class="container" >
<a class="navbar-expand" href="{% url 'home' %}">主頁</a>
<ul class="nav navbar-nav navbar-light" style="margin-right: 10px">
<li><a href="{% url 'accounts:user_login' %}">登錄</a> </li>
</ul>
</div>
</nav>
</div>
<div class="container">
<div id="content">
{% block content %}
{% endblock %}
</div>
</div>
</body>
</html>