标签:work Matter 文档 缓存 and exception token 白名单 项目
两个目录的区别:
工程目录是指包含manage.py文件的目录
配置目录是批包含settings.py文件的目录
在配置目录中找到并打工settings.py文件,做以下配置:
01 DEBUG
DEBUG=True:用于开发环境
DEBUG=False:用于生产环境
02 ALLOWED_HOSTS
指定发布服务器IP或域名,开发期直接输入‘*‘
ALLOWED_HOSTS = [‘*‘]
03 INSTALLED_APPS
把创建的APP或相应的包按以下格式加入到INSTALLED_APPS列表中。
INSTALLED_APPS = [
‘django.contrib.admin‘,
‘django.contrib.auth‘,
‘django.contrib.contenttypes‘,
‘django.contrib.sessions‘,
‘django.contrib.messages‘,
‘django.contrib.staticfiles‘,
‘rest_framework‘, # djangorestframework框架
‘GeneralTools.apps.GeneraltoolsConfig‘,
‘Applications.Organizations.apps.OrganizationsConfig‘,
‘Applications.WeChart.apps.WechartConfig‘,
]
04 MIDDLEWARE
设置中间件
开发期禁止Csrf
MIDDLEWARE = [
‘django.middleware.security.SecurityMiddleware‘,
‘django.contrib.sessions.middleware.SessionMiddleware‘,
‘django.middleware.common.CommonMiddleware‘,
# ‘django.middleware.csrf.CsrfViewMiddleware‘,
‘django.contrib.auth.middleware.AuthenticationMiddleware‘,
‘django.contrib.messages.middleware.MessageMiddleware‘,
‘django.middleware.clickjacking.XFrameOptionsMiddleware‘,
]
05 TEMPLATES
设置模板路径,即每个APP下的Templates路径。
TEMPLATES = [
{
‘BACKEND‘: ‘django.template.backends.django.DjangoTemplates‘,
‘DIRS‘: [
os.path.join(BASE_DIR, ‘Applications/Organizations/Templates‘), # 新增模板路径
os.path.join(BASE_DIR, ‘Applications/WeChart/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‘,
],
},
},
]
06 数据库设置
本项目包含四种不同类型的数据库:
1 sqlLite:系统默认关系数据库,用于前期开发使用
2 mysql:关系数据库
3 redis:缓存数据库
4 fastDFS:文件数据库
06.1 sqlLite配置
DATABASES = {
‘default‘: {
‘ENGINE‘: ‘django.db.backends.sqlite3‘, # 数据库引擎
‘NAME‘: os.path.join(BASE_DIR, ‘db.sqlite3‘),
}
}
06.2 mysql配置
MYSQL_SERVER = ‘‘ # 服务器域名或IP
DATABASES = {
‘default‘: {
‘ENGINE‘: ‘django.db.backends.mysql‘, # 数据库引擎
‘NAME‘: ‘‘, # 数据库名
‘USER‘: ‘root‘, # 数据库用户名
‘PASSWORD‘: ‘‘, # 数据库密码
‘HOST‘: MYSQL_SERVER,
‘PORT‘: ‘3306‘, # 数据库商品,默认3306
# ‘OPTIONS‘: {
# "init_command": "SET sql_mode=‘STRICT_TRANS_TABLES‘",
# }
}
}
06.3 redis配置
# Redis 数据库
REDIS_SERVER = ‘‘ # 数据库IP或域名
CACHES = {
# 缓存view数据
"default": {
"BACKEND": "django_redis.cache.RedisCache",
"LOCATION": "redis://" + REDIS_SERVER + ":6379/0",
"OPTIONS": {
"CLIENT_CLASS": "django_redis.client.DefaultClient",
"PASSWORD": "", # 数据库密码
}
},
# 缓存登录session
"session": {
"BACKEND": "django_redis.cache.RedisCache",
"LOCATION": "redis://" + REDIS_SERVER + ":6379/1",
"OPTIONS": {
"CLIENT_CLASS": "django_redis.client.DefaultClient",
"PASSWORD": "", # 数据库密码
}
},
# 存放sms验证码
"sms_codes": {
"BACKEND": "django_redis.cache.RedisCache",
"LOCATION": "redis://" + REDIS_SERVER + ":5379/2",
"OPTIONS": {
"CLIENT_CLASS": "django_redis.client.DefaultClient",
"PASSWORD": "", # 数据库密码
}
}
}
# 修改了Django的Session机制使用redis保存,且使用名为‘session‘的redis配置。
# 此处修改Django的Session机制存储主要是为了给Admin站点使用。
SESSION_ENGINE = "django.contrib.sessions.backends.cache"
SESSION_CACHE_ALIAS = "session"
06.4 fastDFS配置
# 覆盖Django默认指定的文件存储方式 FDFS_SERVER = ‘‘ # 数据库IP或域名 DEFAULT_FILE_STORAGE = ‘Tools.storage.FdfsStorage‘ # 自定义两个变量,分别表示client.conf文件的路径和fdfs的url FDFS_CLIENT_CONF = os.path.join(BASE_DIR, ‘Configurations‘, ‘client.conf‘) FDFS_URL = ‘http://‘ + FDFS_SERVER + ‘:80/‘
07 时区和时间配置
LANGUAGE_CODE = ‘zh-hans‘ TIME_ZONE = ‘Asia/Chongqing‘
08 静态文件配置
STATIC_URL = ‘/static/‘
STATICFILES_DIRS = (
os.path.join(BASE_DIR, ‘static‘),
)
09 运行日志配置
# 日志处理
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在debug模式下才输出日志
‘()‘: ‘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, ‘Configurations/tongheng2.log‘), # 日志文件的位置
‘maxBytes‘: 300 * 1024 * 1024,
‘backupCount‘: 10,
‘formatter‘: ‘verbose‘
},
},
‘loggers‘: { # 日志器
‘tongheng2‘: { # 定义了一个名为yiwenzhen的日志器
‘handlers‘: [‘console‘, ‘file‘], # 可以同时向终端与文件中输出日志
‘propagate‘: True, # 是否继续传递日志信息
‘level‘: ‘INFO‘, # 日志器接收的最低日志级别
},
}
}
10 DRF配置
# REST配置
REST_FRAMEWORK = {
# JWT 认证
‘DEFAULT_AUTHENTICATION_CLASSES‘: (
‘rest_framework_jwt.authentication.JSONWebTokenAuthentication‘, # JWT认证
‘rest_framework.authentication.SessionAuthentication‘, # session认证
‘rest_framework.authentication.BasicAuthentication‘, # 基本认证
),
# 过滤Filtering
‘DEFAULT_FILTER_BACKENDS‘: (‘django_filters.rest_framework.DjangoFilterBackend‘,),
# 分页Pagination
# 也可通过自定义Pagination类,来为视图添加不同分页行为。在视图中通过pagination_clas属性来指明。
‘DEFAULT_PAGINATION_CLASS‘: ‘rest_framework.pagination.PageNumberPagination‘,
‘PAGE_SIZE‘: 20, # 每页数目
# 异常处理(自定义异常)
‘EXCEPTION_HANDLER‘: ‘Genera.Exceptions.exception_handler‘,
# 接口文档
# ‘DEFAULT_SCHEMA_CLASS‘: ‘rest_framework.schemas.AutoSchema‘,
‘DEFAULT_SCHEMA_CLASS‘: ‘rest_framework.schemas.coreapi.AutoSchema‘,
}
11 DRF扩展配置
# DRF扩展
REST_FRAMEWORK_EXTENSIONS = {
# 缓存时间,单位秒(24小时)
‘DEFAULT_CACHE_RESPONSE_TIMEOUT‘: 24 * 60 * 60,
# 缓存存储
‘DEFAULT_USE_CACHE‘: ‘default‘,
}
12 用户模型配置
12.1 创建公共模型
在本项目中,所有表结构都有创建时间和更新时间两个字段,故创建一个公共类用于继承。
在GeneralTools目录下创建一个名为BaseModel.py文件,内容如下:
from django.db import models
class BaseModel(models.Model):
create_time = models.DateTimeField(auto_now_add=True, verbose_name=‘创建时间‘, help_text=‘创建时间‘)
update_time = models.DateTimeField(auto_now=True, verbose_name=‘更新时间‘, help_text=‘更新时间‘)
class Meta:
# 说明这个类是一个抽象模型类,在迁移的时候不会生成表
abstract = True
12.2 创建用户模型
因Django中已存在用户模型,为增加相关字段,也需要继承。
找到Organizations下的models.py文件,在其中创建用户模型,代码如下:
from django.db import models
from django.contrib.auth.models import AbstractUser
from GeneralTools.BaseModel import BaseModel
class UserInfo(AbstractUser, BaseModel):
openid = models.CharField(max_length=100, verbose_name=‘openid‘, null=True, blank=True, help_text=‘openid‘)
mobile = models.CharField(max_length=20, verbose_name=‘手机‘, help_text=‘手机‘) # 手机是整个平台的通行证
identity = models.CharField(max_length=30, verbose_name=‘身份证号‘, default=‘‘, help_text=‘身份证号‘)
weixin = models.CharField(max_length=50, verbose_name=‘微信号‘, null=True, blank=True, help_text=‘微信号‘)
nickname = models.CharField(max_length=200, verbose_name=‘用户昵称‘, null=True, blank=True, help_text=‘用户昵称‘)
sexchoice = (
(1, ‘男‘),
(2, ‘女‘),
)
sex = models.IntegerField(choices=sexchoice, verbose_name=‘性别‘, null=True, blank=True, help_text=‘性别‘)
province = models.CharField(max_length=30, verbose_name=‘省‘, null=True, blank=True, help_text=‘省‘)
language = models.CharField(max_length=100, verbose_name=‘语言‘, null=True, blank=True, help_text=‘语言‘)
city = models.CharField(max_length=30, verbose_name=‘市‘, null=True, blank=True, help_text=‘市(地级市)‘)
country = models.CharField(max_length=30, verbose_name=‘县‘, null=True, blank=True, help_text=‘县(县级市)‘)
photo_url = models.CharField(max_length=300, verbose_name=‘微信头像路径‘, null=True, blank=True, help_text=‘微信头像路径‘)
subscribe_scene = models.CharField(max_length=50, verbose_name=‘用户关注的渠道来源‘, null=True, blank=True,
help_text=‘用户关注的渠道来源‘)
class Meta:
db_table = ‘UserInfo‘
verbose_name_plural = ‘001 用户信息表‘
12.3 指定Django系统认证所使用的模型
# 指定Django认证系统所使用的模型类 AUTH_USER_MODEL = ‘Organization.UserInfo‘
12.4 执行数据迁移
在PyCharm的Termail中,在虚拟环境下执行数据迁移:
python manage.py makemigrations python manage.py migrate
看到以下效果,表示数据迁移成功:
(thvenv) D:\DjangoDevelopment\Demonstrations\TongHeng2>python manage.py makemigrations
Migrations for ‘Organizations‘:
Applications\Organizations\migrations\0001_initial.py
- Create model UserInfo
(thvenv) D:\DjangoDevelopment\Demonstrations\TongHeng2>python manage.py migrate
Operations to perform:
Apply all migrations: Organizations, admin, auth, contenttypes, sessions
Running migrations:
Applying contenttypes.0001_initial... OK
Applying contenttypes.0002_remove_content_type_name... OK
Applying auth.0001_initial... OK
Applying auth.0002_alter_permission_name_max_length... OK
Applying auth.0003_alter_user_email_max_length... OK
Applying auth.0004_alter_user_username_opts... OK
Applying auth.0005_alter_user_last_login_null... OK
Applying auth.0006_require_contenttypes_0002... OK
Applying auth.0007_alter_validators_add_error_messages... OK
Applying auth.0008_alter_user_username_max_length... OK
Applying auth.0009_alter_user_last_name_max_length... OK
Applying auth.0010_alter_group_name_max_length... OK
Applying auth.0011_update_proxy_permissions... OK
Applying Organizations.0001_initial... OK
Applying admin.0001_initial... OK
Applying admin.0002_logentry_remove_auto_add... OK
Applying admin.0003_logentry_add_action_flag_choices... OK
Applying sessions.0001_initial... OK
(thvenv) D:\DjangoDevelopment\Demonstrations\TongHeng2>python manage.py migrate
12.5 运行程序,看到欢迎页面,表示到目前为止,工程正常!
13 跨域CORS白名单设置
# 跨域CORS白名单
CORS_ORIGIN_WHITELIST = (
‘http://127.0.0.1:80‘,
‘http://127.0.0.1:8000‘,
)
CORS_ALLOW_CREDENTIALS = True # 允许携带cookie
14 JWT用户认证配置
由于要设置有效时间,故需要在settings.py文件开头,先导入日期时间包
import os import datetime
# JWT 配置
JWT_AUTH = {
# 设置生成(签发)jwt token时token有效时间
‘JWT_EXPIRATION_DELTA‘: datetime.timedelta(days=1),
# 指定JWT 扩展登录视图生成响应数据调用函数
‘JWT_RESPONSE_PAYLOAD_HANDLER‘: ‘Applications.Organization.utils.jwt_response_payload_handler‘
}
# 指定Django认证系统后端类,支持用户名或手机号登录
AUTHENTICATION_BACKENDS = [
# ‘Apps.OrgsAndUsers.utils.UsernameMobileAuthBackend‘
]
标签:work Matter 文档 缓存 and exception token 白名单 项目
原文地址:https://www.cnblogs.com/dorian/p/12367627.html