暂无描述

settings.py 12KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387
  1. # -*- coding: utf-8 -*-
  2. """
  3. Django settings for pai2 project.
  4. Generated by 'django-admin startproject' using Django 1.8.4.
  5. For more information on this file, see
  6. https://docs.djangoproject.com/en/1.8/topics/settings/
  7. For the full list of settings and their values, see
  8. https://docs.djangoproject.com/en/1.8/ref/settings/
  9. """
  10. # Build paths inside the project like this: os.path.join(BASE_DIR, ...)
  11. import os
  12. BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
  13. PROJ_DIR = os.path.abspath(os.path.dirname(os.path.abspath(__file__)))
  14. # Quick-start development settings - unsuitable for production
  15. # See https://docs.djangoproject.com/en/1.8/howto/deployment/checklist/
  16. # SECURITY WARNING: keep the secret key used in production secret!
  17. SECRET_KEY = 'aam6@6bh17d87bn-ax1@mcdrtbfm02y)_twd&!ewrr2^4581!c'
  18. # SECURITY WARNING: don't run with debug turned on in production!
  19. DEBUG = True
  20. ALLOWED_HOSTS = []
  21. # Application definition
  22. INSTALLED_APPS = (
  23. 'django.contrib.admin',
  24. 'django.contrib.auth',
  25. 'django.contrib.contenttypes',
  26. 'django.contrib.sessions',
  27. 'django.contrib.messages',
  28. 'django.contrib.staticfiles',
  29. 'rest_framework',
  30. 'django_rlog',
  31. 'django_q',
  32. 'api',
  33. 'account',
  34. 'geo',
  35. 'group',
  36. 'message',
  37. 'miniapp',
  38. 'operation',
  39. 'page',
  40. 'pay',
  41. 'photo',
  42. 'website',
  43. )
  44. INSTALLED_APPS += ('multidomain', )
  45. MIDDLEWARE_CLASSES = (
  46. 'django.contrib.sessions.middleware.SessionMiddleware',
  47. 'django.middleware.common.CommonMiddleware',
  48. # 'django.middleware.csrf.CsrfViewMiddleware',
  49. 'django.contrib.auth.middleware.AuthenticationMiddleware',
  50. 'django.contrib.auth.middleware.SessionAuthenticationMiddleware',
  51. 'django.contrib.messages.middleware.MessageMiddleware',
  52. 'django.middleware.clickjacking.XFrameOptionsMiddleware',
  53. 'django.middleware.security.SecurityMiddleware',
  54. 'detect.middleware.UserAgentDetectionMiddleware',
  55. )
  56. MIDDLEWARE_CLASSES += ('multidomain.middleware.DomainMiddleware', )
  57. URL_CONFIG = (
  58. # (r'^(.+\.)?xfoto\.com\.cn', 'pai2.urls_www'),
  59. (r'^(.+\.)?api\.pai\.ai', 'pai2.urls_api'),
  60. )
  61. ROOT_URLCONF = 'pai2.urls'
  62. TEMPLATES = [
  63. {
  64. 'BACKEND': 'django.template.backends.django.DjangoTemplates',
  65. 'DIRS': [os.path.join(BASE_DIR, 'templates')],
  66. # 'APP_DIRS': True,
  67. 'OPTIONS': {
  68. 'context_processors': [
  69. 'django.template.context_processors.debug',
  70. 'django.template.context_processors.request',
  71. 'django.contrib.auth.context_processors.auth',
  72. 'django.contrib.messages.context_processors.messages',
  73. ],
  74. 'loaders': [
  75. ('django.template.loaders.cached.Loader', [
  76. 'django.template.loaders.filesystem.Loader',
  77. 'django.template.loaders.app_directories.Loader',
  78. ]),
  79. ],
  80. },
  81. },
  82. ]
  83. WSGI_APPLICATION = 'pai2.wsgi.application'
  84. # Database
  85. # https://docs.djangoproject.com/en/1.8/ref/settings/#databases
  86. DATABASES = {
  87. 'default': {
  88. 'ENGINE': 'django.db.backends.mysql',
  89. 'NAME': 'pai2',
  90. 'USER': 'root',
  91. 'PASSWORD': '',
  92. 'CONN_MAX_AGE': 600,
  93. 'OPTIONS': {
  94. # Utf8mb4 for Emoji
  95. # account.WechatInfo ==> nickname
  96. # ALTER TABLE account_wechatinfo MODIFY COLUMN nickname VARCHAR(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci;
  97. # account.UserInfo ==> nickname
  98. # ALTER TABLE account_userinfo MODIFY COLUMN nickname VARCHAR(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci;
  99. # group.GroupUserInfo ==> nickname
  100. # ALTER TABLE group_groupuserinfo MODIFY COLUMN nickname VARCHAR(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL;
  101. # group.GroupPhotoInfo ==> nickname
  102. # ALTER TABLE group_groupphotoinfo MODIFY COLUMN nickname VARCHAR(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL;
  103. # group.PhotoCommentInfo ==> nickname
  104. # ALTER TABLE group_photocommentinfo MODIFY COLUMN nickname VARCHAR(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL;
  105. # group.PhotoThumbUpInfo ==> nickname
  106. # ALTER TABLE group_photothumbupinfo MODIFY COLUMN nickname VARCHAR(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL;
  107. # group.UserMessageInfo ==> nickname
  108. # ALTER TABLE message_usermessageinfo MODIFY COLUMN from_nickname VARCHAR(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL;
  109. 'charset': 'utf8mb4',
  110. },
  111. }
  112. }
  113. SCHEMES = {
  114. 'django.db.backends.postgresql_psycopg2': 'postgres',
  115. 'django.db.backends.postgresql_psycopg2': 'postgresql',
  116. 'django.db.backends.postgresql_psycopg2': 'pgsql',
  117. 'django.contrib.gis.db.backends.postgis': 'postgis',
  118. 'django.db.backends.mysql': 'mysql',
  119. # 'django.db.backends.mysql': 'mysql2',
  120. 'django.contrib.gis.db.backends.mysql': 'mysqlgis',
  121. 'mysql.connector.django': 'mysql-connector',
  122. 'django.contrib.gis.db.backends.spatialite': 'spatialite',
  123. 'django.db.backends.sqlite3': 'sqlite',
  124. 'django.db.backends.oracle': 'oracle',
  125. 'django.contrib.gis.db.backends.oracle': 'oraclegis',
  126. }
  127. DATABASE_URL = {
  128. k: '{scheme}://{user}:{password}@{host}:{port}/{name}?charset={charset}'.format(
  129. scheme=SCHEMES[v.get('ENGINE', '')],
  130. user=v.get('USER', 'root'),
  131. password=v.get('PASSWORD', ''),
  132. host=v.get('HOST', 'localhost'),
  133. port=v.get('PORT', 6039),
  134. name=v.get('NAME', ''),
  135. charset=v.get('OPTIONS', {}).get('charset', 'utf8'),
  136. ) for k, v in DATABASES.iteritems()
  137. }
  138. # Internationalization
  139. # https://docs.djangoproject.com/en/1.8/topics/i18n/
  140. LANGUAGE_CODE = 'zh-Hans'
  141. TIME_ZONE = 'Asia/Shanghai'
  142. USE_I18N = True
  143. USE_L10N = True
  144. USE_TZ = True
  145. # Static files (CSS, JavaScript, Images)
  146. # https://docs.djangoproject.com/en/1.8/howto/static-files/
  147. STATICFILES_DIRS = (
  148. os.path.join(PROJ_DIR, 'static').replace('\\', '/'),
  149. )
  150. STATIC_ROOT = os.path.join(BASE_DIR, 'collect_static').replace('\\', '/')
  151. STATIC_URL = '/static/'
  152. STATICFILES_FINDERS = (
  153. 'django.contrib.staticfiles.finders.FileSystemFinder',
  154. 'django.contrib.staticfiles.finders.AppDirectoriesFinder',
  155. # 'django.contrib.staticfiles.finders.DefaultStorageFinder',
  156. )
  157. MEDIA_ROOT = os.path.join(BASE_DIR, 'media').replace('\\', '/')
  158. MEDIA_URL = '/media/'
  159. # REST_FRAMEWORK 设置
  160. # See http://www.django-rest-framework.org/#example
  161. REST_FRAMEWORK = {
  162. # Use Django's standard `django.contrib.auth` permissions,
  163. # or allow read-only access for unauthenticated users.
  164. # 'DEFAULT_PERMISSION_CLASSES': [
  165. # 'rest_framework.permissions.DjangoModelPermissionsOrAnonReadOnly',
  166. # ]
  167. 'DEFAULT_PERMISSION_CLASSES': ('rest_framework.permissions.DjangoModelPermissionsOrAnonReadOnly',),
  168. 'PAGE_SIZE': 1
  169. }
  170. # Redis 设置
  171. REDIS = {
  172. 'default': {
  173. 'HOST': '127.0.0.1',
  174. 'PORT': 6379,
  175. 'USER': '',
  176. 'PASSWORD': '',
  177. 'db': 0,
  178. }
  179. }
  180. # 微信设置
  181. WECHAT = {
  182. 'JSAPI': {
  183. 'token': '5201314',
  184. 'appID': '',
  185. 'appsecret': '',
  186. 'mchID': '',
  187. 'apiKey': '',
  188. 'mch_cert': '',
  189. 'mch_key': '',
  190. 'redpacket': {
  191. }
  192. },
  193. }
  194. WECHAT_BASE_REDIRECT_URI = 'https://api.pai.ai/base_redirect'
  195. WECHAT_USERINFO_REDIRECT_URI = 'https://api.pai.ai/userinfo_redirect'
  196. WECHAT_OAUTH2_RETRY_REDIRECT_URI = 'http://api.pai.ai/wx_oauth2?redirect_url={}'
  197. # 图片设置
  198. FILE_UPLOAD_MAX_MEMORY_SIZE = 5242880 # InMemoryUploadedFile 文件最大值
  199. FILE_UPLOAD_PERMISSIONS = 0o644 # TemporaryUploadedFile 文件权限设置
  200. # 唯一标识设置
  201. CURTAIL_UUID_LENGTH = 7
  202. # 水印设置
  203. WATERMARK_LOGO = os.path.join(PROJ_DIR, 'static/pai2/img/paiai_96_96.png').replace('\\', '/')
  204. # 原图设置
  205. LENSMAN_PHOTO_ORIGIN_EXPIRED_MSEL = 604800000 # 摄影师原图过期毫秒数,7d = 7 * 24 * 3600 * 1000msel
  206. # 缩略图设置
  207. THUMBNAIL_MAX_WIDTH = 540
  208. THUMBNAIL_MAX_WIDTH2 = 1080
  209. # 首页设置
  210. PAI2_HOME_PER_PAGE = 20 # 首页照片每页数量
  211. PAI2_HOME_MAX_PAGE = 20 # 首页照片最大页数
  212. PAI2_HOME_MAX_ROWS = 400 # 首页照片最大数量,PAI2_HOME_PER_PAGE * PAI2_HOME_MAX_PAGE = 20 * 20 = 400
  213. # 下载页设置
  214. TMPL_DOWNLOAD_PAGE_PATH = os.path.join(BASE_DIR, 'page/templates/page/download.tmpl.html').replace('\\', '/')
  215. PAI2_USER_DOWNLOAD_ADR_PAGE_PATH = os.path.join(BASE_DIR, 'page/templates/page/pai2_user_adr_download.html').replace('\\', '/')
  216. PAI2_USER_DOWNLOAD_IOS_PAGE_PATH = os.path.join(BASE_DIR, 'page/templates/page/pai2_user_ios_download.html').replace('\\', '/')
  217. PAI2_LENSMAN_DOWNLOAD_ADR_PAGE_PATH = os.path.join(BASE_DIR, 'page/templates/page/pai2_lensman_adr_download.html').replace('\\', '/')
  218. PAI2_LENSMAN_DOWNLOAD_IOS_PAGE_PATH = os.path.join(BASE_DIR, 'page/templates/page/pai2_lensman_ios_download.html').replace('\\', '/')
  219. PAI2_TOURGUIDE_DOWNLOAD_ADR_PAGE_PATH = os.path.join(BASE_DIR, 'page/templates/page/pai2_tourguide_adr_download.html').replace('\\', '/')
  220. PAI2_TOURGUIDE_DOWNLOAD_IOS_PAGE_PATH = os.path.join(BASE_DIR, 'page/templates/page/pai2_tourguide_ios_download.html').replace('\\', '/')
  221. # 下载设置
  222. PAI2_USER_DOWNLOAD_WX_URL = 'https://pai.ai'
  223. PAI2_USER_DOWNLOAD_IOS_URL = 'https://pai.ai'
  224. PAI2_LENSMAN_DOWNLOAD_WX_URL = 'https://pai.ai'
  225. PAI2_LENSMAN_DOWNLOAD_IOS_URL = 'https://pai.ai'
  226. PAI2_TOURGUIDE_DOWNLOAD_WX_URL = 'https://pai.ai'
  227. PAI2_TOURGUIDE_DOWNLOAD_IOS_URL = 'https://pai.ai'
  228. # 群组设置
  229. GROUP_PER_PAGE = 20 # 群组每页数量
  230. # 游客设置
  231. GUEST_USER_ID = 'guest'
  232. # 版本设置
  233. MIN_VERSION = '0.0.0'
  234. MAX_VERSION = '999.999.999'
  235. CURRENT_VERSION = '1.0.0'
  236. # 价格设置
  237. LENSMAN_PHOTO_HAGGLE_MAX_TIMES = 3 # 摄影师照片最大砍价次数
  238. # 订单设置
  239. ORDER_NUM_PER_PAGE = 10 # 订单每页数量
  240. # 域名设置
  241. DOMAIN = 'https://pai.ai'
  242. IMG_DOMAIN = 'https://img.pai.ai'
  243. API_DOMAIN = 'https://api.pai.ai'
  244. # 消息图片设置
  245. PAI2_LOGO_URL = DOMAIN + '/static/pai2/img/paiai_96_96.png'
  246. SYSTEM_MESSAGE_AVATAR = PAI2_LOGO_URL
  247. COMMENT_MESSAGE_AVATAR = PAI2_LOGO_URL
  248. THUMBUP_MESSAGE_AVATAR = PAI2_LOGO_URL
  249. MESSAGE_NUM_PER_PAGE = 10 # 消息每页数量
  250. LOGIT_BODY_FLAG = True
  251. LOGIT_RES_FLAG = True
  252. try:
  253. from local_settings import *
  254. except ImportError:
  255. pass
  256. try:
  257. from func_settings import redis_connect
  258. REDIS_CACHE = redis_connect(REDIS.get('default', {}))
  259. Q_CLUSTER = {
  260. 'name': 'pai2',
  261. 'workers': 8,
  262. 'recycle': 500,
  263. 'timeout': 60,
  264. 'compress': True,
  265. 'cpu_affinity': 1,
  266. 'save_limit': 250,
  267. 'queue_limit': 500,
  268. 'label': 'Django Q',
  269. 'redis_conn': REDIS_CACHE,
  270. }
  271. DJLOGIT = {
  272. 'level': 'DEBUG',
  273. 'class': 'rlog.RedisListHandler',
  274. 'redis_client': REDIS_CACHE,
  275. 'key': 'django:logit:pai2',
  276. 'formatter': 'verbose',
  277. }
  278. except ImportError:
  279. REDIS_CACHE = None
  280. # logger setting
  281. LOGGING = {
  282. 'version': 1,
  283. 'disable_existing_loggers': False,
  284. 'formatters': {
  285. 'verbose': {
  286. 'format': '%(levelname)s %(asctime)s %(module)s %(process)d %(thread)d %(message)s'
  287. },
  288. 'simple': {
  289. 'format': '%(levelname)s %(message)s'
  290. },
  291. },
  292. 'handlers': {
  293. 'logit': DJLOGIT,
  294. 'console': {
  295. 'level': 'DEBUG',
  296. 'class': 'logging.StreamHandler',
  297. 'formatter': 'verbose'
  298. },
  299. },
  300. 'loggers': {
  301. 'logit': {
  302. 'handlers': ['logit'],
  303. 'level': 'DEBUG',
  304. 'propagate': True,
  305. },
  306. 'console': {
  307. 'handlers': ['console'],
  308. 'level': 'DEBUG',
  309. 'propagate': True,
  310. },
  311. },
  312. }