您好,登錄后才能下訂單哦!
from django.contrib import auth
這個模塊中提供了許多方法
user = authenticate(username='someone',password='somepassword')
驗證用戶名與密碼是否正確,一般需要username和password兩個關鍵字參數。
認證通過,返回值是一個User對象。用戶名或密碼不正確,返回None。
用戶名和密碼正確
user.is_authenticated=True
user.is_anonymous=false
authenticate()會在User對象上設置一個屬性,標識后端認證了該用戶,而且該屬性在后面的登錄過程中也是需要的。
如果我們直接從數據庫中使用filter()取出User對象(不使用authenticate()方法獲取User對象),是不能使用的。
該函數接受一個HttpRequest對象和通過authenticate()驗證過的User對象。
該函數使用django的session框架給已經認證的用戶加上session id等信息
from django.contrib.auth import authenticate, login
def my_view(request):
username = request.POST['username']
password = request.POST['password']
user = authenticate(username=username, password=password)
if user is not None:
login(request, user)
# Redirect to a success page.
...
else:
# Return an 'invalid login' error message.
...
from django.contrib.auth import logout
def logout_view(request):
logout(request)
# Redirect to a success page.
該函數接受一個HttpRequest對象,沒有返回值。
當調用該函數時,當前請求的session信息會被全部刪除。
該用戶即使沒有登陸,使用該函數也不會報錯。
User對象屬性:username,password(用hash算法保存到數據庫中)
檢查用戶是否suthenticate驗證過。
user = auth.authenticate(username=user,password=pwd)
print(user.is_authenticated)
print(user.is_anonymous)
用戶名和密碼正確,
user.is_authenticated=True,
user.is_anonymous=False
要求:
1.用戶登錄后,才能訪問其他頁面
2.如果沒有登陸,就跳轉到登錄頁面
3.用戶在登錄頁面登錄后,自動跳轉到之前訪問的地址
方法一:
def index(request):
# 沒有登陸過,第一次訪問index頁面,request.user狀況如下
print(request.user) # AnonymousUser
print(request.user.is_anonymous) # true
print(request.user.is_authenticated) # false
# 如果用戶登錄成功,is_authenticated會返回true,request.user.is_anonymous返回false
if request.user.is_authenticated:
return render(request,"index.html")
else:
return redirect('%s?next=%s' % (settings.LOGIN_URL, request.path))
# /login/登錄成功后,可以在login中通過return redirect(request.GET.get("next", "/index/"))會重定向到/index/
#request.GET.get("next", "/index/")是如果沒有next這個key,設置默認值為/index/
方法二:
# 使用這個裝飾器,就不需要像index方法那樣,手動判斷用戶是否登錄了。
# 如果用戶沒有登陸,自動跳轉到settings.py中配置的LOGIN_URL路徑。此時url為http://127.0.0.1:8000/login/?next=/order/
# /login/登錄成功后,可以在login中通過return redirect(request.GET.get("next", "/index/"))會重定向到/order/
@login_required
def order(request):
return HttpResponse("order")
settings.py中配置
LOGIN_URL = "/login/"
from django.contrib.auth.models import User
user = User.objects.create_user(username='',password='',email='')
當用戶修改密碼的時候,要讓用戶輸入舊密碼,驗證輸入的舊密碼正確,才允許修改密碼。
輸入的舊密碼正確,返回True,否則返回false。
user = request.user
user.set_password(new_password)
user.save
"注冊"
def sign_up(request):
state = None
if request.method == 'POST':
password = request.POST.get('password', '')
repeat_password = request.POST.get('repeat_password', '')
email=request.POST.get('email', '')
username = request.POST.get('username', '')
if User.objects.filter(username=username):
state = 'user_exist'
else:
new_user = User.objects.create_user(username=username, password=password,email=email)
return redirect('/book/')
content = {
'state': state,
'user': None,
}
return render(request, 'sign_up.html', content)
"修改密碼"
@login_required
def set_password(request):
user = request.user
state = None
if request.method == 'POST':
old_password = request.POST.get('old_password', '')
new_password = request.POST.get('new_password', '')
repeat_password = request.POST.get('repeat_password', '')
if user.check_password(old_password):
if not new_password:
state = 'empty'
elif new_password != repeat_password:
state = 'repeat_error'
else:
user.set_password(new_password)
user.save()
return redirect("/log_in/")
else:
state = 'password_error'
content = {
'user': user,
'state': state,
}
return render(request, 'set_password.html', content)
views.py
from django.shortcuts import render,HttpResponse,redirect
from django.contrib import auth
from django.contrib.auth.decorators import login_required
from django.contrib.auth.models import User
def login(request):
if request.method == "POST":
user = request.POST.get("user")
pwd = request.POST.get("pwd")
# 驗證用戶名和密碼是否正確,如果正確,返回user對象
user = auth.authenticate(username=user,password=pwd)
if user:
auth.login(request, user)
# 用戶在登錄頁面登錄后,自動跳轉到之前訪問的地址
# 如果當前訪問/order/,會跳轉到login,此時url中為http://127.0.0.1:8000/login/?next=/order/
# 所以可以通過request.GET.get("next", "/index/")獲取剛剛訪問的路徑,
# 如果當前直接訪問的是login,則為http://127.0.0.1:8000/login/,訪問成功后,跳轉到/index/
next_url = request.GET.get("next", "/index/")
return redirect(next_url)
# get請求時,返回login頁面
return render(request, "login.html")
def index(request):
# 如果用戶登錄成功,is_authenticated會返回true,request.user.is_anonymous返回false
if request.user.is_authenticated:
return render(request,"index.html")
else:
return redirect("/login/")
# 使用這個裝飾器,就不需要像index方法那樣,手動判斷用戶是否登錄了。
# 如果用戶沒有登陸,自動跳轉到settings.py中配置的LOGIN_URL路徑。
@login_required
def order(request):
return HttpResponse("order")
def logout(request):
auth.logout(request)
def reg(request):
if request.method == "POST":
user = request.POST.get("user")
pwd = request.POST.get("pwd")
user = User.objects.create_user(username=user, password=pwd)
return redirect("/login/")
return render(request, "reg.html")
settings.py
LOGIN_URL = "/login/"
login.html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<form action="" method="post">
{% csrf_token %}
用戶名 <input type="text" name="user">
密碼 <input type="text" name="pwd">
<input type="submit" value="提交">
</form>
</body>
</html>
reg.html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<form action="/reg/" method="post">
{% csrf_token %}
用戶名 <input type="text" name="user">
密碼 <input type="text" name="pwd">
<input type="submit" value="注冊">
</form>
</body>
</html>
index.html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>
</title>
</head>
<body>
{#后端返回request對象,在前段獲取用戶名#}
<h4>當前用戶{{ request.user.username }}</h4>
<a href="/logout/">注銷</a>
</body>
</html>
"首先注冊賬戶,訪問reg"
"login"
"登錄成功"
"完整項目查看本人的git哦!!!!!!"
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。