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()用户过滤查看用户输入的信息和数据库中存入的信息比较后过滤出来。
# 更多的过滤器查询方法可以参考我的上一篇随笔 https://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>`