Metadata-Version: 2.1
Name: qitian-module
Version: 1.4.2
Summary: 起田(苏州)营销策划有限公司Django项目公用底层框架.
Home-page: https://gitee.com/qtch/django_module
Author: Peter Han
Author-email: peter@qitian.com
License: MIT License
Keywords: framework qitian common module
Platform: UNKNOWN
Classifier: Development Status :: 5 - Production/Stable
Classifier: Environment :: Web Environment
Classifier: Framework :: Django
Classifier: Framework :: Django :: 1.11
Classifier: Framework :: Django :: 2.0
Classifier: Intended Audience :: Developers
Classifier: License :: OSI Approved :: MIT License
Classifier: Operating System :: OS Independent
Classifier: Programming Language :: Python
Classifier: Programming Language :: Python :: 3.5
Classifier: Programming Language :: Python :: 3.6
Classifier: Programming Language :: Python :: Implementation :: CPython
Classifier: Programming Language :: Python :: Implementation :: PyPy
Classifier: Topic :: Utilities
Requires-Python: >=3.6, !=3.0.*
Description-Content-Type: text/markdown
Requires-Dist: beautifulsoup4 (==4.6.0)
Requires-Dist: django-environ (==0.4.5)
Requires-Dist: django-redis (==4.9.0)
Requires-Dist: django-smart-selects (==1.5.3)
Requires-Dist: django-uuslug (==1.1.8)
Requires-Dist: shortuuid (==0.5.0)
Requires-Dist: qiniu (==7.2.2)
Requires-Dist: textrank4zh (==0.3)
Requires-Dist: yunpian-python-sdk (==1.0.0)
Requires-Dist: pycryptodomex (==3.6.6)
Requires-Dist: python-crontab (==2.3.5)
Requires-Dist: mammoth

# 起田（苏州）营销策划有限公司DJANGO项目共用模块系统

### 配置文件settings
    此项目包含基础项目配置，一般项目可以直接复制settings配置为基础配置。此配置会根据新加入的模块来修改，已有项目不要直接拷贝。

### 项目依赖文件
    此项目的依赖文件要采用手动添加的方法，避免使用freeze方式。目的是为了让依赖项目简洁易读。

### 管理界面
    管理界面使用grappelli,管理首页使用grappelli-dashboard

### celery配置与执行
    项目部署完成后，运行celery任务：`celery -A django_module beat -l info -S django`
    这个只是运行定时任务，还要启动worder来执行这个任务. `celery -A django_module worker -l info`
在项目文件夹下建立`celery.py`, 内容如下
```
from __future__ import absolute_import, unicode_literals
from celery import Celery
import os

os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'django_module.settings')

app = Celery('django_module')
# 第一个参数是实例的名称,  也可以使用模块的名字.
# broker参数是消息代理人url.
# 还有一个backend参数，当我们需要拿到异步任务的返回时需要用到.
# 这里就直接略过了.
app.config_from_object('django.conf:settings', namespace='CELERY')
app.autodiscover_tasks()
```
在项目的`__init__.py`文件中,添加或修复内容如下:
```
from __future__ import absolute_import, unicode_literals
from .celery import app as celery_app

__all__ = ('celery_app',)
```

### 项目配置信息
APP列表
```
INSTALLED_APPS = [
    'grappelli.dashboard',
    'grappelli',
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
    'django.contrib.sites',
    'django_celery_beat',
    'django_celery_results',
    'smart_selects',
    'easy_thumbnails',
    'system',
    'ueditor',
    'autopost',
    'usercenter',
]
```
在middleware中添加`'system.middleware.site.CurrentSiteMiddleware',`
template.options添加 `'system.context_processors.site_info',`

