公司django项目引入xadmin作为后台,在开发环境中访问没有问题。但是在生产环境中可以访问登录页面点击登录后一直卡住,看后台日志是登录成功后重定向一直在响应,每次响应时间大约都要十分钟左右,导致前端页面直接超时。
因为生产是布在docker中的,自己本地不是,各种尝试后本地都是可以的,最后发现唯一的区别就是生产不能访问外网,怀疑是xadmin请求了网络资源。
排除方法一:
在项目的静态文件中找到xadmin的静态文件夹右键-find in path,输入“http”,找到很多包含http://www.w3.org
的文件,怕删除后会有问题,先将包含的内容复制了,然后把所有的包含http://www.w3.org
的信息全删除。
排除方法二:
在adminx.py
文件中注册全局设置时配置了use_bootswatch = True
,调出主题菜单,显示更多主题。
class BaseSetting(object):
enable_themes = True
use_bootswatch = True
xadmin.site.register(views.BaseAdminView, BaseSetting)
跟踪源代码,发现/xadmin/plugins/themes.py
下的block_top_navmenu
方法,在use_bootswatch=True
的时候,就会使用httplib2
去加载http://bootswatch.com/api/3.json
这个网址。
# themes.py 源码
... ...
if self.use_bootswatch:
ex_themes = cache.get(THEME_CACHE_KEY)
if ex_themes:
themes.extend(json.loads(ex_themes))
else:
ex_themes = []
try:
h = httplib2.Http()
resp, content = h.request("https://bootswatch.com/api/3.json", 'GET', '',
headers={"Accept": "application/json", "User-Agent": self.request.META['HTTP_USER_AGENT']})
if six.PY3:
content = content.decode()
watch_themes = json.loads(content)['themes']
ex_themes.extend([
{'name': t['name'], 'description': t['description'],
'css': t['cssMin'], 'thumbnail': t['thumbnail']}
for t in watch_themes])
except Exception as e:
print(e)
cache.set(THEME_CACHE_KEY, json.dumps(ex_themes), 24 * 3600)
themes.extend(ex_themes)
... ...
最后删除use_bootswatch = True
重新发布,解决问题了。
备注:
调试过程中本地抓包时未抓取到请求外网的数据,其原因是xadmin使用了缓存并且设置过期时间为24小时,cache.set(THEME_CACHE_KEY, json.dumps(ex_themes), 24 * 3600)
,但是我的settings文件中是没有配置缓存信息的,查看源代码发现django要是没有配置缓存文件默认是使用本地内存缓存。
... ...
def _create_cache(backend, **kwargs):
try:
# Try to get the CACHES entry for the given backend name first
try:
conf = settings.CACHES[backend]
except KeyError:
try:
# Trying to import the given backend, in case it's a dotted path
import_string(backend)
except ImportError as e:
raise InvalidCacheBackendError("Could not find backend '%s': %s" % (
backend, e))
location = kwargs.pop('LOCATION', '')
params = kwargs
else:
params = conf.copy()
params.update(kwargs)
backend = params.pop('BACKEND')
location = params.pop('LOCATION', '')
backend_cls = import_string(backend)
except ImportError as e:
raise InvalidCacheBackendError(
"Could not find backend '%s': %s" % (backend, e))
print(backend) # 这里的backend是django.core.cache.backends.locmem.LocMemCache
return backend_cls(location, params)
... ...
版权声明:本文为linwow原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。