【发布时间】:2010-10-20 00:14:07
【问题描述】:
我遇到了奇怪的问题 - 我希望以前有人遇到过类似的问题。
我正在尝试缓存来自通过通配符连接到我的 django 应用程序“example.com”的不同子域的内容。
所以当我到达 subdomain1.example.com 时。我在视图中运行与 excample.com 不同的代码 - 像这里这样的简单中间件:Django caching for subdomains
当我同时刷新来自不同域的页面时(例如,使用不同的选项卡浏览器),事情就出错了。结果产生最后刷新页面的输出。而且这种行为不依赖于 IP(如果其他人在您进入主页的同时进入其他子域,您将获得该子域内容)。
如果我先等待加载页面,然后我会转到其他所有内容都已正确加载:|
如果我关闭缓存,问题就不存在了。
我的软规格:
- Ubuntu 8.04 LTS
- Apache + mod-wsgi
- 线程 10 个进程未定义 multiprocess=false
- Django 1.23
- 文件缓存后端
中间件:
class Subdomains:
def process_request(self, request):
u'''
przekierowuje na stronę główną, jeżeli subdomena z której weszliśmy nie jest subdomeną miasta znajdującego się w bazie. Oraz ustawia zmienną request.META['city']!
'''
city = get_city_from_host(request.get_host())
request.city=None
if city:
try:
city = City.objects.filter(slug__exact=city)
request.city=city[0].slug
except:
return HttpResponsePermanentRedirect(ROOT_URL)
查看:
def post_data(request,address,id):
url_root = settings.ROOT_URL
city_subdomain = request.city
if city_subdomain:
random_posts = Post.objects.filter(city__slug=city_subdomain).order_by('?')
if random_posts.count() <= 10:
pass
else:
random_posts = random_posts[:10]
city = City.objects.filter(slug__exact = city_subdomain)[0]
try:
post = Post.objects.get(id = int(id), city__slug__exact=city.slug)
nearestinposts = post.nearestinpost_set.select_related(depth=2).all()
return render_to_response('post_data.html', locals())
except:
return HttpResponsePermanentRedirect('http://%s.%s/' % (city_subdomain, settings.ROOT_URL))
return HttpResponsePermanentRedirect('http://%s' % settings.ROOT_URL)
SETTINGS.PY
CACHE_BACKEND = 'file://%s/cache/' % PROJECT_DIR
CACHE_MIDDLEWARE_SECONDS = 6000
CACHE_MIDDLEWARE_ANONYMOUS_ONLY = True
MIDDLEWARE_CLASSES = (
'django.middleware.cache.UpdateCacheMiddleware',
'middleware.default.Subdomains',
'django.middleware.common.CommonMiddleware',
'django.contrib.sessions.middleware.SessionMiddleware',
'django.middleware.csrf.CsrfViewMiddleware',
'django.contrib.auth.middleware.AuthenticationMiddleware',
'django.contrib.messages.middleware.MessageMiddleware',
'django.middleware.cache.FetchFromCacheMiddleware',
)
要修改 CACHE_KEY,我使用 hack:Django caching for subdomains
【问题讨论】:
-
您需要显示视图的代码以及如何缓存它。
-
我猜您正在为所有子域使用单个缓存。在这种情况下,将子域添加为缓存键的前缀。否则不同的子域会覆盖彼此的缓存项。
-
@OmerGertel:我使用了不同的方法来更改 CACHE_KEY - 以 stackoverflow.com/questions/772050/… 结尾。而且我一开始就运行了这个问题:) 现在,当我不同时提出请求时,一切都很好——我得到了不同的内容。我想知道 Apache / mod_wsgi 是否未以某种方式配置以干扰 django 缓存 - 我必须检查标头。
-
@Daniel 我刚刚添加了一些代码 :)
-
哦,我差点忘了 - 在我的开发服务器上一切正常:|我可以在多个选项卡中多次推送刷新 - 也许是线程/进程问题?我猜DEV服务器是一个进程和线程?