两个目录的区别:

  工程目录是指包含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的更多相关文章

  1. 【5】Django项目配置settings.py详解

    夫唯不争,故天下莫能与之争 --老子<道德经> 本节内容 1.项目配置文件settings.py介绍 2.数据库配置[MySQL] 3.创建模型对象并和数据库同步 4.python官方提供 ...

  2. Django安全配置(settings.py)详解

    必须配置项 PASSWORD_HASHER 这个配置是在使用Django自带的密码加密函数的时候会使用的加密算法的列表.默认如下: PASSWORD_HASHERS = ( 'django.contr ...

  3. django项目settings.py的基础配置

    一个新的django项目初始需要配置settings.py文件: 1. 项目路径配置 新建一个apps文件夹,把所有的项目都放在apps文件夹下,比如apps下有一个message项目,如果不进行此项 ...

  4. 分布式爬虫scrapy-redis中settings.py中的配置信息

    SCHEDULER = "scrapy_redis.scheduler.Scheduler" # 使用scrapy-redis的调度器 ITEM_PIPELINES = { 'sc ...

  5. 调用settings.py的配置信息作为全局使用

    项目中一些比较零散的信息可以保存在数据库,也可以保存在settings.py里面   并且这些变量也可以像引用数据里面的数据使用,     可以把信息保存在settings.py里面,也可以保存在数据 ...

  6. scrapy实现数据持久化、数据库连接、图片文件下载及settings.py配置

    数据持久化的两种方式:(1)基于终端指令的持久化存储:(2)基于管道的持久化存储 基于终端指令的持久化存储 在爬虫文件的parse方法中必须要return可迭代对象类型(通常为列表或字典等)的返回值, ...

  7. settings.py 配置汇总

    数据库配置: DATABASES = { 'default': { 'ENGINE': 'django.db.backends.mysql', # 数据库引擎 'NAME': ' ', #数据库名称 ...

  8. Django 1.6 最佳实践: 如何设置django项目的设置(settings.py)和部署文件(requirements.txt)

    Django 1.6 最佳实践: 如何设置django项目的设置(settings.py)和部署文件(requirements.txt) 作者: Desmond Chen,发布日期: 2014-05- ...

  9. 细聊 Cocoapods 与 Xcode 工程配置

    前言 文章比较长,所以在文章的开头我打算简单介绍一下这篇文章将要讲述的内容,读者可以选择通篇细度,也可以直接找到自己感兴趣的部分. 既然是谈 Cocoapods,那首先要搞明白它出现的背景.有经验的开 ...

随机推荐

  1. java 入门如何设计类

    2019/12/24   |    在校大二上学期    |    太原科技大学 初学java后,我们会发现java难点不在于Java语法难学,而是把我们挂在了如何设计类的“吊绳”上了.这恰恰也是小白 ...

  2. JavaScript 基础学习(二)js 和 html 的结合方式

    第一种 使用一个标签 <script type="text/javascript"> js代码; </script> 第二种 使用 script 标签,引入 ...

  3. 【idea激活码】,【WebStorm激活码】,【DataGrip激活码】,【IntelliJ 全家桶系列】,【定期更新】,【第一期】

    IntelliJ IDEA.PyCharm.PhpStorm.WebStorm.RubyMide.AppCode.CLion.GoLand.DataGrip.Rider.Android Studio可 ...

  4. MySQL 8 InnoDB Table 和 Page 压缩

    压缩用一点CPU换取磁盘IO.内存空间.磁盘空间. 在有Secondary Indexes 的表中,使用压缩更加明显,相关索引数据也会压缩. InnoDB 表压缩 对表压缩只需要在Create Tab ...

  5. 3.Python运算符详解

    1.算数运算符 符号:+   -   *   /   %(取余.取模)   //(取整)   **(开方) 2.比较运算符 符号:>   >=   <   <=   ==(全等 ...

  6. 得心应用的Vue高级技巧---vue中文社区

    1,require.context()一个webpack的api,通过执行require.context函数获取一个特定的上下文,主要用来实现自动化导入模块,在前端工程中,如果遇到从一个文件夹引入很多 ...

  7. 【01】HTML_day01_02-认识HTML

    typora-copy-images-to: media 第01阶段.前端基础.认识HTML 学习目标 理解 HTML的概念 HTML标签的分类 HTML标签的关系 HTML标签的语义化 应用 HTM ...

  8. 《手把手教你构建自己的 Linux 系统》学习笔记(1)

    第二章.基础准备--Linux 系统定制原理 Linux 系统的组成及架构 共享库和静态库 在 Linux 系统中,函数库包含两种形式:共享库和静态库. 共享库 共享库在程序运行时,为其提供所需要的函 ...

  9. C# WPF聊天界面(3/3)

    微信公众号:Dotnet9,网站:Dotnet9,问题或建议:请网站留言, 如果对您有所帮助:欢迎赞赏. C# WPF聊天界面(3/3) 阅读导航 本文背景 代码实现 本文参考 1.本文背景 系列文章 ...

  10. c#中for与foreach的使用

    for循环示例: static void Main(string[] args) { string[] s = new string[] { "a,b,c,d,e,f,g" }; ...