登录
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)