django的權限認證:登錄和退出。auth模塊和@login_required裝飾器


在settings.py中配置LOGIN_URL參數:

# 用戶訪問帶有(@login_required)標簽的頁面(view)時,如果沒有登錄,就會跳轉到LOGIN_URL(即登陸url)。
LOGIN_URL = '/login/'

使用django自帶的auth模塊進行登錄和退出:

from django.contrib.auth.models import User
from django.contrib import auth
from django.http.response import HttpResponseRedirectBase
from django.shortcuts import resolve_url

# 重新重定向,修改狀態碼,由302(臨時重定向)->401(未授權),方便前端fetch捕獲
class HttpResponseRedirect401(HttpResponseRedirectBase):
status_code = 401
def redirect401(to, *args, **kwargs):
redirect_class = HttpResponseRedirect401
return redirect_class(resolve_url(to, *args, **kwargs))

def login(request):
# 統一登錄的token解析,只要可以解析,就證明登錄成功   token
= request.GET.get('token', 'default') if token != 'default': user_info = decrypt_by_default_public_key(token) # if user_info: user_name = user_info.get('userName') user_email = user_info.get('loginId') # 返回的時間:51050年 # time = user_info.get('time') # year 51050 is out of range # print(datetime.datetime.fromtimestamp(time)) if User.objects.filter(username=user_name): pass else: # 必須有password字段,隨便給一個密碼;使用create_user,會對密碼hash,不可以使用create函數 User.objects.create_user(username=user_name, password='test', email=user_email) user = auth.authenticate(username=user_name, password='test') auth.login(request, user) request.session['user'] = user_name # 登錄之后重定向到歡迎界面,無法重定向到用戶原本請求的頁面,因為前端請求的url和代理后到后端的url不一致。 return redirect("/") else: # return redirect401(JANUS_LOGIN) _next = request.GET.get('next', 'default') if _next != 'default': return redirect401(JANUS_LOGIN) return redirect(JANUS_LOGIN) def logout(request): auth.logout(request)
# 重定向到統一退出地址
return redirect(JANUS_LOGOUT)

使用login_required校驗用戶是否登錄

from django.contrib.auth.decorators import login_required
from django.views.decorators.csrf import csrf_exempt


logger = logging.getLogger(conf.get('log', 'name'))


@login_required
# 添加csrf例外;支持post、get、delete、put、patch等方法
@csrf_exempt
def hello(request):
    content = {'hello': 'hello world'}
    # return HttpResponse("hello world")
    logger.error('test')
    logger.error('訪問hello界面:error')
    logger.debug('訪問hello界面:debug')
    logger.info('訪問hello界面:info')
    logger.warning('訪問hello界面:warning')
    logger.critical('訪問hello界面:critical')
    logger.log(40, '測試')
    logger.exception('ceshi')
    return render(request, 'hello.html', content)

 

參考:

https://www.cnblogs.com/xuchengcheng1215/p/9457950.html

https://www.cnblogs.com/tangpg/p/9074418.html

https://www.cnblogs.com/xuchengcheng1215/p/9457950.html


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM