PYTHON 九月 23, 2019

第6节、系统User及静态资源

文章字数 6.9k 阅读约需 6 mins. 阅读次数 1000000

一、系统User模型类

导入:

views.py

from django.contrib.auth.models import User

(1) 用户的创建

from django.contrib.auth.models import User
u= User.objects.create_user(req.POST.get('username'),req.POST.get('email'),req.POST.get('userpass'))

对象的保存

u.save()

(2) 用户认证

导入:

from django.contrib.auth import authenticate

传入关键字参数进行用户的认证

u = authenticate(username=req.POST.get('username'),password=req.POST.get('userpass'))

认证结果

  1. 认证成功返回对象
  2. 认证失败返回None

(3) 维持用户登录状态

导入:

from django.contrib.auth import login

实例

u = authenticate(username=req.POST.get('username'),password=req.POST.get('userpass'))
if u:#验证通过
    if u.is_active: #并且账户激活
        login(req,u) #处理登录 状态保持 使用的依然是session
        return redirect(reverse('App:index'))
        return HttpResponse('authenticate用户认证')

(4) 在模板和视图函数中判断登录状态和获取登录者数据

index.html

{% if request.user.is_authenticated %} #登录则为True 否则为False
    

欢迎:{{ request.user.username }} | 退出登录

{% endif %}

views.py

def test(req):
    # print(req.user.email)
    if req.user.is_authenticated: 
        print(req.user.email) #如果登录则取出登录者的邮箱信息 
    else:
        print('你没有登录') #输出没登录
    return HttpResponse('测试request.user属性')

(5) 登录的限制 login_required

限制某些路由必须登录才能访问

导入:

from django.contrib.auth.decorators import login_required

实例:

@login_required(login_url='/login/')
def test(req):
    return HttpResponse('当前路由必须登录才能进行访问')

(6) 如果是从login_required重定向到登录模板 则登录成功后在跳转回去 否则去首页

实例:

def Login(req):
    if req.method == 'GET':
        req.session['next'] = req.GET.get('next','/') #/test/ /
        return render(req,'djangouser/login.html')
    if req.method == 'POST':
        ...
        return redirect(req.session.get('next'))

(7) 修改密码

from django.contrib.auth.hashers import make_password

#修改密码
def update_password(req):
    u = authenticate(username='zhangsan', password='123456')
    # print(u)
    if u:
        if u.is_active:
            u.password = make_password('123456')
            u.save()
    return HttpResponse('修改成功')

二、自定义用户模型

给user模型添加phone和icon字段

models.py

from django.db import models
from django.contrib.auth.models import AbstractUser
# Create your models here.

class User(AbstractUser):
    phone = models.CharField(max_length=11,default='15611833906')
    icon = models.CharField(max_length=70,default='default.jpg')

views.py代码修改如下 其余不变

from App.models import User

三、将用户认证进行重写 实现可以手机号码和用户名都能登录

在App下新建auth.py文件 添加如下代码

from django.contrib.auth.backends import ModelBackend
from App.models import User
class MyBackend(ModelBackend):
    def authenticate(self,username=None,password=None):
        user = None
        try:
            user = User.objects.get(username=username)
        except:
            try:
                user = User.objects.get(phone=username)
            except:
                return
        if user.check_password(password):
            return user
        return False

在setting.py文件中 指定使用自定义的验证方法 authenticate

#指定用户认证使用自己定义的认证类
AUTHENTICATION_BACKENDS = ('App.auth.MyBackend',)

四、配置静态资源

静态资源: 图片、css、js

通常静态资源文件放在 static目录下

目录结构:

project/
    App/
    templates/
    static/
        img/
        css/
        js/
        upload/
    project/
    manage.py

(1) 在App下创建static静态资源目录

project/
    App/
        static/
            img/
                bzs.jpeg

在settings.py文件中 已经默认配置好了

STATIC_URL = '/static/'

在模板中使用

{% load static %} #加载static标签
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
<h1>首页</h1>
<img src="/static/img/bzs.jpeg" alt="">
<img src="{% static 'img/bzs.jpeg' %}" alt="">
</body>
</html>

注意: 如果static静态资源目录存放在根目录下 则静态资源加载失败

(2) 将static创建在项目的根目录下

更改setting.py的配置

在settings.py文件中添加如下代码

STATIC_URL = '/static/'
STATICFILES_DIRS = [os.path.join(BASE_DIR, 'static')]

模板中代码同上 不做任何改变 static在App下或者在根目录下 都正常展示


上一篇:
下一篇:
0%