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