IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> Python知识库 -> Dajngo项目:极致果蔬(二) -> 正文阅读

[Python知识库]Dajngo项目:极致果蔬(二)

上篇讲述了用户注册部分的处理,下面继续完善项目的用户登录部分,登录用户的基本流程如下:

?

? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ??

继续上篇的项目,我们打开服务器访问登录页面,发现没有样式,这是因为login.html中没有加载static的一些js和css文件,这时需要修改这部分信息即可。接下来就对用户登录部分的一些重要的知识点进行总结。

1.判断登录逻辑

? ?在项目中,Django提供两个函数authenticate()、login()函数。authenticate()函数只是用于验证用户登录,它接受两个参数,用户名username和密码password,并在密码对给出的用户名合法的情况下返回一个User对象,如果密码不合法,authenticate()返回None。而要登录一个用户,可以使用login()函数,该函数接受一个HttpRequest对象和一个User对象作为参数并使用django的session框架把用户的ID保存在session中,以便后续的存取。

? ?使用Authenticate()函数的好处:

? (1)它的认证功能比较安全可靠,避免在验证过程中出现异常;

? (2)使用起来比普通认证逻辑要省时省事。

? ?这里判断登录逻辑的处理放在LoginView()类视图的post方法中;

from django.contrib.auth import authenticate,login

class LoginView(View):
   def get(self,request):
        return render(request,"login.html")

   def post(self,request):
        # 接收数据
        username = request.POST.get('username')
        password = request.POST.get('pwd')
        remember = request.POST.get('remember')

        # 校验数据
        if not all([username, password]):
            return render(request, "login.html", {"errormessage": "输入的数据不完整!"})

        # 登录校验
        user = authenticate(username=username,password=password)

        if user is not None:
            # 用户名密码正确
            # 验证是否激活
            if user.is_active:
                login(request,user)
                return redirect(reverse("index"))
            else:
                return render(request,'login.html',{'errormessage':'邮箱未激活!'})
        else:
            return render(request,'login.html',{'errormessage':'用户名或者密码错误!'})

2.记录用户信息

? ?当登录用户后,session信息内容都保存在MySQL的django_session表中,如果要频繁的存取数据会加重数据库的存储压力,因此我们可以使用Redis作为缓存数据库(session将数据储存在Redis中),可持久化缓存用户的登录信息并且可以快速存取数据(需要的时候从Redis中获取)。

? ?在安装好django-redis库的同时,还要在项目的settings.py初进行配置;

# 将redis作为session的存储缓存
CACHES = {
    "default": {
        "BACKEND": "django_redis.cache.RedisCache",
        "LOCATION": "redis://127.0.0.1:6379/5",  # Redis主机名与数据库名
        "OPTIONS": {
            "CLIENT_CLASS": "django_redis.client.DefaultClient",
        }
    }
}

? ?由于django-redis作为session储存后端不用安装其它的backend,因此配置好上述的内容后,还需要配置session,下面是在settings.py中添加的配置内容;

# 设置session存储的位置
SESSION_ENGINE = "django.contrib.sessions.backends.cache"
SESSION_CACHE_ALIAS = "default"

? ?在登录界面中还有一个“记住用户名”的按钮,当登录验证成功后,若勾选了“记住用户名”的按钮,则可以把用户名设置到cookies中并设置5天内免输入用户信息,方便下次登录,这里用set_cookie方法来实现;若未勾选时,则删除cookies值(使用delete_cookie的方法)。当记录用户名成功后,下次登录操作时,直接用get方式登录。此时可默认设定用户名,需要使用COOKIES来获得用户名;

? ?在user/views.py文件中的LoginView()类视图进行修改;

from django.urls import reverse

class LoginView(View):
    def get(self,request):
        username = ""
        checked = ""
        # 下次登录,若记住,则设置用户名及密码
        if "username" in request.COOKIES:
            username = request.COOKIES.get('username')
            # 选中记住用户名按钮
            remember = "checked"
        return render(request,'login.html',{"errormessage":"","username":username,"checked":remember})

    def post(self,request):
        # 接收数据
        username = request.POST.get('username')
        password = request.POST.get('pwd')
        remember = request.POST.get('remember')

        # 校验数据
        if not all([username, password]):
            return render(request, "login.html", {"errormessage": "输入的数据不完整!"})

        # 登录校验
        user = authenticate(username=username,password=password)

        if user is not None:
            # 用户名密码正确
            # 验证是否激活
            if user.is_active:
                # 判断是否需要记住用户名
                response = render(request, 'pageJump.html',
                              {'msg': f'登录成功!,还有<span id="seconds">2</span>秒跳转到首页,'
                                      f'点击<a href="{reverse("index")}">跳转</a>',
                               'location': f'{reverse("index")}'})

                if remember == 'on':
                    response.set_cookie('username',username,max_age=5*24*3600)
                else:
                    response.delete_cookie('username')

                login(request,user)
                return response
            else:
                return render(request,'login.html',{'errormessage':'邮箱未激活!'})
        else:
            return render(request,'login.html',{'errormessage':'用户名或者密码错误!'})

? ?接着,修改login.html页面中的表单数据内容;

<form action="/user/login" method="post">
    {% csrf_token %}
	<input type="text" name="username" class="name_input" placeholder="请输入用户名" id="user_name" value="{{ username }}">
	<div class="user_error">输入错误</div>
	<input type="password" name="pwd" class="pass_input" placeholder="请输入密码" id="pwd">
	<div class="pwd_error">输入错误</div>
	<div class="more_input clearfix">
	    <input type="checkbox" name="remember" {{ checked }}>
		<label>记住用户名</label>
		<a href="#">忘记密码</a>
	</div>
	<input type="submit" name="" value="登录" class="input_submit">
</form>

3.退出

? ?在退出视图中调用用户认证系统的logout方法并配置路由即可;

class LogoutView(View):
    def get(self,request):
        from django.contrib.auth import logout
        logout(request)
        return render(request, 'pageJump.html',
                     {'msg': f'退出成功!,还有<span id="seconds">2</span>秒跳转到首页,'
                             f'点击<a href="{reverse("index")}">跳转</a>',
                             'location': f'{reverse("index")}'})
urlpatterns = [
    url(r'^logout$', LogoutView.as_view(),name="logout"),
]
  Python知识库 最新文章
Python中String模块
【Python】 14-CVS文件操作
python的panda库读写文件
使用Nordic的nrf52840实现蓝牙DFU过程
【Python学习记录】numpy数组用法整理
Python学习笔记
python字符串和列表
python如何从txt文件中解析出有效的数据
Python编程从入门到实践自学/3.1-3.2
python变量
上一篇文章      下一篇文章      查看所有文章
加:2022-01-01 13:51:09  更:2022-01-01 13:52:44 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/16 3:38:35-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码