Django搭建个人博客Blog-Day04
阿里云国内75折 回扣 微信号:monov8 |
阿里云国际,腾讯云国际,低至75折。AWS 93折 免费开户实名账号 代冲值 优惠多多 微信号:monov8 飞机:@monov6 |
实现不同的方式进行登录
登录的本质就是去数据库中根据用户名查询出一条数据然后再将用户输入的密码进行加密然后拿这个加密后的密码和数据库中已经保存好的进行对比。
在/user/views.py文件中定义一个类继承Django的ModelBackend重写authenticate方法。
from django.contrib.auth.backends import ModelBackend
class CustomBackend(ModelBackend):
# 改写默认的认证方法
# 我想改成用户名和邮箱都可以进行认证
def authenticate(self, request, username=None, password=None, **kwargs):
try:
user = User.objects.get(Q(username=username)|Q(email=username))
# select * from user where username=username or email=email
if user.check_password(password):
return user
except Exception as err:
return None
在setting/dev.py文件中进行设置告诉Django修改了默认的内容
# 添加如下代码
AUTHENTICATION_BACKENDS = [
'user.views.CustomBackend'
]
退出登录
在/apps/user/views.py文件中添加退出登录的方法函数
# 退出登录的方法
from django.contrib.auth import logout
def user_logout(request):
logout(request)
return redirect(reverse('user:login'))
添加退出登录的路由/apps/user/urls.py
from django.urls import path
from . import views
app_name = 'user'
urlpatterns = [
# 注册
path('register',views.Register.as_view(),name='register'),
# 登录
path('login',views.Login.as_view(),name='login'),
# 退出登录
path('logout',views.user_logout,name='logout'),
]
对前端的代码做一些优化base.html
{% load staticfiles %}
<!-- 设置引入静态文件 -->
<!DOCTYPE html>
<html lang="zh-cn">
<head>
<!-- 网站采用的字符编码 -->
<meta charset="utf-8">
<!-- 预留网站标题的位置 -->
<title>{% block title %}{% endblock %}</title>
<!-- 引入bootstrap的css文件 -->
<link rel="stylesheet" href="{% static 'bootstrap/css/bootstrap.min.css' %}">
<!-- bootstrap.js 依赖 jquery.js 和popper.js因此在这里引入 -->
<script src="{% static 'jquery-3.6.1.min.js' %}"></script>
<!-- 引入layer.js -->
<script src="{% static 'layer/layer.js' %}"></script>
<!-- 引入popper.js -->
<script src="https://cdn.jsdelivr.net/npm/popper.js@1.16.1-lts/dist/umd/popper.min.js"></script>
<!-- 引入bootstrap的js文件 -->
<script src="{% static 'bootstrap/js/bootstrap.min.js' %}"></script>
<script>
$('div#article_body table').addClass('table table-bordered');
$('div#article_body thead').addClass('thead-light');
</script>
</head>
<body>
<!-- 定义导航栏 -->
<nav class="navbar navbar-expand-lg navbar-dark bg-dark">
<div class="container">
<!-- 导航栏商标 -->
<a class="navbar-brand" href="#">我的博客</a>
<!-- 导航入口 -->
<div>
<ul class="navbar-nav">
<!-- 条目 -->
<li class="nav-item">
<a class="nav-link" href="#">文章</a>
</li>
<li class="nav-item">
<a class="nav-link" href="#">写文章</a>
</li>
<!-- start 如果用户已经登录则显示用户名和头像 -->
{# 判断用户是否登录#}
{% if user.is_authenticated %}
<img src="" style="width: 38px;height: 38px; border-radius: 15%;">
<a class="nav-link" href="#">添加头像</a>
<li class="nav-item dropdown">
<a class="nav-link dropdown-toggle" href="#" id="navbarDropdown" role="button"
data-toggle="dropdown" aria-haspopup="true" aria-expanded="false">
</a>
<div class="dropdown-menu" aria-labelledby="navbarDropdown">
<a class="dropdown-item" href="{% url 'user:logout' %}">退出登录</a>
<a class="dropdown-item" href="#">个人中心</a>
</div>
</li>
{% else %}
<!-- 如果用户未登录则显示 “登录” -->
<li class="nav-item">
<a class="nav-link" href="{% url 'user:login' %}">登录</a>
</li>
<li class="nav-item">
<a class="nav-link" href="{% url 'user:register' %}">注册</a>
</li>
{% endif %}
</ul>
</div>
</div>
</nav>
<!-- 预留具体页面的位置 -->
{% block content %}{% endblock content %}
<div>
<br><br><br>
</div>
<footer class="py-3 bg-dark fixed-bottom">
<div class="container">
<p class="m-0 text-center text-white">Copyright © xxx</p>
</div>
</footer>
</body>
</html>
实现登陆限制指定某些url只有登陆了以后才能访问
在blog/blog/apps/user/views.py文件中添加如下方法
# 重写一个类 重写as_view的方法 只有登录了才能访问
class LoginRequired(View):
@classmethod
def as_view(cls, **initkwargs):
view = super().as_view()
return login_required(view)
只要继承了这个类的类视图只有登录了之后才能访问
如果登录了就能正常访问没有登录可以在Django中配置自动跳转到指定的页面一般都是登录界面
在setting/dev.py文件中添加如下设置指定没有登陆的时候要跳转到的页面
LOGIN_URL = '/login'
通过邮件重置密码
安装第三方库
pip install django-password-reset
开启QQ邮箱设置中的“POP3/IMAP/SMTP/Exchange/CardDAV/CalDAV服务”
在setting/dev.py文件中添加如下配置
EMAIL_HOST = 'smtp.qq.com'
EMAIL_PORT = 25 #发件箱的smtp服务器端口
EMAIL_HOST_USER = '@qq.com' # 你的 QQ邮箱 账号
EMAIL_HOST_PASSWORD = '' #QQ邮箱授权码
EMAIL_USE_TLS = True # 这里必须是 True否则发送不成功
EMAIL_FROM = '@qq.com' # 你的 QQ邮箱 账号
DEFAULT_FROM_EMAIL = '@qq.com' # 你的 QQ邮箱 账号
INSTALLED_APPS = [
'password_reset',# 注册APP
]
配置总路由blog/urls.py
from django.contrib import admin
from django.urls import path,include
urlpatterns = [
path('admin/', admin.site.urls),
# 进行路由分发
path('user/',include('user.urls')),
path('password-reset',include('password_reset.urls')),
]
个人中心
在blog/blog/apps/user/views.py文件中添加如下方法
# 个人中心
class Info(LoginRequired): # as_view 重写这个方法
# 展示个人中心html页面
def get(self,request,id):
return render(request,'user/info.html')
# 实现用户中心的功能逻辑
def post(self,request,id): # 细节的时候
# 本质 ===》修改已经存在的用户的一些数据
user = get_object_or_404(User,pk=id)
# get_object_or_404(模型的类名,条件)
# 如果找到了对应的哪一条数据就返回数据
# 如果没找到就返回一个404错误
# 1. 接受参数 数据校验 数据入库 返回结果
user.phone = request.POST.get('phone')
user.bio = request.POST.get('bio')
avater = request.FILES.get('avater')
# 重新上传了头像才更改
if avater:
user.avater = avater
user.save()
return redirect(reverse('user:login'))
设置路由blog/blog/apps/user/urls.py
from django.urls import path
from . import views
app_name = 'user'
urlpatterns = [
# 注册
path('register',views.Register.as_view(),name='register'),
# 登录
path('login',views.Login.as_view(),name='login'),
# 退出登录
path('logout',views.user_logout,name='logout'),
# 个人中心 html的展示 get 数据的提交 post
# 应不应该有参数 所有的人都可以去个人中心 个人中心===》只针对已经登录的用户的
path('info/<int:id>',views.Info.as_view(),name='info'),
]
上传的文件要想展示必须要在总路由blog/urls.py文件中进行如下配置
from django.contrib import admin
from django.urls import path,include
from django.conf.urls.static import static
from django.conf import settings
urlpatterns = [
...
]+static(settings.MEDIA_URL,document_root=settings.MEDIA_ROOT)
在templates/user路径下创建info.html文件
{% extends "base.html" %}
{% block title %} 用户信息 {% endblock title %}
{% block content %}
<div class="container">
<div class="row">
<div class="col-12">
<br>
<div class="col-md-4">用户名: {{ user.username }}</div>
<br>
<!-- 有头像则展示头像 -->
{% if user.avater %}
<div class="col-md-4">头像</div>
<img src="{{ user.avater.url }}" style="max-width: 20%; border-radius: 15%;" class="col-md-4">
{# <img src="" style="max-width: 20%; border-radius: 15%;" class="col-md-4">#}
{% else %}
<h5 class="col-md-4">暂无头像</h5>
{% endif %}
<!-- 有头像则展示头像 -->
<br>
<br>
<form method="post" action="{% url 'user:info' user.id %}" enctype="multipart/form-data">
{# <form method="post" action="" enctype="multipart/form-data">#}
{% csrf_token %}
<!-- phone -->
<div class="form-group col-md-4">
<label for="phone">电话</label>
<input type="text" class="form-control" id="phone" name="phone" value="{{ user.phone }}">
{# <input type="text" class="form-control" id="phone" name="phone" value="">#}
</div>
<!-- avatar -->
<div class="form-group">
<label for="avatar">上传头像</label>
<input type="file" class="form-control-file" name="avater" id="avatar">
</div>
<!-- bio -->
<div class="form-group col-md-4">
<label for="bio">简介</label>
<textarea type="text" class="form-control" id="bio" name="bio" rows="12">{{ user.bio }}</textarea>
{# <textarea type="text" class="form-control" id="bio" name="bio" rows="12"></textarea>#}
</div>
<!-- 提交按钮 -->
<button type="submit" class="btn btn-primary">提交</button>
</form>
</div>
</div>
</div>
{% endblock content %}
使用并优化admin管理后台
可以使用路由127.0.0.1:8000/admin进入并查看系统自带的后台系统
创建超级管理员用户在虚拟环境下并且manage.py所在的路径下
python manage.py createsuperuser
django自带的admin管理后台比较简单所以我们可以用第三方库来美化一下
pip install django-simpleui
下载成功之后记得在配置文件dev.py中加入app
INSTALLED_APPS = [
'simpleui', # 细节点要放在django自带的前面
'django.contrib.admin', # 自带的admin管理后台
]
将user模块加入admin管理后台进行管理在user/admin.py中配置
from django.contrib import admin
from user.models import User
# 创建一个ModelAdmin的子类
class UserAdmin(admin.ModelAdmin):
list_display = ['username','email','phone','create_time']
search_fields = ['username','email']
# 将模型和ModelAdmin结合起来
admin.site.register(User,UserAdmin)
admin.site.site_header = '老杨的博客管理后台'
admin.site.site_title = '博客管理后台'
在dev.py的配置文件中可以设置隐藏右边的广告链接和使用分析
# 隐藏右侧SimpleUI广告链接和使用分析
SIMPLEUI_HOME_INFO = False
SIMPLEUI_ANALYSIS = False
在user/models.py中进行如下更改
class User(AbstractUser,BaseModel):
...
class Meta:
db_table = 'blog_users'
verbose_name = '用户' # 新增
verbose_name_plural = verbose_name # 新增
在user/apps.py中添加如下代码
from django.apps import AppConfig
class UserConfig(AppConfig):
name = 'user'
verbose_name = '用户管理'
在user/__init__.py中添加如下代码
default_app_config='user.apps.UserConfig'
这样就可以使用新的更好看的后台界面了