0004 工程配置settings.py
两个目录的区别:
工程目录是指包含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配置
10.1 自定义异常
在GeneralTools目录下,创建一个名为Exceptions.py的文件,用于自定义异常接口。内容如下:
from rest_framework.views import exception_handler as drf_exception_handler import logging from django.db import DatabaseError from redis.exceptions import RedisError from rest_framework.response import Response from rest_framework import status # 获取在配置文件中定义的logger,用来记录日志 logger = logging.getLogger('tongheng2') def exception_handler(exc, context): """ 自定义异常处理 :param exc: 异常 :param context: 抛出异常的上下文 :return: Response响应对象 """ # 调用drf框架原生的异常处理方法 response = drf_exception_handler(exc, context) if response is None: view = context['view'] if isinstance(exc, DatabaseError) or isinstance(exc, RedisError): # 数据库异常 logger.error('[%s] %s' % (view, exc)) response = Response({'message': '服务器内部错误'}, status=status.HTTP_507_INSUFFICIENT_STORAGE) return response
10.2 配置DRF
注意EXCEPTION_HANDLER参数,是上面自定义异常路径。
# 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': 'GeneralTools.Exceptions.exception_handler', # 接口文档 # 'DEFAULT_SCHEMA_CLASS': 'rest_framework.schemas.AutoSchema', 'DEFAULT_SCHEMA_CLASS': 'rest_framework.schemas.coreapi.AutoSchema', }
10.3 DRF扩展配置
# DRF扩展 REST_FRAMEWORK_EXTENSIONS = { # 缓存时间,单位秒(24小时) 'DEFAULT_CACHE_RESPONSE_TIMEOUT': 24 * 60 * 60, # 缓存存储 'DEFAULT_USE_CACHE': 'default', }
11 用户模型配置
11.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
11.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 用户信息表'
11.3 指定Django系统认证所使用的模型
# 指定Django认证系统所使用的模型类 AUTH_USER_MODEL = 'Organization.UserInfo'
11.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
11.5 运行程序,看到欢迎页面,表示到目前为止,工程正常!
12 跨域CORS白名单设置
# 跨域CORS白名单 CORS_ORIGIN_WHITELIST = ( 'http://127.0.0.1:80', 'http://127.0.0.1:8000', ) CORS_ALLOW_CREDENTIALS = True # 允许携带cookie
13 JWT用户认证配置
13.1 自定义返回函数
在Organization APP的views目录下,创建一个文件名为JwtHandler.py的文件,用于JWT认证返回Token,内容如下:
import logging # 获取在配置文件中定义的logger,用来记录日志 # 注:其中的tongheng2必须和配置文件中指定的配置路径一致。 logger = logging.getLogger('tongheng2') def jwt_response_payload_handler(token, user=None, request=None): """ 自定义jwt登录视图响应数据 """ return { 'id': user.id, 'name': user.name, 'photo_url': user.photo_url, 'mobile': user.mobile, 'openid': user.openid, 'token': token }
13.2 认证配置
由于要设置有效时间,故需要在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.Organizations.views.JwtHandler.jwt_response_payload_handler' }
14 设置搜集静态文件的路径
在服务器上用nginx配置时,需要指定搜索静态文件的路径。增加以下配置:
STATIC_ROOT = '/publish/static'
15 设置对外文件路径
微信要求在要访问的网页根目录,提供一个验证文件,只有读到了这个验证文件,微信才不会提出安全提示。所以,需要设置一个路径,可以通过IP读取到这个文件。当然,这个文件是微信提供的,我们现在只做一个测试文件,把路径走通。
15.1 在Applications目录下创建一个名为11.txt的文件并输入一些内容。
15.2 在settings.py文件中,增加一项设置
DOCUMENT_ROOT = os.path.join(BASE_DIR, 'Applications')
15.3 在工程主路由下增加一个路由:
from django.contrib import admin from django.urls import path, include, re_path from rest_framework.documentation import include_docs_urls from django.views.static import serve from TongHeng2 import settings DESCRIPTION = """ 包括仝恒绩效云所有接口文档。包括以下应用: 1 GeneralTools:常用工具APP 2 Organizations: 组织机构(包含组织下的人员)APP 3 Examples:示例APP,用于新知识的测试案例 """ urlpatterns = [ path('admin/', admin.site.urls), path('Examples/', include('Applications.Examples.urls')), path('docs/', include_docs_urls(title='API接口文档', description=DESCRIPTION)), re_path(r'(?P<path>.*)$', serve, {'document_root': settings.DOCUMENT_ROOT}), ]
15.4 在浏览器中访问IP+文件名,看到文件内容,表示配置成功。
16 运行工程,看到欢迎页面,表示配置成功!
0004 工程配置settings.py的更多相关文章
- 【5】Django项目配置settings.py详解
夫唯不争,故天下莫能与之争 --老子<道德经> 本节内容 1.项目配置文件settings.py介绍 2.数据库配置[MySQL] 3.创建模型对象并和数据库同步 4.python官方提供 ...
- Django安全配置(settings.py)详解
必须配置项 PASSWORD_HASHER 这个配置是在使用Django自带的密码加密函数的时候会使用的加密算法的列表.默认如下: PASSWORD_HASHERS = ( 'django.contr ...
- django项目settings.py的基础配置
一个新的django项目初始需要配置settings.py文件: 1. 项目路径配置 新建一个apps文件夹,把所有的项目都放在apps文件夹下,比如apps下有一个message项目,如果不进行此项 ...
- 分布式爬虫scrapy-redis中settings.py中的配置信息
SCHEDULER = "scrapy_redis.scheduler.Scheduler" # 使用scrapy-redis的调度器 ITEM_PIPELINES = { 'sc ...
- 调用settings.py的配置信息作为全局使用
项目中一些比较零散的信息可以保存在数据库,也可以保存在settings.py里面 并且这些变量也可以像引用数据里面的数据使用, 可以把信息保存在settings.py里面,也可以保存在数据 ...
- scrapy实现数据持久化、数据库连接、图片文件下载及settings.py配置
数据持久化的两种方式:(1)基于终端指令的持久化存储:(2)基于管道的持久化存储 基于终端指令的持久化存储 在爬虫文件的parse方法中必须要return可迭代对象类型(通常为列表或字典等)的返回值, ...
- settings.py 配置汇总
数据库配置: DATABASES = { 'default': { 'ENGINE': 'django.db.backends.mysql', # 数据库引擎 'NAME': ' ', #数据库名称 ...
- Django 1.6 最佳实践: 如何设置django项目的设置(settings.py)和部署文件(requirements.txt)
Django 1.6 最佳实践: 如何设置django项目的设置(settings.py)和部署文件(requirements.txt) 作者: Desmond Chen,发布日期: 2014-05- ...
- 细聊 Cocoapods 与 Xcode 工程配置
前言 文章比较长,所以在文章的开头我打算简单介绍一下这篇文章将要讲述的内容,读者可以选择通篇细度,也可以直接找到自己感兴趣的部分. 既然是谈 Cocoapods,那首先要搞明白它出现的背景.有经验的开 ...
随机推荐
- JS用map做接口数据映射
· 接口做数据映射的好处:前端页面自定义的字段不需要和后端字段相同,后端修改字段前端不受影响. · 从接口得到数据 res: let r = res.map(item => { return { ...
- 关于responseType的值
http请求有个responseType, 用来设置返回值,默认是'',等同于text,数据格式的转换是浏览器处理的 我们还会用到json,buffer,blob json:是我们经常遇到后端返回的数 ...
- 浅谈 k8s ingress controller 选型
大家好,先简单自我介绍下,我叫厉辉,来自腾讯云.业余时间比较喜欢开源,现在是Apache APISIX PPMC.今天我来简单给大家介绍下 K8S Ingress 控制器的选型经验,今天我讲的这些内容 ...
- 【5min+】后台任务的积木。.NetCore中的IHostedService
系列介绍 [五分钟的dotnet]是一个利用您的碎片化时间来学习和丰富.net知识的博文系列.它所包含了.net体系中可能会涉及到的方方面面,比如C#的小细节,AspnetCore,微服务中的.net ...
- 基于JavaSwing开发银行信用卡管理系统
开发环境: Windows操作系统开发工具: MyEclipse10/Eclipse+Jdk+Mysql数据库 运行效果图 源码及原文链接:https://javadao.xyz/forum.php? ...
- Prime_Series_Level-1
0x01 先收集靶机端口,目录信息 1)nmap扫描端口 开启了ssh服务和apache服务,搜索相关漏洞 只有一个ssh用户名枚举,先放着 2)dirb爆破目录 dirb http://192.16 ...
- go 算法与数据结构
数据结构 稀疏数组 package main import "fmt" /* 稀疏数组 案例:五子棋存盘与复盘 节省存储空间 */ type ValNode struct { ro ...
- 牛客网剑指offer第19题——顺时针打印矩阵
这个题看似很简单: 题目: 输入一个矩阵,按照从外向里以顺时针的顺序依次打印出每一个数字,例如,如果输入如下4 X 4矩阵: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 1 ...
- HDOJ1384 Intervals 题解
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1384 大意:有 \(n\) 个区间 \([a_i,b_i]\),每个区间有个权值 \(c_i\),找到 ...
- Mac brew update 慢~~~
正题开始之前, 如果对 Homebrew 不太了解, 这里有一篇很好的介绍文章: macOS 包管理工具 Homebrew 不完全指南 花个几分钟读一下, 绝对超值! 正题 Homebrew 通过 G ...