前言
之前,写了django制作简易登录系统,这次利用django内置的authentication功能实现注册、登录
可参考之前的文章:django制作简易注册登录系统
一、django配置
python包具体配置见之前的文章,和之前一样,注释掉跨域,引入mysql
authentication需要额外引入redis
caches = {
"default": {
"backend": "django_redis.cache.rediscache",
"location": "redis://ip:6379",
"options": {
"client_class": "django_redis.client.defaultclient",
}
},
"session": {
"backend": "django_redis.cache.rediscache",
"location": "redis://ip:6379/1",
"options": {
"client_class": "django_redis.client.defaultclient",
"connection_pool_kwargs": {
"max_connections": 100
}
}
}
}
session_engine = 'django.contrib.sessions.backends.cache'
session_cache_alias = "session"
session_cookie_age = 500
二、后端实现
1.新建app
python manage.py startapp app名称
2.编写view
代码如下(示例):
# create your views here.
from django.contrib.auth import authenticate, login, logout
from django.contrib.auth.models import user
from django.http import jsonresponse
from django.shortcuts import redirect
from django.shortcuts import render
def login1(request):
if request.method == 'get':
print("get")
return render(
request,
'login.html',
)
elif request.method == 'post':
print("post")
# 获取参数
user_name = request.post.get('username', '')
pwd = request.post.get('password', '')
# 用户已存在
if user.objects.filter(username=user_name):
# 使用内置方法验证
user = authenticate(username=user_name, password=pwd)
print(user)
# 验证通过
if user:
# 用户已激活
if user.is_active:
login(request, user)
request.session["current_user"] = user.username # 将用户名存储在session中
request.session.set_expiry(0)
return render(request, "index.html")
# 未激活
else:
return jsonresponse({
'code': 403,
'msg': '用户未激活'
})
# 验证失败
else:
return jsonresponse({
'code': 403,
'msg': '用户认证失败'
})
# 用户不存在
else:
return redirect('register')
else:
return render(request, 'login.html')
def register(request):
if request.method == "get":
return render(request, "register.html")
elif request.method == "post":
username = request.post.get('username', '')
pwd = request.post.get('password', '')
if user.objects.filter(username=username):
return jsonresponse({
'code': 200,
'msg': 'user exists'
})
else:
user = user.objects.create_user(username=username, password=pwd)
return jsonresponse({
'code': 200,
'msg': '注册成功,去登陆'
})
else:
return render(request, 'register.html')
def logout1(request):
logout(request)
request.session.clear()
return redirect("index")
def index(request):
return render(request, "index.html")
3.配置路由
在app中新建urls.py
from django.urls import path
from loginapp import views
from loginapp.views import index, login1, register, logout1
urlpatterns = [
path('', index, name='index'), # 定义根路径'/'到index视图的映射
path('login/', login1, name='login'),
path('logout/', logout1, name='logout'),
path('register/', register, name='register'),
]
主路由(刚建完项目时的那个目录下)修改如下
from django.contrib import admin
from django.urls import path, include
urlpatterns = [
path('', include('app名称.urls')),
path('admin/', admin.site.urls),
]
三、前端编写
1、index.html
<!doctype html>
<html lang="en">
<head>
<meta charset="utf-8">
<title>home</title>
</head>
<body>
{% if request.session.current_user %}
<h1>welcome, {{ request.session.current_user }}!</h1>
<p>you are logged in.</p>
<a href="{% url 'logout' %}" rel="external nofollow" >logout</a>
{% else %}
<h1>welcome, guest!</h1>
<p>please <a href="{% url 'login' %}" rel="external nofollow" rel="external nofollow" >login</a> or <a href="{% url 'register' %}" rel="external nofollow" rel="external nofollow" >register</a>.</p>
{% endif %}
</body>
</html>

2、register.html
<!doctype html>
<html lang="en">
<head>
<meta charset="utf-8">
<title>register</title>
</head>
<body>
<h1>register</h1>
<form method="post" action="{% url 'register' %}">
{% csrf_token %}
<label for="username">username:</label>
<input type="text" id="username" name="username" required><br><br>
<label for="password">password:</label>
<input type="password" id="password" name="password" required><br><br>
<button type="submit">register</button>
</form>
<p>already have an account? <a href="{% url 'login' %}" rel="external nofollow" rel="external nofollow" >login here</a>.</p>
</body>
</html>
3、 login.html
<!doctype html>
<html lang="en">
<head>
<meta charset="utf-8">
<title>login</title>
</head>
<body>
<h1>login</h1>
<form method="post" action="{% url 'login' %}">
{% csrf_token %}
<label for="username">username:</label>
<input type="text" id="username" name="username" required><br><br>
<label for="password">password:</label>
<input type="password" id="password" name="password" required><br><br>
<button type="submit">login</button>
</form>
<p>don't have an account? <a href="{% url 'register' %}" rel="external nofollow" rel="external nofollow" >register here</a>.</p>
</body>
</html>

可以看到登陆后,欢迎<用户名>用户
总结
用户的认证内容存储在session中,我设置的过期时间是5分钟。
没有对出错情况进行处理,一旦出错仅展示报错json数据。
到此这篇关于django authentication 登录注册的实现示例的文章就介绍到这了,更多相关django authentication 登录注册内容请搜索代码网以前的文章或继续浏览下面的相关文章希望大家以后多多支持代码网!
发表评论