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)
原文地址:https://www.cnblogs.com/huanghongzheng/p/11219144.html