找手工活帶回家做的找工作哪個(gè)網(wǎng)站最靠譜內(nèi)容營(yíng)銷
一、直接使用session傳遞登錄狀態(tài)(不推薦,但能用)
這是最簡(jiǎn)單、最直接的方法。
1.登錄視圖添加標(biāo)識(shí)
添加登錄狀態(tài)標(biāo)識(shí)
request.session['is_logged_in'] = False
def user_login(request):# 這是一個(gè)登錄狀態(tài)標(biāo)識(shí)request.session['is_logged_in'] = Falseif request.method == 'GET':......form = LoginForm(data=request.POST)# 查詢數(shù)據(jù)庫(kù)驗(yàn)證用戶名和密碼是否匹配user_obj = models.UserInfo.objects.filter(password=form.cleaned_data.get('password'),......).first()if not user_obj:form.add_error('password', '用戶名或密碼錯(cuò)誤')......# 用戶信息request.session['info'] = {'id': user_obj.id, 'username': user_obj.username}# 設(shè)置 session 過期時(shí)間為30分鐘request.session.set_expiry(60 * 30)# login(request, user)if user_obj is not None:# 添加登錄后的信息# 比如添加一個(gè)標(biāo)志到session中request.session['is_logged_in'] = Truereturn redirect('/user/list/')return render(request, 'login.html', {'form': form})
2.目標(biāo)視圖判斷登錄標(biāo)識(shí)
def user_list(request):"""查詢用戶列表"""# 獲取所有用戶列表(查詢集)[obj,obj,obj]if request.session['is_logged_in']:queryset = models.UserInfo.objects.all()# 請(qǐng)求,模板名稱,上下文return render(request=request, template_name='user_list.html', context={"queryset": queryset})else:return redirect('/login/')
二、使用Django自帶的login()函數(shù)判斷
1.關(guān)于login()函數(shù)
導(dǎo)入login模塊
from django.contrib.auth import login
login函數(shù)傳參
def login(request, user, backend=None):
user一定是要經(jīng)過authenticate模塊驗(yàn)證過的。
這里傳遞過來的user信息會(huì)基于默認(rèn)的用戶信息模塊做進(jìn)一步的處理。
這個(gè)在setting.py文件中可以自定義
AUTH_USER_MODEL = 'appname.modelname'
# 它的默認(rèn)值是'django.contrib.auth.models.User'
2.關(guān)于user信息的獲取(authenticate模塊)
user信息獲取默認(rèn)是在User模塊中,對(duì)應(yīng)的數(shù)據(jù)表是創(chuàng)建項(xiàng)目時(shí)自動(dòng)創(chuàng)建的auth_user表,這個(gè)表存儲(chǔ)著Django自帶的管理系統(tǒng)后臺(tái)的用戶信息。
from django.contrib.auth.models import User
導(dǎo)入authenticate模塊
from django.contrib.auth import authenticate
函數(shù)中有一句:
for backend, backend_path in _get_backends(return_tuples=True):......user = backend.authenticate(request, **credentials)......
說明了authenticate模塊在嘗試每個(gè)后端(backend)認(rèn)證方式
_get_backends()會(huì)從settings.py中讀取AUTHENTICATION_BACKENDS定義的后端路徑
3.后端認(rèn)證
AUTHENTICATION_BACKENDS是Django設(shè)置中的一個(gè)參數(shù),它定義了用于身份驗(yàn)證的后端認(rèn)證方式。這個(gè)參數(shù)是一個(gè)字符串列表,包含Django認(rèn)證系統(tǒng)使用的認(rèn)證后端類的全名。這個(gè)是可以自定義的。
默認(rèn)情況下,Django使用ModelBackend作為身份驗(yàn)證后端,它基于Django中的用戶模型進(jìn)行身份驗(yàn)證。除此之外,Django還提供了其他的身份驗(yàn)證后端,如LDAPBackend、RemoteUserBackend等,也可以自定義身份驗(yàn)證后端。
如果需要自己寫一個(gè)后端認(rèn)證,需要繼承ModelBackend這個(gè)模塊
class CustomBackend(ModelBackend):"""繼承ModelBackend類,重寫authenticate()方法自定義用戶驗(yàn)證后端"""def authenticate(self, request, username=None, **kwargs): # 參數(shù)username實(shí)際是用戶輸入的登錄賬號(hào)user = User.objects.get(Q(username=username))return user
4.之后
如果你是使用的auth_user來存儲(chǔ)用戶信息的,那么就可以直接在登錄頁(yè)面寫入函數(shù)
user = authenticate(request, username='admin')
login(request,user)
然后在你需要登錄后才能進(jìn)入的視圖前加上裝飾器
from django.contrib.auth.decorators import login_required
# @login_required
def my_view(request):......
另外在setting.py文件寫入未登錄狀態(tài)需要重定向的路由
LOGIN_URL = '/login/'
如果你不是使用的auth_user來存儲(chǔ)用戶信息,而是使用的自定義表,在你設(shè)置
AUTH_USER_MODEL = 'appname.modelname'
之后runserver,會(huì)報(bào)和以下這個(gè)大同小異的錯(cuò)誤,即使你makemigrations和migrate操作之后,仍然會(huì)報(bào)這個(gè)錯(cuò)誤
AttributeError: type object 'UserInfo' has no attribute 'REQUIRED_FIELDS'
那么就需要重新定義自己的模塊中的class User(),需要繼承AbstractUser類
其實(shí)User
模型類本身也是直接繼承自AbstractUser
,所以自定義一個(gè)繼承自AbstractUser
的子類就相當(dāng)于是定義另一個(gè)新的User
類
可以參考:
https://www.cnblogs.com/guyuyun/p/13912386.html