Django 内置权限实现注册登录教程
内置权限实现注册登录
环境搭建
安装依赖
pip install django
创建项目
# 创建项目 django-admin startproject z07_django_auth # 创建静态目录和模板目录 cd z07_django_auth mkdir static templates media # 创建应用 python manage.py startapp index
配置项目
配置应用:
# 应用配置 INSTALLED_APPS = [ # 后台应用 'django.contrib.admin', # 权限应用 'django.contrib.auth', 'django.contrib.contenttypes', # session应用,用来记录session 'django.contrib.sessions', # message应用,用来发送消息 'django.contrib.messages', # 静态文件应用,用来处理静态文件 'django.contrib.staticfiles', # 入口应用 'index', ]
配置模板目录:
# 模板配置 TEMPLATES = [ { 'BACKEND': 'django.template.backends.django.DjangoTemplates', # 配置模板目录 'DIRS': [BASE_DIR / 'templates'], 'APP_DIRS': True, 'OPTIONS': { 'context_processors': [ 'django.template.context_processors.debug', 'django.template.context_processors.request', 'django.contrib.auth.context_processors.auth', 'django.contrib.messages.context_processors.messages', ], }, }, ]
配置数据库:
# 数据库信息 DATABASES = { 'default': { 'ENGINE': 'django.db.backends.mysql', 'NAME': 'django_shop', # 数据库名 'USER': 'root', # 用户名 'PASSWORD': 'root', # 密码 'HOST': '192.168.33.12', # 主机 'PORT': '3306', # 取消外键约束,否则多对多模型迁移报django.db.utils.IntegrityError: (1215, 'Cannot add foreign key constraint') 'OPTIONS': { "init_command": "SET foreign_key_checks = 0;", 'charset': 'utf8' }, } }
引入MySQL驱动:
import zdppy_mysql zdppy_mysql.install_as_MySQLdb()
执行数据库迁移:
python manage.py makemigrations python manage.py migrate
配置语言和时区:
# 时区配置 LANGUAGE_CODE = 'zh-hans' TIME_ZONE = 'Asia/Shanghai' USE_I18N = True USE_TZ = True
配置静态目录:
# 文件配置 STATICFILES_DIRS = [BASE_DIR / 'static'] STATIC_URL = '/static/' if not DEBUG: STATIC_ROOT = BASE_DIR / 'static' MEDIA_URL = "/media/" MEDIA_ROOT = BASE_DIR / "media"
日志配置:
# 配置日志 LOGGING = { 'version': 1, 'disable_existing_loggers': False, # 日志处理器 'handlers': { # 控制台日志处理器 'console': { 'level': 'DEBUG', 'class': 'logging.StreamHandler', }, }, 'loggers': { # SQL语句输出到控制台 'django.db.backends': { 'handlers': ['console'], 'propagate': True, 'level': 'DEBUG', }, } }
总路由
from django.contrib import admin from django.urls import path, include, re_path from django.views.static import serve from . import settings urlpatterns = [ path('admin/', admin.site.urls), path('', include("index.urls")), # 配置媒体文件目录 re_path('^media/(?P<path>.*)$', serve, {'document_root': settings.MEDIA_ROOT}) ]
子路由
from django.urls import path from . import views app_name = 'index' urlpatterns = [ path('', views.index, name='index'), ]
视图函数
from django.shortcuts import render def index(request): return render(request, "index.html")
模板
<!DOCTYPE html> <html lang="zh-CN"> <head> <meta charset="UTF-8"> <title>Django权限示例</title> </head> <body> <h1>Django权限示例</h1> <h2>路由列表</h2> <ul> <li><a href="{%%20url%20'index:index'%20%}">/</a></li> </ul> </body> </html>
启动测试
在项目目录执行以下命令启动服务:
python manage.py runserver
用户注册
路由设计
from django.urls import path from . import views app_name = 'index' urlpatterns = [ # 用户注册 path('/register/', views.register, name='register'), ]
视图函数
from django.contrib.auth import authenticate, login from django.contrib.auth.models import User from django.shortcuts import render, redirect from django.urls import reverse def register(request): """用户注册""" # 渲染注册页面 if request.method == "GET": return render(request, 'register.html') # 执行注册功能 if request.method == "POST": # 获取用户名和密码 uname = request.POST.get("username", '') pwd = request.POST.get("password", '') email = request.POST.get("email", '') re_password = request.POST.get("re-password", '') if pwd != re_password: info = "两次密码不一致" elif User.objects.filter(username=uname): info = '用户已经存在' else: # 添加用户数据到数据库 # is_staff:是否登录后台 # is_active:是否激活 # is_superuser:是否为超级管理员 d = dict(username=uname, password=pwd, email=email, is_staff=1, is_active=1, is_superuser=1) user = User.objects.create_user(**d) info = '注册成功,请登陆' # 跳转到登陆页面 return redirect(reverse("index:login")) return render(request, 'register.html', {"info": info})
模板:
<!DOCTYPE html> <html lang="en"> <head> <meta charset="utf-8"> <title>用户注册</title> </head> <body class="hold-transition register-page"> <div class="register-box"> <div class="register-logo"> <b>用户注册</b> </div> <div class="card"> <div class="card-body register-card-body"> <form action="{% url 'index:register' %}" method="post"> {% csrf_token %} <div class="input-group mb-3"> <input type="text" class="form-control" name="username" placeholder="用户名"> </div> <div class="input-group mb-3"> <input type="email" class="form-control" name="email" placeholder="邮箱"> </div> <div class="input-group mb-3"> <input type="password" class="form-control" name="password" placeholder="密码"> </div> <div class="input-group mb-3"> <input type="password" class="form-control" name="re-password" placeholder="重复密码"> </div> <div class="row"> <div class="col-8"> <label for="agreeTerms"> {{ info }} </label> </div> <div class="col-4"> <button type="submit" class="btn btn-primary btn-block">注册</button> </div> </div> </form> </div> </div> </div> </body> </html>
测试地址:http://192.168.33.13:8000/reigister/
THE END