Django中auth登錄、注冊、修改密碼、退出、ORM自關聯


登錄

from django.contrib import auth
user_obj =  auth.authenticate(request, username=username, password=pwd)
## authenticate: 主要是從auth——user這張表中查詢比較 數據, 返回一個user_obj對象
if user_obj:
    ####設置session
    #### 登陸成功, 開始寫session 的操作
    ### 1. 向客戶端寫cookiie
    ### 2. 向session表寫session數據
    # request.session['username'] = username
     # request.session['pwd'] = pwd

    auth.login(request, user=user_obj)
	作用:
	1. 設置cookie, session
	2. 生成request.user的對象, 這個對象可以再視圖函數中使用 
	3. request.user這個對象  相當於 request.session

驗證時否登錄過

方法一

(1) username = request.sesssion.get('username')
(2)username = request.user.username
(3)request.path #獲取url后綴
(4)request.get_full_path() #獲取后綴加get請求參數
(1)(2)原理相同

方法二

is_login = request.user.is_authenticated()  ### 用戶是否登錄

    if is_login:
        return HttpResponse('index')
    else:
        return render(request, "login.html")

方法三(登錄認證裝飾器)

from django.contrib.auth.decorators import login_required
@login_required(login_url='/login/')
def index2(request):
   return HttpResponse('index2')

方法四(全局登錄認證裝飾器)

setting:
LOGIN_URL = '/login/' #需要跳轉的頁面

代碼區:
from django.contrib.auth.decorators import login_required
@login_required
def index3(request):
    return HttpResponse('index3')

注冊

from django.contrib.auth.models import User
def register(request):
    if  request.method == 'GET':
        return render(request, 'register.html')
    else:
        username = request.POST.get('username')
        pwd = request.POST.get('pwd')

        # User.objects.create(username=username, password=pwd)
        User.objects.create_superuser(username=username, password=pwd,  email='111@qq.com')
        User.objects.create_user(username=username, password=pwd)

        return HttpResponse('successs')

修改密碼

def modify(request):
    if request.method == 'GET':
        return render(request, 'modify.html')
    else:

        old_pwd = request.POST.get('old_pwd')

        res = request.user.check_password(old_pwd)
        if res:
            new_pwd = request.POST.get('new_pwd')
            request.user.set_password(new_pwd)
            request.user.save()

            return HttpResponse('ok')

安全退出

def logout(request):

    auth.logout(request)
    return HttpResponse('安全退出')

擴張auth_user表?

- 一對一關聯(不推薦)

python
from django.contrib.auth.models import User
				  
 class UserDetail(models.Models):
phone = models.CharField(max_length=11)
user = models.OnoToOneField(to=User)

auth繼承

from django.contrib.auth.models import User,AbstractUser
class UserInfo(AbstractUser):
phone = models.CharField(max_length=32)

需要在配置文件中,指定我不再使用默認的auth_user表而是使用我自己創建的Userinfo表
AUTH_USER_MODEL = "app名.models里面對應的模型表名"

orm自關聯

 自己寫第三張表
和勾洋約會的女生
 res = models.User.objects.filter(name='羅文', gender=1).first()
 objs = res.xxx.all()
print(objs)

 for obj in objs:
   print(obj.g.name)

和蓉蓉約會的男生
 res = models.User.objects.filter(name='蓉蓉', gender=2).first()
objs = res.yyy.all()
for obj in objs:
   print(obj.b.name)
 不寫第三張表
我定義的規則:
 from_user_id : 男生id
to_user_id : 女生id

 和羅文約會的女生
res = models.User.objects.filter(name='羅文', gender=1).first()
objs = res.m.all()

1. seelct * from app01_user_m where  from_user_id=2 ## to_user_id:[5,6]
2. select * from app01_user where id in [5,6] #### 所有相親女生的名字

for obj in objs:
print(obj.name)
和品如約會的男生;
res = models.User.objects.filter(name='品如', gender=2).first()
objs = res.user_set.all()

1. seelct * from app01_user_m where  to_user_id=6 ## from_user_id:[1,2] 
2. select * from app01_user where id in [1,2]

for obj in objs:
print(obj.name)


免責聲明!

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



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