登录的本质,就是去数据库中根据用户名查询出一条数据,然后再将用户输入的密码进行加密,然后拿这个加密后的密码和数据库中已经保存好的进行对比。
在/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=emailif user.check_password(password):return userexcept Exception as err:return None
在setting/dev.py文件中进行设置,告诉Django修改了默认的内容
# 添加如下代码
AUTHENTICATION_BACKENDS = ['user.views.CustomBackend'
]
在/apps/user/views.py文件中添加退出登录的方法(函数):
# 退出登录的方法
from django.contrib.auth import logoutdef user_logout(request):logout(request) return redirect(reverse('user:login'))
添加退出登录的路由(/apps/user/urls.py)
from django.urls import path
from . import viewsapp_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 %}
{% block title %}{% endblock %}
{% block content %}{% endblock content %}
在blog/blog/apps/user/views.py文件中添加如下方法:
# 重写一个类 重写as_view的方法 只有登录了才能访问
class LoginRequired(View):@classmethoddef 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,includeurlpatterns = [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 = avateruser.save()return redirect(reverse('user:login'))
设置路由(blog/blog/apps/user/urls.py):
from django.urls import path
from . import viewsapp_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/',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 settingsurlpatterns = [...
]+static(settings.MEDIA_URL,document_root=settings.MEDIA_ROOT)
在templates/user路径下创建info.html文件:
{% extends "base.html" %}
{% block title %} 用户信息 {% endblock title %}
{% block content %}
用户名: {{ user.username }}
{% if user.avater %}头像
{ user.avater.url }}" style="max-width: 20%; border-radius: 15%;" class="col-md-4">
{#
#}{% else %}暂无头像
{% endif %}
{% endblock content %}
可以使用路由: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 AppConfigclass UserConfig(AppConfig):name = 'user'verbose_name = '用户管理'
在user/__init__.py中添加如下代码:
default_app_config='user.apps.UserConfig'
这样就可以使用新的更好看的后台界面了