目录结构:
. ├── db.sqlite3 ├── logs │ └── luffy.log ├── luffyapi │ ├── apps │ │ ├── course │ │ │ ├── admin.py │ │ │ ├── adminx.py │ │ │ ├── apps.py │ │ │ ├── __init__.py │ │ │ ├── migrations │ │ │ │ ├── 0001_initial.py │ │ │ │ ├── __init__.py │ │ │ │ └── __pycache__ │ │ │ │ ├── 0001_initial.cpython-36.pyc │ │ │ │ └── __init__.cpython-36.pyc │ │ │ ├── models.py │ │ │ ├── __pycache__ │ │ │ │ ├── admin.cpython-36.pyc │ │ │ │ ├── adminx.cpython-36.pyc │ │ │ │ ├── apps.cpython-36.pyc │ │ │ │ ├── __init__.cpython-36.pyc │ │ │ │ ├── models.cpython-36.pyc │ │ │ │ ├── serializers.cpython-36.pyc │ │ │ │ ├── urls.cpython-36.pyc │ │ │ │ └── views.cpython-36.pyc │ │ │ ├── serializers.py │ │ │ ├── tests.py │ │ │ ├── urls.py │ │ │ └── views.py │ │ ├── home │ │ │ ├── admin.py │ │ │ ├── adminx.py │ │ │ ├── apps.py │ │ │ ├── __init__.py │ │ │ ├── migrations │ │ │ │ ├── 0001_initial.py │ │ │ │ ├── __init__.py │ │ │ │ └── __pycache__ │ │ │ │ ├── 0001_initial.cpython-36.pyc │ │ │ │ └── __init__.cpython-36.pyc │ │ │ ├── models.py │ │ │ ├── __pycache__ │ │ │ │ ├── admin.cpython-36.pyc │ │ │ │ ├── adminx.cpython-36.pyc │ │ │ │ ├── apps.cpython-36.pyc │ │ │ │ ├── __init__.cpython-36.pyc │ │ │ │ ├── models.cpython-36.pyc │ │ │ │ ├── serializers.cpython-36.pyc │ │ │ │ ├── urls.cpython-36.pyc │ │ │ │ └── views.cpython-36.pyc │ │ │ ├── serializers.py │ │ │ ├── tests.py │ │ │ ├── urls.py │ │ │ └── views.py │ │ ├── __init__.py │ │ └── users │ │ ├── admin.py │ │ ├── apps.py │ │ ├── __init__.py │ │ ├── migrations │ │ │ ├── 0001_initial.py │ │ │ ├── 0002_auto_20190918_1027.py │ │ │ ├── __init__.py │ │ │ └── __pycache__ │ │ │ ├── 0001_initial.cpython-36.pyc │ │ │ ├── 0002_auto_20190918_1027.cpython-36.pyc │ │ │ └── __init__.cpython-36.pyc │ │ ├── models.py │ │ ├── __pycache__ │ │ │ ├── admin.cpython-36.pyc │ │ │ ├── __init__.cpython-36.pyc │ │ │ ├── models.cpython-36.pyc │ │ │ ├── serializers.cpython-36.pyc │ │ │ ├── urls.cpython-36.pyc │ │ │ ├── utils.cpython-36.pyc │ │ │ └── views.cpython-36.pyc │ │ ├── serializers.py │ │ ├── tests.py │ │ ├── urls.py │ │ ├── utils.py │ │ └── views.py │ ├── db.sqlite3 │ ├── __init__.py │ ├── libs │ │ ├── geetest.py │ │ ├── __init__.py │ │ ├── __pycache__ │ │ │ ├── geetest.cpython-36.pyc │ │ │ └── __init__.cpython-36.pyc │ │ └── yuntongxun │ │ ├── CCPRestSDK.py │ │ ├── __init__.py │ │ ├── __pycache__ │ │ │ ├── CCPRestSDK.cpython-36.pyc │ │ │ ├── __init__.cpython-36.pyc │ │ │ ├── sms.cpython-36.pyc │ │ │ └── xmltojson.cpython-36.pyc │ │ ├── sms.py │ │ └── xmltojson.py │ ├── __pycache__ │ │ ├── __init__.cpython-36.pyc │ │ ├── urls.cpython-36.pyc │ │ └── wsgi.cpython-36.pyc │ ├── settings │ │ ├── constant.py │ │ ├── dev.py │ │ ├── __init__.py │ │ ├── prod.py │ │ └── __pycache__ │ │ ├── constant.cpython-36.pyc │ │ ├── dev.cpython-36.pyc │ │ └── __init__.cpython-36.pyc │ ├── settings_before.py │ ├── uploads │ │ └── banner │ │ ├── banner1.png │ │ ├── banner2.png │ │ └── banner3.png │ ├── urls.py │ ├── utils │ │ ├── basemodels.py │ │ ├── exceptions.py │ │ ├── __init__.py │ │ └── __pycache__ │ │ ├── basemodels.cpython-36.pyc │ │ ├── exceptions.cpython-36.pyc │ │ └── __init__.cpython-36.pyc │ └── wsgi.py ├── manage.py ├── mycelery │ ├── config.py │ ├── __init__.py │ ├── main.py │ ├── __pycache__ │ │ ├── config.cpython-36.pyc │ │ ├── __init__.cpython-36.pyc │ │ └── main.cpython-36.pyc │ └── sms │ ├── __init__.py │ ├── __pycache__ │ │ ├── __init__.cpython-36.pyc │ │ └── tasks.cpython-36.pyc │ └── tasks.py └── scripts └── __init__.py
settings/dev.py是配置文件
配置文件代码
""" Django settings for luffyapi project. Generated by ‘django-admin startproject‘ using Django 2.2.5. For more information on this file, see https://docs.djangoproject.com/en/2.2/topics/settings/ For the full list of settings and their values, see https://docs.djangoproject.com/en/2.2/ref/settings/ """ import os import sys # Build paths inside the project like this: os.path.join(BASE_DIR, ...) BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__))) # 将apps文件夹添加到系统识别的路径中 sys.path.insert(0,os.path.join(BASE_DIR,"apps")) # Quick-start development settings - unsuitable for production # See https://docs.djangoproject.com/en/2.2/howto/deployment/checklist/ # SECURITY WARNING: keep the secret key used in production secret! SECRET_KEY = ‘6pmbe)o5)1&^66z2_21itq)l_s5+ch^=gm6psqf&[email protected]^@y‘ # SECURITY WARNING: don‘t run with debug turned on in production! DEBUG = True # 访问api的url ALLOWED_HOSTS = [ "api.luffycity.cn", ] # Application definition INSTALLED_APPS = [ ‘django.contrib.admin‘, ‘django.contrib.auth‘, ‘django.contrib.contenttypes‘, ‘django.contrib.sessions‘, ‘django.contrib.messages‘, ‘django.contrib.staticfiles‘, # 第三方app ‘corsheaders‘, ‘rest_framework‘, ‘xadmin‘, ‘crispy_forms‘, ‘reversion‘, # 自定义app ‘home‘, ‘users‘, ‘course‘, ] # CORS组的配置信息,允许跨域访问白名单 CORS_ORIGIN_WHITELIST = ( ‘http://www.luffycity.cn:8080‘, ) CORS_ALLOW_CREDENTIALS = False # 允许ajax跨域请求时携带cookie MIDDLEWARE = [ # 解决ajax跨域访问中间件 ‘corsheaders.middleware.CorsMiddleware‘, ‘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‘, ] ROOT_URLCONF = ‘luffyapi.urls‘ TEMPLATES = [ { ‘BACKEND‘: ‘django.template.backends.django.DjangoTemplates‘, ‘DIRS‘: [], ‘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‘, ], }, }, ] WSGI_APPLICATION = ‘luffyapi.wsgi.application‘ # Database # https://docs.djangoproject.com/en/2.2/ref/settings/#databases # MySQL数据库连接配置 DATABASES = { ‘default‘: { ‘ENGINE‘: ‘django.db.backends.mysql‘, ‘NAME‘: "luffy", ‘HOST‘: ‘127.0.0.1‘, ‘PORT‘: 3306, ‘USER‘: ‘luffy_user‘, ‘PASSWORD‘: ‘luffy‘, } } # 配置redis数据库链接 CACHES = { # 默认缓存 "default": { # 数据缓存数据的类名 "BACKEND": "django_redis.cache.RedisCache", # 项目上线时,需要调整这里的路径 "LOCATION": "redis://127.0.0.1:6379/0", # 其他配置项 "OPTIONS": { "CLIENT_CLASS": "django_redis.client.DefaultClient", } }, # 提供给xadmin或者admin的session存储 "session": { # 数据缓存数据的类名 "BACKEND": "django_redis.cache.RedisCache", # 项目上线时,需要调整这里的路径 "LOCATION": "redis://127.0.0.1:6379/1", # 其他配置项 "OPTIONS": { "CLIENT_CLASS": "django_redis.client.DefaultClient", } }, # 提供存储短信验证码 "sms_code": { # 数据缓存数据的类名 "BACKEND": "django_redis.cache.RedisCache", # 项目上线时,需要调整这里的路径 "LOCATION": "redis://127.0.0.1:6379/1", # 其他配置项 "OPTIONS": { "CLIENT_CLASS": "django_redis.client.DefaultClient", } }, } # 设置xadmin用户登录时,登录信息session保存到redis SESSION_ENGINE = "django.contrib.sessions.backends.cache" SESSION_CACHE_ALIAS = "session" # Password validation # https://docs.djangoproject.com/en/2.2/ref/settings/#auth-password-validators AUTH_PASSWORD_VALIDATORS = [ { ‘NAME‘: ‘django.contrib.auth.password_validation.UserAttributeSimilarityValidator‘, }, { ‘NAME‘: ‘django.contrib.auth.password_validation.MinimumLengthValidator‘, }, { ‘NAME‘: ‘django.contrib.auth.password_validation.CommonPasswordValidator‘, }, { ‘NAME‘: ‘django.contrib.auth.password_validation.NumericPasswordValidator‘, }, ] # Internationalization # https://docs.djangoproject.com/en/2.2/topics/i18n/ LANGUAGE_CODE = ‘zh-Hans‘ TIME_ZONE = ‘Asia/Shanghai‘ USE_I18N = True USE_L10N = True USE_TZ = True # Static files (CSS, JavaScript, Images) # https://docs.djangoproject.com/en/2.2/howto/static-files/ #访问静态文件的url前缀 STATIC_URL = ‘/static/‘ #设置django的静态文件目录 STATICFILES_DIRS=[ os.path.join(BASE_DIR,"static") ] #上传文件目录 MEDIA_ROOT = os.path.join(BASE_DIR,"uploads") # 上传文件url地址前缀 MEDIA_URL = ‘/media/‘ # 日志文件配置 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(os.path.dirname(BASE_DIR), "logs/luffy.log"), # 日志文件的最大值,这里我们设置300M ‘maxBytes‘: 300 * 1024 * 1024, # 日志文件的数量,设置最大日志数量为10 ‘backupCount‘: 10, # 日志格式:详细格式 ‘formatter‘: ‘verbose‘ }, }, ‘loggers‘: { ‘django‘: { ‘handlers‘: [‘console‘,‘file‘], ‘propagate‘: True, }, } } REST_FRAMEWORK ={ # 修改错误类判断方法,可以识别数据库错误 ‘EXCEPTION_HANDLER‘:‘luffyapi.utils.exceptions.custom_exception_handler‘, # jwt验证配置 ‘DEFAULT_AUTHENTICATION_CLASSES‘: ( ‘rest_framework_jwt.authentication.JSONWebTokenAuthentication‘, ‘rest_framework.authentication.SessionAuthentication‘, ‘rest_framework.authentication.BasicAuthentication‘, ), } # 使用自定义用户模型类 AUTH_USER_MODEL = ‘users.User‘ import datetime JWT_AUTH = { # jwt验证保存时间 "JWT_EXPIRATION_DELTA":datetime.timedelta(days=1), # 自定义jwt验证返回之 ‘JWT_RESPONSE_PAYLOAD_HANDLER‘: ‘users.utils.jwt_response_payload_handler‘, } # 自定义登录方式 AUTHENTICATION_BACKENDS = [ "users.utils.UsernameMobileAuthBackend" ] # 短信接口配置,可登陆官网查看 SMS = { # 开发者账号 "_accountSid":"8aaf07086d05d00c016d1f327e740e2a", # token验证码 "_accountToken":"2196b6f36f6d4bdc8b5e6bd791c57dbd", # appid "_appId":"8aaf07086d05d00c016d1f327ed10e31", # id地址 "_serverIP":"sandboxapp.cloopen.com", # 端口号 "_serverPort":"8883", # API版本号 "_softVersion":"2013-12-26", } # 邮箱配置 EMAIL_BACKEND = ‘django.core.mail.backends.smtp.EmailBackend‘ #email后端 EMAIL_USE_TLS = False #是否使用TLS安全传输协议 EMAIL_USE_SSL = True #是否使用SSL加密,qq企业邮箱要求使用 EMAIL_HOST = ‘smtp.163.com‘ #发送邮件的邮箱 的 SMTP服务器,这里用了qq企业邮箱 EMAIL_PORT = 465 #发件箱的SMTP服务器端口 EMAIL_HOST_USER = ‘[email protected]‘ #发送邮件的邮箱地址 EMAIL_HOST_PASSWORD = ‘ads2504141441sbs‘ #发送邮件的邮箱密码 DEFAULT_FROM_EMAIL = EMAIL_HOST_USER