知识星球 | 深度连接铁杆粉丝,运营高品质社群,知识变现的工具
目录
配置开发目录
配置MySQL数据库
配置Redis数据库
配置工程日志
用户注册
跨域CORS
注意
配置开发目录
libs 存放第三方的库文件
utils 存放项目自己定义的公共函数或类等
apps 存放Django的应用
templates 模板文件存放文件夹
配置MySQL数据库
1. 新建MySQL数据库
1.新建MySQL数据库:tuling_mall
$ create database tuling_mall charset=utf8;2.新建MySQL用户
$ create user poppies identified by 'root';3.授权itcast用户访问meiduo_mall数据库
$ grant all on tuling_mall.* to 'poppies'@'%';4.授权结束后刷新特权
$ flush privileges;
2. 配置MySQL数据库
文档
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.mysql', # 数据库引擎
'HOST': '127.0.0.1', # 数据库主机
'PORT': 3306, # 数据库端口
'USER': 'poppies', # 数据库用户名
'PASSWORD': 'root', # 数据库用户密码
'NAME': 'tuling_mall' # 数据库名字
},
}
3. 安装mysqlclient扩展包
1.安装驱动程序
$ pip install mysqlclient 配置完成后:运行程序,测试结果。配置Redis数据库
1. 安装django-redis扩展包
1.安装django-redis扩展包
$ pip install django-redis 2.django-redis使用说明文档点击进入文档
2. 配置Redis数据库
CACHES = {
"default": { # 默认
"BACKEND": "django_redis.cache.RedisCache",
"LOCATION": "redis://127.0.0.1:6379/0",
"OPTIONS": {
"CLIENT_CLASS": "django_redis.client.DefaultClient",
}
},
"session": { # session
"BACKEND": "django_redis.cache.RedisCache",
"LOCATION": "redis://127.0.0.1:6379/1",
"OPTIONS": {
"CLIENT_CLASS": "django_redis.client.DefaultClient",
}
},
}
SESSION_ENGINE = "django.contrib.sessions.backends.cache"
SESSION_CACHE_ALIAS = "session"
default:
- 默认的Redis配置项,采用0号Redis库。
session:
- 状态保持的Redis配置项,采用1号Redis库。
SESSION_ENGINE
- 修改session存储机制使用Redis保存。
SESSION_CACHE_ALIAS:
- 使用名为"session"的Redis配置项存储session数据。
配置完成后:运行程序,测试结果。
配置工程日志
文档
1. 配置工程日志
import os
LOGGING = {
'version': 1,
'disable_existing_loggers': False, # 是否禁用已经存在的日志器
'formatters': { # 日志信息显示的格式
'verbose': {
'format': '%(levelname)s %(asctime)s %(module)s %(lineno)d %(message)s'
},
'simple': {
'format': '%(levelname)s %(module)s %(lineno)d %(message)s'
},
},
'filters': { # 对日志进行过滤
'require_debug_true': {
'()': 'django.utils.log.RequireDebugTrue',
},
},
'handlers': { # 日志处理方法
'console': { # 向终端中输出日志
'level': 'INFO',
'filters': ['require_debug_true'],
'class': 'logging.StreamHandler',
'formatter': 'simple'
},
'file': { # 向文件中输出日志
'level': 'INFO',
'class': 'logging.handlers.RotatingFileHandler',
'filename': os.path.join(BASE_DIR, 'logs/meiduo.log'), # 日志文件的位置
'maxBytes': 300 * 1024 * 1024,
'backupCount': 10,
'formatter': 'verbose'
},
},
'loggers': { # 日志器
'django': { # 定义了一个名为django的日志器
'handlers': ['console', 'file'], # 可以同时向终端与文件中输出日志
'propagate': True, # 是否继续传递日志信息
'level': 'INFO', # 日志器接收的最低日志级别
},
}
}
2. 准备日志文件目录
3. 日志记录器的使用
不同的应用程序所定义的日志等级可能会有所差别,分的详细点的会包含以下几个等级:
- FATAL/CRITICAL = 重大的,危险的
- ERROR = 错误
- WARNING = 警告
- INFO = 信息
- DEBUG = 调试
- NOTSET = 没有设置
import logging
# 创建日志记录器
logger = logging.getLogger('django')
# 输出日志
logger.debug('测试logging模块debug')
logger.info('测试logging模块info')
logger.error('测试logging模块error')
用户注册
1. 创建用户模块应用
在apps包下创建应用users
$ python ../manage.py startapp users
2. 注册用户模块应用
INSTALLED_APPS = [ ... 'apps.users', ]
注册完users应用后,运行测试程序。
3. 自定义用户模型类
思考:为什么要自定义用户模型类?
- 观察注册界面会发现,图灵商城注册数据中必选用户mobile信息。
- 但是Django默认用户模型类中没有mobile字段,所以要自定义用户模型类。
如何自定义用户模型类?
- 继承自AbstractUser(可通过阅读Django默认用户模型类的源码得知) 。
- 新增mobile字段。
from django.db import models
from django.contrib.auth.models import AbstractUser
# Create your models here.
class User(AbstractUser):
"""自定义用户模型类"""
mobile = models.CharField(max_length=11, unique=True, verbose_name='手机号')
class Meta:
db_table = 'tb_users'
verbose_name = '用户'
verbose_name_plural = verbose_name
def __str__(self):
return self.username
4. 知识要点
- Django自带用户认证系统,核心就是User对象。
- Django用户认证系统包含了一系列对用户的操作,比如:模型类,认证,权限,分组,密码处理等。
- Django用户认证系统中的用户模型类可以自定义,继承自AbstractUser。
- Django用户认证系统说明文档
迁移用户模型类
1. 指定用户模型类
文档
思考:为什么Django默认用户模型类是User?
- 阅读源代码:'django.conf.global_settings’
AUTH_USER_MODEL = 'auth.User'结论:
- Django用户模型类是通过全局配置项AUTH_USER_MODEL决定的
配置规则:
AUTH_USER_MODEL = '应用名.模型类名' # 指定本项目用户模型类 AUTH_USER_MODEL = 'users.User'
2. 迁移用户模型类
1.创建迁移文件
- python manage.py makemigrations
2.执行迁移文件
- python manage.py migrate
3. 知识要点
- 用户认证系统中的用户模型类,是通过全局配置项AUTH_USER_MODEL决定的。
- 如果迁移自定义用户模型类,必须先配置 AUTH_USER_MODEL。
报这种错是因为只能有一个超级管理员
跨域CORS
我们的前端和后端分别是两个不同的端口
前端服务127.0.0.1:8080后端服务127.0.0.1:8000
现在,前端与后端分处不同的域名,这就涉及到跨域访问数据的问题,因为浏览器的同源策略,默认是不支持两个不同域间相互访问数据,而我们需要在两个域名间相互传递数据,这时我们就要为后端添加跨域访问的支持。
我们使用CORS来解决后端对跨域访问的支持。
使用django-cors-headers扩展
参考文档
安装
pip install django-cors-headers
添加应用
INSTALLED_APPS = (
...
'corsheaders',
...
)
中间层设置
MIDDLEWARE = [
'corsheaders.middleware.CorsMiddleware',
...
]
添加白名单
# CORS
CORS_ORIGIN_WHITELIST = (
'http://127.0.0.1:8080',
'http://localhost:8080',
'http://127.0.0.1:8000'
)
CORS_ALLOW_CREDENTIALS = True # 允许携带cookie
- 凡是出现在白名单中的域名,都可以访问后端接口
- CORS_ALLOW_CREDENTIALS 指明在跨域访问中,后端是否支持对cookie的操作。
用户名重复注册
1. 用户名重复注册逻辑分析
3. 用户名重复注册后端逻辑
from django.views import View
from apps.users.models import User
from django.http import JsonResponse
class UsernameCountView(View):
"""判断用户名是否重复注册"""
def get(self, request, username):
"""
:param request: 请求对象
:param username: 用户名
:return: JSON
"""
count = User.objects.filter(username=username).count()
return JsonResponse({'code': 0, 'errmsg': 'OK', 'count': count})
4.添加路由转换器
在utils包下创建一个converters.py文件
class UsernameConverter:
"""自定义路由转换器去匹配用户名"""
# 定义匹配用户名的正则表达式
regex = '[a-zA-Z0-9_-]{5,20}'
def to_python(self, value):
return str(value)
在总路由中添加路由转换器
from django.contrib import admin
from django.urls import path,include
from utils.converters import UsernameConverter
from django.urls import register_converter
register_converter(UsernameConverter,'username')
urlpatterns = [
path('admin/', admin.site.urls),
path('',include('apps.users.urls'))
]
在子应用中调用验证
from django.urls import path
from . import views
urlpatterns = [
# 判断用户名是否重复
path('usernames/<username:username>/count/',views.UsernameCountView.as_view()),
]
注意
我们通过postman或者浏览器验证的时候回出现CSRF Forbidden问题