这一段时间没有更新博客,因为一些其他原因,玩心最近有点泛滥,dota2的时间也增加了很多。
我意识到这样是不对的,只有提升技术,提升自我,才能实现自己的人生理想,做一名心目中的技术人才
文章目录
- 博客登录简介
- MTV逐步构建
- Model构建
- 视图函数构建
- 登陆的前端模板
- 登录成功后修改导航栏内容
- 总结
博客登录简介 作为一个(自认为)比较成熟的项目,多用户交互是少不了的,要把用户名、密码等信息保存在数据库中。这一部分,我本应驾轻就熟。
我曾经用Flask框架自己实现了登录功能,并且引入了短信验证、邮箱验证等稍微高级一点的功能。准备用自己的经验直接构建登录的MTV模块,谁知……django框架自带登录功能,那我就不要自己傻乎乎的去写了,来弄一个demo吧。
MTV逐步构建 话不多说
python manage.py startapp account
Model构建 格式我没有构建Model我用了系统自带的Model,直接登陆127.0.0.1:8000/admin,为自己新增了一个user用来测试,so easy。账户名和密码自定
model模型构建好了,但是前端页面的表单模型还没创建好,在/account/form.py中修改表单配置
from django import forms
class LoginForm(forms.Form):
username = forms.CharField()
password = forms.CharField(widget=forms.PasswordInput)
创建好这个表单模型之后,就可以构建视图函数了
视图函数构建 视图函数这里就比较复杂了,复杂的原因在于我想让同一个网址来处理get和post请求,在前端发来GET请求时,返回登录界面窗体;若前端发来POST请求,则是处理表单信息,完成登录功能。(session)
在这里用户验证我是用了django自带的django.contrib.auth.authenticate方法以及login方法自动验证登录。
完整的account/views.py如下,需要备注的部分我会写注释:
from django.shortcuts import render, redirect
from django.http import HttpResponse
from django.contrib.auth import authenticate, login
#导入LoginForm,刚才编写的form表单,SignUpForm先不管
from .forms import LoginForm, SignUpForm# Create your views here.
def user_login(request):
if request.method == 'GET':
# 自动生成表单
login_form = LoginForm()
context = {}
#把表单写入参数并回传给前端模板
context['form'] = login_form
return render(request, "account/login.html", context=context)
if request.method == 'POST':
#用POST请求来初始化表单
login_form = LoginForm(request.POST)
# 判断用户输入是否合法
if login_form.is_valid():
# 用键值对存储了表单中的数据,cleaned_data是一个方法,可以获取键值对
data = https://www.it610.com/article/login_form.cleaned_data
#直接用authenticate方法验证用户名和密码是否正确
user = authenticate(username=data['username'], password=data['password'])
#如果验证成功
if user:
#django自带的登陆函数
login(request, user)
#设置session
request.session['username'] = data['username']
#登录成功后跳转回主页面
return redirect('/')
else:
return HttpResponse('账号或密码错误')
else:
return HttpResponse('登录内容有误')
在这里有一个要注意的地方,就是session的设置,我们都知道session其实是一个另类的cookie,它目的是让服务器能够识别客户端,django默认的session时间很长,需要我们手动改为浏览器关闭则删除session设置settings.py,增加如下代码
SESSION_EXPIRE_AT_BROWSER_CLOSE = True
这样就OK了,可以继续写前端界面
登陆的前端模板
前端模板没啥好介绍的,都是用的bootstrap框架直接搭建的,再利用{{form.属性}}生成一些表单即可。
{% extends "base_cn.html" %}
{% load staticfiles %}
{% block title %}
欢迎登陆
{% endblock %}
{% block content %}
登录界面(采用Django)内置方法
{% if form.errors %}
账号或密码错误,请重试!
{% endif %}
请输入账号和密码
{% endblock %}
登录成功后修改导航栏内容 完成了登录功能。
但是这是不完善的,我们平时进一个网站,如果登陆成功,顶部导航栏都会更改为“欢迎您,XX”,再点退出则回复原样,这个其实非常简单,修改前端模板即可
名称为templates/header_cn.html
代码如下,重点看53行以后的代码
总结 【使用Django构建个人网站(九)——博客登录(一个简易demo)】博客的登录其实很简单,后备只是就是要掌握session、cookie的原理。
推荐阅读
- Python全栈|Python全栈(十)Django框架之1.Django初体验
- django.db.backends.postgresql' isn't an available database backend.解决方法
- 使用Django构建个人网站(六)——博客前端构造页面
- 使用Django构建个人网站(七)——前后端数据交互,展示博客
- Django框架|使用Django构建个人网站(四)——使用地址栏传参获取不同的页面
- Django框架|使用Django构建个人网站(二)——加载模板和静态文件
- 使用Django构建个人网站(三)——模板套用