Commit 1a597f51f9e3469ee41b5bc9a422289c4872b033
1 parent
e11f60ade2
Exists in
master
add login token
Showing
6 changed files
with
105 additions
and
51 deletions
 
Show diff stats
decrators.py
| 1 | # coding: utf-8 | ||
| 2 | |||
| 3 | 
homepage/models.py
| 1 | # coding: utf-8 | 1 | # coding: utf-8 | 
| 2 | 2 | ||
| 3 | from django.db import models | 3 | from django.db import models | 
| 4 | 4 | ||
| 5 | from django.contrib.auth.models import AbstractUser | 5 | from django.contrib.auth.models import AbstractUser | 
| 6 | 6 | ||
| 7 | 7 | ||
| 8 | # 数据库表结构 | 8 | # 数据库表结构 | 
| 9 | class ForumUser(AbstractUser): | 9 | class ForumUser(AbstractUser): | 
| 10 | ''' | 10 | ''' | 
| 11 | django.contrib.auth.models.User 默认User类字段太少,用AbstractUser | 11 | django.contrib.auth.models.User 默认User类字段太少,用AbstractUser | 
| 12 | 自定义一个User类,增加字段 | 12 | 自定义一个User类,增加字段 | 
| 13 | ''' | 13 | ''' | 
| 14 | nickname = models.CharField(max_length=200, null=True, blank=True) | 14 | suid = models.IntegerField(u'uid') | 
| 15 | avatar = models.CharField(max_length=200, null=True, blank=True) # 头像 | 15 | user_name = models.CharField(u'用户名', max_length=20) | 
| 16 | signature = models.CharField(max_length=500, null=True, blank=True) # 签名 | 16 | level = models.IntegerField(u'level') | 
| 17 | location = models.CharField(max_length=200, null=True, blank=True) | 17 | create_time = models.DateTimeField() | 
| 18 | website = models.URLField(null=True, blank=True) | 18 | status = models.IntegerField() | 
| 19 | company = models.CharField(max_length=200, null=True, blank=True) | 19 | last_login_ip = models.CharField(max_length=20) | 
| 20 | role = models.IntegerField(null=True, blank=True) # 角色 | 20 | last_login_time = models.DateTimeField() | 
| 21 | balance = models.IntegerField(null=True, blank=True) # 余额 | ||
| 22 | reputation = models.IntegerField(null=True, blank=True) # 声誉 | ||
| 23 | self_intro = models.CharField(max_length=500, null=True, blank=True)# 自我介绍 | ||
| 24 | updated = models.DateTimeField(null=True, blank=True) | ||
| 25 | twitter = models.CharField(max_length=200, null=True, blank=True) | ||
| 26 | github = models.CharField(max_length=200, null=True, blank=True) | ||
| 27 | douban = models.CharField(max_length=200, null=True, blank=True) | ||
| 28 | 21 | ||
| 29 | def __unicode__(self): | 22 | def __unicode__(self): | 
| 30 | return self.username | 23 | return self.user_name | 
| 31 | 24 | ||
| 32 | class Meta(object): | 25 | class Meta(object): | 
| 33 | db_table = 'forum_forumuser' | 26 | db_table = 'sys_user' | 
| 34 | verbose_name = verbose_name_plural = u'用户' | 27 | verbose_name = verbose_name_plural = u'用户' | 
homepage/views.py
| 1 | 1 | ||
| 2 | 2 | ||
| 3 | import json | 3 | import json | 
| 4 | import logging | 4 | import logging | 
| 5 | import requests | ||
| 5 | from django.contrib import auth | 6 | from django.contrib import auth | 
| 6 | from django.contrib.auth import logout | 7 | from django.contrib.auth import logout | 
| 7 | from django.contrib.auth.decorators import login_required | 8 | from django.contrib.auth.decorators import login_required | 
| 8 | from django.http import HttpResponseRedirect | 9 | from django.http import HttpResponseRedirect | 
| 9 | from django.contrib.auth import get_user_model | 10 | from django.contrib.auth import get_user_model | 
| 10 | from django.shortcuts import render_to_response | 11 | from django.shortcuts import render_to_response | 
| 11 | from django.template import RequestContext | 12 | from django.template import RequestContext | 
| 12 | from django.template.context_processors import csrf | 13 | from django.template.context_processors import csrf | 
| 13 | from django.conf import settings | 14 | from django.conf import settings | 
| 14 | 15 | ||
| 15 | @login_required | 16 | @login_required | 
| 16 | def homepage(request): | 17 | def homepage(request): | 
| 17 | 18 | ||
| 18 | username = request.user.username | 19 | username = request.user.username | 
| 20 | import pdb; pdb.set_trace() | ||
| 19 | t = HttpResponseRedirect('/admin/') | 21 | t = HttpResponseRedirect('/admin/') | 
| 20 | t.set_cookie('username', username, 864000) | 22 | t.set_cookie('username', username, 864000) | 
| 21 | return t | 23 | return t | 
| 22 | 24 | ||
| 23 | 25 | ||
| 24 | def mylogin(request): | 26 | def mylogin(request): | 
| 25 | alert_msg= 0 | 27 | alert_msg= 0 | 
| 26 | if request.method =='GET': | 28 | if request.method =='GET': | 
| 27 | cookies_username = request.COOKIES.get('username','') | 29 | cookies_username = request.COOKIES.get('username','') | 
| 28 | c = csrf(request) | 30 | c = csrf(request) | 
| 29 | c.update({'alert_msg':alert_msg,'cookies_username:':cookies_username}) | 31 | c.update({'alert_msg':alert_msg,'cookies_username:':cookies_username}) | 
| 30 | return render_to_response('login.html', c) | 32 | return render_to_response('login.html', c) | 
| 31 | else: | 33 | else: | 
| 32 | postdata = request.POST | 34 | postdata = request.POST | 
| 33 | username = postdata.get('username','') | 35 | username = postdata.get('username','') | 
| 34 | password = postdata.get('password','') | 36 | password = postdata.get('password','') | 
| 35 | post_params = { | 37 | post_params = { | 
| 36 | 'comefrom': 2, | 38 | 'comefrom': 2, | 
| 37 | 'user_name': username, | 39 | 'user_name': username, | 
| 38 | 'password': password, | 40 | 'password': password, | 
| 39 | } | 41 | } | 
| 40 | resp = request.post(settings.AUTH_DOMAIN, data=post_params, verify=False) | 42 | resp = requests.post(settings.AUTH_DOMAIN, data=post_params, verify=False) | 
| 41 | if resp.status_code == 200: | 43 | if resp.status_code == 200: | 
| 42 | rst = resp.json() | 44 | rst = resp.json() | 
| 43 | if rst.get('status') == 1: | 45 | if rst.get('status') == 1: | 
| 44 | data = rst.get('data') | 46 | data = rst.get('data') | 
| 45 | token = data.get('token') | 47 | token = data.get('token') | 
| 46 | suid = data.get('1000') | 48 | suid = data.get('1000') | 
| 47 | t = HttpResponseRedirect('/admin/') | 49 | t = HttpResponseRedirect('/admin/') | 
| 48 | t.set_cookie('pu', username, 864000) | 50 | t.set_cookie('pu', token, 864000) | 
| 49 | t.set_cookie(('pt'), ) | 51 | t.set_cookie('pt', suid, 864000) | 
| 50 | 52 | t.set_cookie('username', username, 86400) | |
| 51 | else: | 53 | return t | 
| 52 | pass | 54 | |
| 53 | if user: | 55 | t = HttpResponseRedirect('/login/') | 
| 54 | auth.login(request, user) | ||
| 55 | t = HttpResponseRedirect('/admin/') | ||
| 56 | t.set_cookie('username', username, 864000) | ||
| 57 | return t | ||
| 58 | 56 | ||
| 59 | 57 | ||
| 60 | def mylogout(request): | 58 | def mylogout(request): | 
middlewares/__init__.py
middlewares/session_middleware.py
| 1 | # coding: utf-8 | 1 | # coding: utf-8 | 
| 2 | 2 | ||
| 3 | import requests | 3 | import requests | 
| 4 | from django.conf import settings | 4 | from django.conf import settings | 
| 5 | from django.core.cache import caches | 5 | from django.core.cache import caches | 
| 6 | from django.contrib.auth import get_user_model | 6 | from django.contrib.auth import get_user_model | 
| 7 | from django.contrib.auth.models import AnonymousUser | 7 | from django.contrib.auth.models import AnonymousUser | 
| 8 | 8 | ||
| 9 | class SessionWithoutLocalUserMiddleware(object): | 9 | class SessionWithoutLocalUserMiddleware(object): | 
| 10 | """ | 10 | """ | 
| 11 | 统一权限(认证)中间件,Django系统本地不保存用户的情况使用 | 11 | 统一权限(认证)中间件,Django系统本地不保存用户的情况使用 | 
| 12 | """ | 12 | """ | 
| 13 | 13 | ||
| 14 | def __init__(self): | 14 | def __init__(self): | 
| 15 | self.cache_alias = settings.CACHE_MIDDLEWARE_ALIAS | 15 | self.cache_alias = settings.CACHE_MIDDLEWARE_ALIAS | 
| 16 | self.cache = caches[self.cache_alias] | 16 | self.cache = caches[self.cache_alias] | 
| 17 | self.UserModel = get_user_model() | 17 | self.UserModel = get_user_model() | 
| 18 | 18 | ||
| 19 | def process_request(self, request): | 19 | def process_request(self, request): | 
| 20 | if hasattr(request, "user") and getattr(request.user, "is_superuser", False): | 20 | if hasattr(request, "user") and getattr(request.user, "is_superuser", False): | 
| 21 | # 对于Django系统的admin用户,这里不做任何处理 | 21 | # 对于Django系统的admin用户,这里不做任何处理 | 
| 22 | pass | 22 | pass | 
| 23 | else: | 23 | else: | 
| 24 | pt = request.COOKIES.get('pt') | 24 | pt = request.COOKIES.get('pt') | 
| 25 | pu = request.COOKIES.get('pu') | 25 | pu = request.COOKIES.get('pu') | 
| 26 | username = request.COOKIES.get('username') | ||
| 26 | if pt and pu: | 27 | if pt and pu: | 
| 27 | # 能拿到统一认证session的情况,优先从缓存中拿用户 | 28 | # 查询session状态成功的情况,构造QCCRUser | 
| 28 | user = self.cache.get(pu) | 29 | user = XYTUser(username, pu, pt) | 
| 29 | if not user: | ||
| 30 | # 如果缓存未命中,则直接调用统一权限,查询当前session的状态,构造用户,并存入缓存 | ||
| 31 | user_info = '' | ||
| 32 | |||
| 33 | manager = Manager() | ||
| 34 | user_info = manager.get_user_info(request) | ||
| 35 | if user_info is None: | ||
| 36 | # 查询session状态失败的情况,构造匿名用户 | ||
| 37 | user = AnonymousUser() | ||
| 38 | else: | ||
| 39 | # 查询session状态成功的情况,构造QCCRUser | ||
| 40 | user = user_info | ||
| 41 | self.cache.set(pt, user, 60) | ||
| 42 | request.user = user | 30 | request.user = user | 
| 43 | else: | 31 | else: | 
| 44 | # 拿不到统一认证的session,将当前用户设为匿名用户 | 32 | # 拿不到统一认证的session,将当前用户设为匿名用户 | 
| 45 | request.user = AnonymousUser() | 33 | request.user = AnonymousUser() | 
| 46 | 34 | ||
| 47 | 35 | ||
| 48 | class Manager(object): | 36 | class Manager(object): | 
| 49 | 37 | ||
| 50 | def __init__(self): | 38 | def __init__(self): | 
| 51 | self.auth_domain = 'https://api.xiuyetang.com/sys/user/login' | 39 | self.auth_domain = 'https://api.xiuyetang.com/sys/user/login' | 
| 52 | 40 | ||
| 53 | def get_user_info(self, request): | ||
| 54 | pass | ||
| 41 | |||
| 42 | class XYTUser(object): | ||
| 43 | id = None | ||
| 44 | pk = None | ||
| 45 | username = '' | ||
| 46 | sessionId = '' | ||
| 47 | accountNo = '' | ||
| 48 | employeeName = '' | ||
| 49 | employeeId = 0 | ||
| 50 | employeeNo = '' | ||
| 51 | employeeTel = '' | ||
| 52 | deptIds = '' | ||
| 53 | email = '' | ||
| 54 | entryTime = '' | ||
| 55 | uid = '' | ||
| 56 | is_staff = False | ||
| 57 | is_active = False | ||
| 58 | is_superuser = False | ||
| 59 | _groups = '' | ||
| 60 | _user_permissions = '' | ||
| 61 | |||
| 62 | def __init__(self, username, pu, pt): | ||
| 63 | self.username = username | ||
| 64 | self.id = pu | ||
| 65 | self.pk = pu | ||
| 66 | self.sessionId = pt | ||
| 67 | |||
| 68 | def __str__(self): | ||
| 69 | return self.username | ||
| 70 | |||
| 71 | def __eq__(self, other): | ||
| 72 | return self.username == other.username | ||
| 73 | |||
| 74 | def __ne__(self, other): | ||
| 75 | return not self.__eq__(other) | ||
| 76 | |||
| 77 | def __hash__(self): | ||
| 78 | return hash(self.username) | ||
| 79 | |||
| 80 | def save(self): | ||
| 81 | raise NotImplementedError("Django doesn't provide a DB representation for QCCRUser. User info in LDAP.") | ||
| 82 | |||
| 83 | def delete(self): | ||
| 84 | raise NotImplementedError("Django doesn't provide a DB representation for QCCRUser. User info in LDAP.") | ||
| 85 | |||
| 86 | def set_password(self, raw_password): | ||
| 87 | raise NotImplementedError("Django doesn't provide a DB representation for QCCRUser. Password in LDAP.") | ||
| 88 | |||
| 89 | def check_password(self, raw_password): | ||
| 90 | raise NotImplementedError("Django doesn't provide a DB representation for QCCRUser. Password in LDAP.") | ||
| 91 | |||
| 92 | def _get_groups(self): | ||
| 93 | return self._groups | ||
| 94 | |||
| 95 | groups = property(_get_groups) | ||
| 96 | |||
| 97 | def _get_user_permissions(self): | ||
| 98 | return self._user_permissions | ||
| 99 | 
weapp_sys/settings.py
| 1 | """ | 1 | """ | 
| 2 | Django settings for weapp_sys project. | 2 | Django settings for weapp_sys project. | 
| 3 | 3 | ||
| 4 | Generated by 'django-admin startproject' using Django 1.8. | 4 | Generated by 'django-admin startproject' using Django 1.8. | 
| 5 | 5 | ||
| 6 | For more information on this file, see | 6 | For more information on this file, see | 
| 7 | https://docs.djangoproject.com/en/1.8/topics/settings/ | 7 | https://docs.djangoproject.com/en/1.8/topics/settings/ | 
| 8 | 8 | ||
| 9 | For the full list of settings and their values, see | 9 | For the full list of settings and their values, see | 
| 10 | https://docs.djangoproject.com/en/1.8/ref/settings/ | 10 | https://docs.djangoproject.com/en/1.8/ref/settings/ | 
| 11 | """ | 11 | """ | 
| 12 | 12 | ||
| 13 | # Build paths inside the project like this: os.path.join(BASE_DIR, ...) | 13 | # Build paths inside the project like this: os.path.join(BASE_DIR, ...) | 
| 14 | import os | 14 | import os | 
| 15 | 15 | ||
| 16 | BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__))) | 16 | BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__))) | 
| 17 | 17 | ||
| 18 | 18 | ||
| 19 | # Quick-start development settings - unsuitable for production | 19 | # Quick-start development settings - unsuitable for production | 
| 20 | # See https://docs.djangoproject.com/en/1.8/howto/deployment/checklist/ | 20 | # See https://docs.djangoproject.com/en/1.8/howto/deployment/checklist/ | 
| 21 | 21 | ||
| 22 | # SECURITY WARNING: keep the secret key used in production secret! | 22 | # SECURITY WARNING: keep the secret key used in production secret! | 
| 23 | SECRET_KEY = 'y7m+ekd64@hxa0ej(&w6u!itch2glt)+6imlbr7ob8=_nk%@gi' | 23 | SECRET_KEY = 'y7m+ekd64@hxa0ej(&w6u!itch2glt)+6imlbr7ob8=_nk%@gi' | 
| 24 | 24 | ||
| 25 | # SECURITY WARNING: don't run with debug turned on in production! | 25 | # SECURITY WARNING: don't run with debug turned on in production! | 
| 26 | DEBUG = True | 26 | DEBUG = True | 
| 27 | 27 | ||
| 28 | ALLOWED_HOSTS = [] | 28 | ALLOWED_HOSTS = [] | 
| 29 | 29 | ||
| 30 | 30 | ||
| 31 | # Application definition | 31 | # Application definition | 
| 32 | 32 | ||
| 33 | INSTALLED_APPS = ( | 33 | INSTALLED_APPS = ( | 
| 34 | 'django.contrib.admin', | 34 | 'django.contrib.admin', | 
| 35 | 'django.contrib.auth', | 35 | 'django.contrib.auth', | 
| 36 | 'django.contrib.contenttypes', | 36 | 'django.contrib.contenttypes', | 
| 37 | 'django.contrib.sessions', | 37 | # 'django.contrib.sessions', | 
| 38 | 'django.contrib.messages', | 38 | 'django.contrib.messages', | 
| 39 | 'django.contrib.staticfiles', | 39 | 'django.contrib.staticfiles', | 
| 40 | 'homepage', | 40 | 'homepage', | 
| 41 | ) | 41 | ) | 
| 42 | 42 | ||
| 43 | MIDDLEWARE_CLASSES = ( | 43 | MIDDLEWARE_CLASSES = ( | 
| 44 | 'django.contrib.sessions.middleware.SessionMiddleware', | 44 | # 'django.contrib.sessions.middleware.SessionMiddleware', | 
| 45 | 'django.middleware.common.CommonMiddleware', | 45 | 'django.middleware.common.CommonMiddleware', | 
| 46 | 'django.middleware.csrf.CsrfViewMiddleware', | 46 | 'django.middleware.csrf.CsrfViewMiddleware', | 
| 47 | 'django.contrib.auth.middleware.AuthenticationMiddleware', | 47 | # 'django.contrib.auth.middleware.AuthenticationMiddleware', | 
| 48 | 'django.contrib.auth.middleware.SessionAuthenticationMiddleware', | 48 | # 'django.contrib.auth.middleware.SessionAuthenticationMiddleware', | 
| 49 | 'django.contrib.messages.middleware.MessageMiddleware', | 49 | # 'django.contrib.messages.middleware.MessageMiddleware', | 
| 50 | 'django.middleware.clickjacking.XFrameOptionsMiddleware', | 50 | 'django.middleware.clickjacking.XFrameOptionsMiddleware', | 
| 51 | 'django.middleware.security.SecurityMiddleware', | 51 | 'django.middleware.security.SecurityMiddleware', | 
| 52 | 'middlewares.session_middleware.SessionWithoutLocalUserMiddleware', | ||
| 52 | ) | 53 | ) | 
| 53 | 54 | ||
| 54 | ROOT_URLCONF = 'weapp_sys.urls' | 55 | ROOT_URLCONF = 'weapp_sys.urls' | 
| 55 | 56 | ||
| 56 | TEMPLATES = [ | 57 | TEMPLATES = [ | 
| 57 | { | 58 | { | 
| 58 | 'BACKEND': 'django.template.backends.django.DjangoTemplates', | 59 | 'BACKEND': 'django.template.backends.django.DjangoTemplates', | 
| 59 | 'DIRS': [os.path.join(BASE_DIR, 'templates')], | 60 | 'DIRS': [os.path.join(BASE_DIR, 'templates')], | 
| 60 | 'APP_DIRS': True, | 61 | 'APP_DIRS': True, | 
| 61 | 'OPTIONS': { | 62 | 'OPTIONS': { | 
| 62 | 'context_processors': [ | 63 | 'context_processors': [ | 
| 63 | 'django.template.context_processors.debug', | 64 | 'django.template.context_processors.debug', | 
| 64 | 'django.template.context_processors.request', | 65 | 'django.template.context_processors.request', | 
| 65 | 'django.contrib.auth.context_processors.auth', | 66 | 'django.contrib.auth.context_processors.auth', | 
| 66 | 'django.contrib.messages.context_processors.messages', | 67 | 'django.contrib.messages.context_processors.messages', | 
| 67 | ], | 68 | ], | 
| 68 | }, | 69 | }, | 
| 69 | }, | 70 | }, | 
| 70 | ] | 71 | ] | 
| 71 | 72 | ||
| 72 | 73 | ||
| 73 | WSGI_APPLICATION = 'weapp_sys.wsgi.application' | 74 | WSGI_APPLICATION = 'weapp_sys.wsgi.application' | 
| 74 | 75 | ||
| 75 | AUTH_USER_MODEL = 'homepage.ForumUser' | 76 | AUTH_USER_MODEL = 'homepage.ForumUser' | 
| 76 | 77 | ||
| 77 | # Database | 78 | # Database | 
| 78 | # https://docs.djangoproject.com/en/1.8/ref/settings/#databases | 79 | # https://docs.djangoproject.com/en/1.8/ref/settings/#databases | 
| 79 | 80 | ||
| 80 | DATABASES = { | 81 | DATABASES = { | 
| 81 | 'default': { | 82 | 'default': { | 
| 82 | 'ENGINE': 'django.db.backends.mysql', # Add 'postgresql_psycopg2', 'mysql', 'sqlite3' or 'oracle'. | 83 | 'ENGINE': 'django.db.backends.mysql', # Add 'postgresql_psycopg2', 'mysql', 'sqlite3' or 'oracle'. | 
| 83 | 'NAME': 'forum', # Or path to database file if using sqlite3. | 84 | 'NAME': 'forum', # Or path to database file if using sqlite3. | 
| 84 | # The following settings are not used with sqlite3: | 85 | # The following settings are not used with sqlite3: | 
| 85 | 'USER': 'root', | 86 | 'USER': 'root', | 
| 86 | 'PASSWORD': '', | 87 | 'PASSWORD': 'nineteen', | 
| 87 | 'HOST': '127.0.0.1', # Empty for localhost through domain sockets or '127.0.0.1' for localhost through TCP. | 88 | 'HOST': '121.40.31.31', # Empty for localhost through domain sockets or '127.0.0.1' for localhost through TCP. | 
| 88 | 'PORT': '3306', | 89 | 'PORT': '3306', | 
| 89 | } | 90 | } | 
| 90 | } | 91 | } | 
| 91 | 92 | ||
| 92 | 93 | ||
| 93 | # Internationalization | 94 | # Internationalization | 
| 94 | # https://docs.djangoproject.com/en/1.8/topics/i18n/ | 95 | # https://docs.djangoproject.com/en/1.8/topics/i18n/ | 
| 95 | 96 | ||
| 96 | LANGUAGE_CODE = 'zh-CN' | 97 | LANGUAGE_CODE = 'zh-CN' | 
| 97 | 98 | ||
| 98 | TIME_ZONE = 'Asia/Shanghai' | 99 | TIME_ZONE = 'Asia/Shanghai' | 
| 99 | 100 | ||
| 100 | USE_I18N = True | 101 | USE_I18N = True | 
| 101 | 102 | ||
| 102 | USE_L10N = True | 103 | USE_L10N = True | 
| 103 | 104 | ||
| 104 | USE_TZ = False | 105 | USE_TZ = False | 
| 105 | 106 | ||
| 106 | DATETIME_FORMAT = 'Y-m-d H:i:s' | 107 | DATETIME_FORMAT = 'Y-m-d H:i:s' | 
| 107 | TIME_FORMAT = 'H:i:s' | 108 | TIME_FORMAT = 'H:i:s' | 
| 108 | 109 | ||
| 109 | 110 | ||
| 110 | STATIC_ROOT = os.path.join(BASE_DIR, 'static') | 111 | STATIC_ROOT = os.path.join(BASE_DIR, 'static') | 
| 111 | STATIC_URL = '/static/' | 112 | STATIC_URL = '/static/' | 
| 112 | STATICFILES_DIRS = ( | 113 | STATICFILES_DIRS = ( | 
| 113 | # Put strings here, like "/home/html/static" or "C:/www/django/static". | 114 | # Put strings here, like "/home/html/static" or "C:/www/django/static". | 
| 114 | # Always use forward slashes, even on Windows. | 115 | # Always use forward slashes, even on Windows. | 
| 115 | # Don't forget to use absolute paths, not relative paths. | 116 | # Don't forget to use absolute paths, not relative paths. | 
| 116 | 117 | ||
| 117 | # ("css", os.path.join(STATIC_ROOT,'css')), | 118 | # ("css", os.path.join(STATIC_ROOT,'css')), | 
| 118 | ("js", os.path.join(STATIC_ROOT, 'js')), | 119 | ("js", os.path.join(STATIC_ROOT, 'js')), | 
| 119 | ("image", os.path.join(STATIC_ROOT, 'image')), | 120 | ("image", os.path.join(STATIC_ROOT, 'image')), | 
| 120 | ("css", os.path.join(STATIC_ROOT, 'css')), | 121 | ("css", os.path.join(STATIC_ROOT, 'css')), | 
| 121 | ("dist", os.path.join(STATIC_ROOT, 'dist')), | 122 | ("dist", os.path.join(STATIC_ROOT, 'dist')), | 
| 122 | ("plugins", os.path.join(STATIC_ROOT, 'plugins')), | 123 | ("plugins", os.path.join(STATIC_ROOT, 'plugins')), | 
| 123 | ("fonts", os.path.join(STATIC_ROOT, 'fonts')), | 124 | ("fonts", os.path.join(STATIC_ROOT, 'fonts')), | 
| 124 | ("font-awesome", os.path.join(STATIC_ROOT, 'font-awesome')), | 125 | ("font-awesome", os.path.join(STATIC_ROOT, 'font-awesome')), | 
| 125 | ("img", os.path.join(STATIC_ROOT, 'img')), | 126 | ("img", os.path.join(STATIC_ROOT, 'img')), | 
| 126 | ("bootstrap", os.path.join(STATIC_ROOT, 'bootstrap')), | 127 | ("bootstrap", os.path.join(STATIC_ROOT, 'bootstrap')), | 
| 127 | ("apps/ueditor", os.path.join(STATIC_ROOT, 'ueditor')), | 128 | ("apps/ueditor", os.path.join(STATIC_ROOT, 'ueditor')), | 
| 128 | ("echarts", os.path.join(STATIC_ROOT, 'echarts')), | 129 | ("echarts", os.path.join(STATIC_ROOT, 'echarts')), | 
| 129 | ("ueditor", os.path.join(STATIC_ROOT, 'ueditor')), | 130 | ("ueditor", os.path.join(STATIC_ROOT, 'ueditor')), | 
| 130 | ("ventor", os.path.join(STATIC_ROOT, 'ventor')), | 131 | ("ventor", os.path.join(STATIC_ROOT, 'ventor')), | 
| 131 | ) | 132 | ) | 
| 132 | 133 | ||
| 133 | 134 | ||
| 134 | BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__))) | 135 | BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__))) | 
| 135 | MEDIA_ROOT = os.path.join(BASE_DIR, 'media') | 136 | MEDIA_ROOT = os.path.join(BASE_DIR, 'media') | 
| 136 | MEDIA_URL = '/media/' | 137 | MEDIA_URL = '/media/' | 
| 137 | 138 | ||
| 138 | LOGIN_URL = '/login/' | 139 | LOGIN_URL = '/login/' | 
| 139 | 140 | ||
| 140 | AUTH_DOMAIN = 'https://api.xiuyetang.com/sys/user/login' | 141 | AUTH_DOMAIN = 'https://api.xiuyetang.com/sys/user/login' |