前言
学无止境,无止境学。大家好,我是张大鹏,之前在抖音有5万多粉丝,不过现在不拍视频,专心写公众号了。笔者目前是高级Python工程师,之前是全栈工程师,主要擅长Golang和Python开发,对于Java,Vue,React也有一些研究。工作之余,喜欢学习和分享,希望能够通过此公众号”张大鹏520″,将自己学到的东西分享给大家,和大家一起交流,一起成长,一起进步。
今天要给大家分享的是《Django加Vue电商项目实战15 商城系统后台环境搭建》,这是一个系列的教程,从零基础到项目实战。在本教程中,我会给大家介绍如何搭建商城系统后台的开发环境。比如基本配置,定制用户模型,权限中间件等。还会配套相关的练习,大家学完以后可以自行通过练习题巩固和加深对知识点的理解。
如果大家需要本教程的PDF电子书或者完整的源码,可以在文末找到获取方式哈。
环境搭建
安装依赖
pip install django
创建项目
# 创建项目
django-admin startproject z08_shop_admin
# 创建静态目录和模板目录
cd z08_shop_admin
mkdir static templates media
# 创建应用
python manage.py startapp index
配置项目
基础配置:
# 基础配置
BASE_DIR = Path(__file__).resolve().parent.parent
SECRET_KEY = 'django-insecure-hqk4c1#kggt@=u@owtbvdgutl&b!=pp*y($1s1z0cw^=a*g#(j'
DEBUG = True
ALLOWED_HOSTS = ["*"]
ROOT_URLCONF = 'z08_shop_admin.urls'
WSGI_APPLICATION = 'z08_shop_admin.wsgi.application'
DEFAULT_AUTO_FIELD = 'django.db.models.BigAutoField'
配置应用:
# 应用配置
INSTALLED_APPS = [
# 后台应用
'django.contrib.admin',
# 权限应用
'django.contrib.auth',
'django.contrib.contenttypes',
# session应用,用来记录session
'django.contrib.sessions',
# message应用,用来发送消息
'django.contrib.messages',
# 静态文件应用,用来处理静态文件
'django.contrib.staticfiles',
# 入口应用
'index',
]
配置中间件:
# 中间件列表
MIDDLEWARE = [
'django.middleware.security.SecurityMiddleware',
'django.contrib.sessions.middleware.SessionMiddleware',
'django.middleware.common.CommonMiddleware',
# CSRF跨域攻击中间件
'django.middleware.csrf.CsrfViewMiddleware',
# 内置权限中间件
'django.contrib.auth.middleware.AuthenticationMiddleware',
# 消息中间件
'django.contrib.messages.middleware.MessageMiddleware',
'django.middleware.clickjacking.XFrameOptionsMiddleware',
# 自定义权限校验中间件
'index.middlewares.PermissionMiddleWare',
]
配置模板目录:
# 模板配置
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()
权限配置:
# 指定用户模型
AUTH_USER_MODEL = "index.User"
# 指定登录路由
# 这个路径需要根据你网站的实际登陆地址来设置
LOGIN_URL = '/login/'
# 密码校验配置
AUTH_PASSWORD_VALIDATORS = [
{
'NAME': 'django.contrib.auth.password_validation.UserAttributeSimilarityValidator',
},
{
'NAME': 'django.contrib.auth.password_validation.MinimumLengthValidator',
},
{
'NAME': 'django.contrib.auth.password_validation.CommonPasswordValidator',
},
{
'NAME': 'django.contrib.auth.password_validation.NumericPasswordValidator',
},
]
配置语言和时区:
# 时区配置
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.auth.models import AbstractUser
from django.db import models
class User(AbstractUser):
"""自定义用户模型"""
photo = models.CharField('用户头像', max_length=50)
wechat = models.CharField('微信', max_length=30)
level = models.CharField('用户等级', max_length=1)
def __str__(self):
return self.username
class Meta(AbstractUser.Meta):
# 自定义权限
permissions = (
['check_myuser', '审核用户信息'],
)
迁移模型:
python manage.py makemigrations
python manage.py migrate
权限中间件
import re
from django.shortcuts import redirect
from django.utils.deprecation import MiddlewareMixin
class PermissionMiddleWare(MiddlewareMixin):
"""权限校验中间件"""
def process_request(self, request):
"""处理请求的方法"""
# 获取当前路径
curr_path = request.path
# 白名单处理
white_list = ["/login/", "/register/"]
for w in white_list:
if re.search(w, curr_path):
return None # 通过
# 验证是否登陆
print(request.user.is_authenticated)
if not request.user.is_authenticated:
return redirect("/login/")
总路由
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'),
# 用户注册
path('register/', views.register, name='register'),
# 用户登录
path('login/', views.login_view, name='login'),
# 用户注销
path('logout/', views.logout_view, name='logout'),
]
视图函数
from django.contrib.auth import authenticate, login, logout
from django.contrib.auth.decorators import login_required, permission_required
from django.shortcuts import render, redirect
from django.urls import reverse
from .models import User
# Django会给每张表都添加增删改查的权限,分别对象add,delete,change,view
# 用 add_表名 的格式来指定是否具备某种权限
@permission_required("app.view_user")
@login_required
def index(request):
users = User.objects.all()
return render(request, "index.html", {"users": users})
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", '')
# 添加用户
if User.objects.filter(username=uname):
info = '用户已经存在'
else:
d = dict(username=uname, password=pwd, email='222@111.com',
is_staff=1, is_active=1, is_superuser=1,
wechat='zhangdapeng3333', level='1')
user = User.objects.create_user(**d)
info = '注册成功,请登陆'
# 跳转到登陆页面
return redirect(reverse("index:login"))
def login_view(request):
"""用户登录"""
# 渲染登录页面
if request.method == "GET":
return render(request, 'login.html')
# 执行登录功能
if request.method == "POST":
# 获取用户名和密码
uname = request.POST.get("username", '')
pwd = request.POST.get("password", '')
# 校验登录
if User.objects.filter(username=uname): # 判断用户是否存在
# 如果存在,进行验证
user = authenticate(username=uname, password=pwd)
if user: # 如果验证通过
if user.is_active: # 如果用户状态为激活
login(request, user) # 进行登陆操作,完成session的设置
info = "登陆成功"
return redirect(reverse("index:index"))
else:
info = "用户还未激活"
else:
info = "账号密码不对,请重新输入"
else:
info = '用户账号不存在,请查询'
return render(request, 'login.html', {"info": info})
def logout_view(request):
"""用户注销"""
logout(request)
return redirect(reverse("index:login"))
首页模板
<!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="{% url 'index:index' %}">/</a></li>
<li><a href="{% url 'index:register' %}">/register/</a></li>
<li><a href="{% url 'index:login' %}">/login/</a></li>
</ul>
<div class="content">
欢迎{{ request.user }}来到商城系统!
<a href="#">用户退出</a>
<br>
用户信息列表
<table border=1>
<tr>
<td>账号</td>
<td>用户姓名</td>
<td>email</td>
<td>操作</td>
</tr>
{% for user in users %}
<tr>
<td>{{ user.username }}</td>
<td>{{ user.truename }}</td>
<td>{{ user.email }}</td>
<td><a href="#">修改</a></td>
{% if perms.myuser.delete_myuser %}
<td>删除</td>
{% endif %}
</tr>
{% endfor %}
</table>
</div>
</body>
</html>
注册模板
<!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>
登录模板
<!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:login' %}" method="post">
{% csrf_token %}
<div class="input-group mb-3">
<input type="text" class="form-control" name="username" placeholder="用户名">
<div class="input-group-append">
<div class="input-group-text">
<span class="fas fa-user"></span>
</div>
</div>
</div>
<div class="input-group mb-3">
<input type="password" class="form-control" name="password" placeholder="密码">
<div class="input-group-append">
<div class="input-group-text">
<span class="fas fa-lock"></span>
</div>
</div>
</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>
启动测试
在项目目录执行以下命令启动服务:
python manage.py runserver
结语
关注我不迷路,欢迎关注我的微信公众号”张大鹏520″,如果您对此文章感兴趣,欢迎点赞收藏,留言评论。
文中所有代码,只需要打赏20元,然后留言评论“已打赏”,即可获取哦。
本文的PDF电子书版,只需要打赏3元,然后留言评论“已打赏”,即可获取哦。
写文章不容易,不喜勿喷哈,如果有想要学编程,学项目,或者在工作中有项目难以单独完成需要提供帮助的同学,欢迎私信我哈。生活不易,想要利用学到的编程知识,业余赚点零花钱。
接项目:网站开发,APP开发,各种管理系统开发。
带徒弟:Python编程教学,Golang编程教学,前端编程教学。
谢谢您!!!
原文始发于微信公众号(张大鹏520):Django加Vue电商项目实战15 商城系统后台环境搭建
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/48591.html