知识星球 | 深度连接铁杆粉丝,运营高品质社群,知识变现的工具
目录
配置开发目录
配置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问题