Django搭建个人博客Blog-Day04

阿里云国内75折 回扣 微信号:monov8
阿里云国际,腾讯云国际,低至75折。AWS 93折 免费开户实名账号 代冲值 优惠多多 微信号:monov8 飞机:@monov6

实现不同的方式进行登录

登录的本质就是去数据库中根据用户名查询出一条数据然后再将用户输入的密码进行加密然后拿这个加密后的密码和数据库中已经保存好的进行对比。

  1. 在/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
  1. 在setting/dev.py文件中进行设置告诉Django修改了默认的内容

# 添加如下代码
AUTHENTICATION_BACKENDS = [
    'user.views.CustomBackend'
]

退出登录

  1. 在/apps/user/views.py文件中添加退出登录的方法函数

# 退出登录的方法
from django.contrib.auth import logout

def user_logout(request):
    logout(request)   
    return redirect(reverse('user:login'))
  1. 添加退出登录的路由/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'),
]
  1. 对前端的代码做一些优化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 &copy; 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'

通过邮件重置密码

  1. 安装第三方库

pip install django-password-reset
  1. 开启QQ邮箱设置中的“POP3/IMAP/SMTP/Exchange/CardDAV/CalDAV服务

  1. 在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
]
  1. 配置总路由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')),
]

个人中心

  1. 在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'))
  1. 设置路由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'),
]
  1. 上传的文件要想展示必须要在总路由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)
  1. 在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进入并查看系统自带的后台系统

  1. 创建超级管理员用户在虚拟环境下并且manage.py所在的路径下

python manage.py createsuperuser
  1. django自带的admin管理后台比较简单所以我们可以用第三方库来美化一下

pip install django-simpleui
  1. 下载成功之后记得在配置文件dev.py中加入app

INSTALLED_APPS = [
    'simpleui', # 细节点要放在django自带的前面
    'django.contrib.admin',  # 自带的admin管理后台
]
  1. 将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 = '博客管理后台'
 
  1. 在dev.py的配置文件中可以设置隐藏右边的广告链接和使用分析

# 隐藏右侧SimpleUI广告链接和使用分析
SIMPLEUI_HOME_INFO = False
SIMPLEUI_ANALYSIS = False
  1. 在user/models.py中进行如下更改

class User(AbstractUser,BaseModel):
    ...   

    
    class Meta:  
        db_table = 'blog_users'      
        verbose_name = '用户'     # 新增
        verbose_name_plural = verbose_name  # 新增
  1. 在user/apps.py中添加如下代码

from django.apps import AppConfig

class UserConfig(AppConfig):
    name = 'user'
    verbose_name = '用户管理'
  1. 在user/__init__.py中添加如下代码

default_app_config='user.apps.UserConfig'

这样就可以使用新的更好看的后台界面了

阿里云国内75折 回扣 微信号:monov8
阿里云国际,腾讯云国际,低至75折。AWS 93折 免费开户实名账号 代冲值 优惠多多 微信号:monov8 飞机:@monov6
标签: go