静态文件等配置
```
LANGUAGE_CODE = 'zh-hans'

TIME_ZONE = 'Asia/Shanghai'

USE_I18N = True

USE_L10N = True

USE_TZ = True

LANGUAGES = (
    ('en', ('English',)),
    ('zh-hans', ('中文简体',)),
)

# 翻译文件所在目录，需要手工创建
LOCALE_PATHS = (
    os.path.join(BASE_DIR, 'locale'),
)
# Static files (CSS, JavaScript, Images)
# https://docs.djangoproject.com/en/2.1/howto/static-files/

STATIC_URL = '/static/'

STATICFILES_DIRS = [
    os.path.join(BASE_DIR, "static"),
    'static/',
]

STATIC_ROOT = 'pub_static/'
STATICFILES_FINDERS = (
    "django.contrib.staticfiles.finders.FileSystemFinder",
    "django.contrib.staticfiles.finders.AppDirectoriesFinder"
)
# 静态文件版本，发布后，有js,css文件变动需更换
STATIC_VERSION = 0.1
# 项目支付设置
AES_KEY = env.str('AES_KEY')
PAY_PROJECT_ID = env.int('PAY_PROJECT_ID')
PAY_URL = 'https://pay.qitian.biz/pay/index/%d/' % PAY_PROJECT_ID
# SMS模板, 不同项目需要修改
SMS_TEMPLATE = {
    'register': '【娱乐信息网】亲爱的{name}贵宾，您的验证码是{code}。有效期为{time}分钟，请尽快验证',
    'notice': '【娱乐信息网】主人，客户：{name}已支付订单:{order}，请您及时处理！',
    'reg_tel_admin': '【娱乐信息网】有手机号：{tel} 用户于{time}注册了{site}, 请尽快联系。',
}
SMS_TIMES = 3

# 设置用户属性
AUTH_PROFILE_MODULE = 'usercenter.QtUser'

# 接口定义
REST_FRAMEWORK = {
    'DEFAULT_PAGINATION_CLASS': 'rest_framework.pagination.LimitOffsetPagination',
    'PAGE_SIZE': 20,
    'page_query_param': 'page',
}

SHOW_TJ = env.bool('SHOW_TJ')

SITE_NAME = env.str('SITE_NAME')

GRAPPELLI_INDEX_DASHBOARD = 'dashboard.CustomIndexDashboard'
```
缓存与log设置
```
# 设置缓存
CACHES = {
    "default": {
        "BACKEND": "django_redis.cache.RedisCache",
        "LOCATION": "redis://127.0.0.1:6379/1",
        "OPTIONS": {
            "CLIENT_CLASS": "django_redis.client.DefaultClient",
            # "PASSWORD": "mysecret"
        }
    }
}

LOGGING = {
    'version': 1,
    'disable_existing_loggers': False,
    'formatters': {
        'verbose': {
            'format': ('%(asctime)s [%(process)d] [%(levelname)s] ' +
                       'pathname=%(pathname)s lineno=%(lineno)s ' +
                       'funcname=%(funcName)s %(message)s'),
            'datefmt': '%Y-%m-%d %H:%M:%S',
        },
        'simple': {
            'format': '%(asctime)s [%(levelname)s] %(message)s',
            'datefmt': '%Y-%m-%d %H:%M:%S',
        },
    },
    'handlers': {
        'console': {
            'level': 'DEBUG',
            'class': 'logging.StreamHandler',
            'formatter': 'simple',
        },
        'console-verbose': {
            'level': 'DEBUG',
            'class': 'logging.StreamHandler',
            'formatter': 'verbose',
        },
        'log_file': {
            'level': 'DEBUG',
            'class': 'logging.handlers.RotatingFileHandler',
            'filename': os.path.join(BASE_DIR, 'django.log'),
            'maxBytes': 33554432,
            'formatter': 'verbose',
        },
        'celery': {
            # 'level': 'INFO',
            # 'class': 'logging.handlers.RotatingFileHandler',
            'level': 'DEBUG',
            'formatter': 'simple',
            'class': 'logging.handlers.TimedRotatingFileHandler',
            'filename': 'celery.log',
            'when': 'midnight'
        },

    },
    'loggers': {
        'django': {
            'handlers': ['console', 'log_file'],
            'propagate': True,
            'level': 'INFO',
        },
        'qt_celery': {
            'handlers': ['celery'],
            'level': 'INFO',
            'propagate': True,
        },
    },
}
```
CELERY设置
```
# celery 设置
CELERY_BROKER_URL = 'redis://127.0.0.1:6379/2'
CELERY_TIMEZONE = 'Asia/Shanghai'
CELERY_ENABLE_UTC = True
CELERY_ACCEPT_CONTENT = ['json']
CELERY_RESULT_BACKEND = 'django-db'
CELERY_TASK_SERIALIZER = 'json'
```
#七牛配置
```
# 七牛配置
QINIU_ACCESS_KEY = 'r35LYq6an6L0FUAmDUhqDNXICbtZ5JI1vKWXBGKv'
QINIU_SECRET_KEY = '8GkmiCK4_RjGWLKcJtjIl_8RH9QdnvSI_ulo7Apu'
QINIU_URL = 'https://media.qitian.biz/'
QINIU_BUCKET = 'qitian'
QINIU_FOLDER = 'autopost'
```

### 更新步骤
`autopost`模块需要删除: `article` `category` `author`
一定要先添加作者

